Would forking another process as a worker process be acceptable, then
in your main message loop wait for some IPC signal saying it is done?
Unless you are doing this on some extremely lightweight OS / monitor
that doesn't implement the concept of time-sharing, I can't see how
this would be hard to do.

On Mon, Jun 22, 2009 at 8:23 PM, João Eiras<joao.ei...@gmail.com> wrote:
> On , Dan <danielk1...@gmail.com> wrote:
>
>>> My doubt is the following: if from the progress callback (set with
>>> sqlite3_progress_handler) I return non 0 and therefore I get
>>> SQLITE_INTERRUPT from the call to sqlite3_step, is the sqlite3_stmt
>>> object still in a valid state and will the query resume normally if I
>>> pass the same sqlite3_stmt object back to sqlite3_step again ?
>>
>> No. Next call on the statement handle should be sqlite3_reset() or
>> sqlite3_finalize().
>>
>
> I have tested it and I clearly confirm your comment :)
>
> On , Roger Binns <rog...@rogerbinns.com> wrote:
>
>> Why don't you call the main message loop from within the progress
>> handler callback?
>>
>
> Unfortunately, it's not that simple. The message loop loops both UI messages 
> and customs messages internal to the application. For instance, I keep track 
> of a sql statement in a object. The statement evolves after that object being 
> affected a few times by execution messages. This way everything has their 
> share of CPU and the ui works, while not relying on threading, because 
> threading would require architectural and design changes in the application.
> However, this is also one of the downfalls. I can have an arbitrary amount of 
> sqlite databases open, and if I run the message loop inside the progress 
> handler, I can theoretically have infinite reentrancy, where one progress 
> handler executes something on a different database, being in practice limited 
> by stack size, which would cause a crash.
> Also, requesting the message loop to run has its performance penalty, so it 
> lags the query a bit more than what's ideal.
>
> Thank you for those suggestions, but I have though of many other options, 
> those included.
>
>
> So, today I was looking around the sqlite code and try to make this a 
> reality, which is after interrupting a statement with a progress callback, 
> leaving the sqlite3_stmt object in a state that can be resumed with another 
> sqlite3_step call.
> It turned out a few lines of code fix, but however it had a side effect. 
> Internally, sqlite uses sqlite3_exec function and editing the code around 
> those calls to store state to allow sqlite3_exec to be suspendable as well is 
> not trivial nor simple. But I'm not using sqlite3_exec on my application, so 
> I just editied this function on my local tree to set the progress handler to 
> null and restore it in the end.
>
> I code I needed to change to allow sqlite3_step to resume was just the 
> following in file vdbe.c around line 5285, in function sqlite3VdbeExec:
>
>   vdbe_error_halt:
>     assert( rc );
>     p->rc = rc;
> +   if (rc != SQLITE_INTERRUPT){
>       sqlite3VdbeHalt(p);
> -
> +   }
> +   else
> +   {
> +       p->nCallback++;
> +       p->pc = pc;
> +   }
>     if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1;
>     rc = SQLITE_ERROR;
>
>
> This is probably not enough, and could even had some side effects, none of 
> which I encountered, because I have my own test suite for my own cases.
>
> The question then becomes, would sqlite be able to support such thing in the 
> future (suspending/resuming) ?
>
> Thank you for your attention.
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to