Hi Ken,

yes, I do check the return values also for the
sqlite3_prepare_v2 call. This is allways
successful, the first sqlite_step call right after
this one returns the magic MISSUSE.

Yes, I also tried to call sqlite_reset right
after this first error and in this case
sqlite_reset return the LOCK state. I didn't
yet go on to handle this...

I can't post the code of the original implementation here,
but also for my debugging and tests I'll produce
a simplified test application. Just to see if that
can be used to reproduce the effect. If that one runs
without any problem, it's my fault, if not: I'll post
it here for further discussions... ;)

Thanks for your feedback

Marcus


>
> Marcus,
>
> I'm not sure if this will help or not...
>
> But I noticed your sample code does not test the return value from the
> sqlite3_prepare_v2 call. Could the code be entering the do  loop when an
> error was returned from prepare?
>
> Just an idea.
>
> Have you tried the reset call as DRH had suggested?
> Your prior post indicated you had more code and another loop. Can you post
> the full code for both loops?
>
> HTH
>
>
>
> --- On Wed, 3/4/09, Marcus Grimm <mgr...@medcom-online.de> wrote:
>
>> From: Marcus Grimm <mgr...@medcom-online.de>
>> Subject: Re: [sqlite] shared cache and SQLITE_MISUSE on sqlite3_step()
>> To: kennethinbox-sql...@yahoo.com, "General Discussion of SQLite
>> Database" <sqlite-users@sqlite.org>
>> Date: Wednesday, March 4, 2009, 4:31 PM
>> Ken,
>>
>> you are of course right that it needs some checks
>> for locks and busy states. I left that out to
>> simplify the code given below. My original code
>> checks that and it usually works quite well.
>> that's basically the reason why I was puzzled
>> by the randomly MISUSE results after I added the shared
>> cache.
>>
>> I'm not yet finished with my debugging since it is a
>> multithreading/collision issue - ugly to trace.
>>
>> My feeling is that it is related to the condition when
>> one thread is attempting or holding an exclusive lock
>> while another thread is just doing an sqlite_step (read
>> only)
>> on an allready created statement. Both threads use their
>> own
>> DB connections. For example: when I do a sqlite_reset
>> right after sqlite_step returns SQLITE_MISUSE, as Richard
>> suggest,
>> I get immediately a SQLITE_LOCK return code from
>> sqlite_reset in this case. Why I didn't get that before
>> or
>> from the sqlite_prepare ?
>>
>> Anyway, I'm going on to workaround this.... ALso I
>> would like
>> to mention once more that it is only during an artificial
>> stress
>> test, mainly to verify my implementation. Under normal
>> usercondition it is very unlikely to happend and sqlite
>> works perfect as expected.
>>
>> Thanks
>>
>> Marcus
>>
>> >
>> > Marcus,
>> >
>> > You might want to also add some checks in for
>> sqlite_busy as on the result
>> > of the prepare and the first call to sqlite_step.
>> >
>> >
>> > On the inner loop test for the most common case first
>> (SQLITE_ROW) then
>> > test for errors... Slight performance improvement...
>> >
>> >
>> > --- On Wed, 3/4/09, Marcus Grimm
>> <mgr...@medcom-online.de> wrote:
>> >
>> >> From: Marcus Grimm <mgr...@medcom-online.de>
>> >> Subject: Re: [sqlite] shared cache and
>> SQLITE_MISUSE on sqlite3_step()
>> >> To: "General Discussion of SQLite
>> Database" <sqlite-users@sqlite.org>
>> >> Date: Wednesday, March 4, 2009, 10:25 AM
>> >> Richard, thanks again for the feedback.
>> >>
>> >> However, I don't see how it can happend that
>> the
>> >> statement
>> >> is completed internally without returning
>> SQLITE_DONE.
>> >> In the particular code of the "reading
>> thread" I
>> >> do something like:
>> >>
>> >> --
>> >> sqlite3_prepare_v2(db, "SELECT * FROM
>> TableA",
>> >> -1, &stmt, 0);
>> >> /** step throu table result **/
>> >> do
>> >> {
>> >>    rc = sqlite3_step(stmt);
>> >>    if( rc == SQLITE_MISUSE )
>> >>    {  fprintf(stderr, "ERROR...\n");
>> break; }
>> >>    else
>> >>    if( rc == SQLITE_ROW )
>> >>      read_data_etc();
>> >>    else
>> >>      break;
>> >> }while( rc != SQLITE_DONE );
>> >>
>> >> sqlite3_finalize(stmt);
>> >> --
>> >>
>> >> The prepare statement pointer is defined locally
>> and no
>> >> other
>> >> thread can access it, except sqlite internal
>> maybe.
>> >> To me it looks that in case a parallel thread is
>> inserting
>> >> or
>> >> updating data, the above loop is somehow affected
>> and
>> >> returns the
>> >> MISUSE.
>> >>
>> >> Your reply so far indicates either a bug on my
>> side or a
>> >> missusage.
>> >> I'll go on and try to find the reason why the
>> magic
>> >> number is resetted
>> >> without knowing from calling functions.
>> >>
>> >> calling sqlite3_reset in these cases is difficult
>> for me
>> >> since it might
>> >> not be the first step and previous data is
>> allready in use
>> >> in the upper loop.
>> >> But maybe an option for the very first step if
>> that
>> >> fails... hm... I'll try that.
>> >>
>> >>
>> >> Thanks again
>> >>
>> >> kind regards
>> >>
>> >> Marcus Grimm
>> >>
>> >>
>> >>
>> >> D. Richard Hipp wrote:
>> >> > On Mar 4, 2009, at 9:35 AM, Marcus Grimm
>> wrote:
>> >> >
>> >> >> hi,
>> >> >>
>> >> >> OK, the value of p->magic is 519C2973
>> >> (VDBE_MAGIC_HALT)
>> >> >
>> >> > That means the prepared statement has run to
>> >> completion and needs to
>> >> > be reset using sqlite3_reset() before you
>> continue.
>> >> >
>> >> > D. Richard Hipp
>> >> > d...@hwaci.com
>> >> >
>> >> >
>> >> >
>> >> >
>> _______________________________________________
>> >> > 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
>> > _______________________________________________
>> > 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