Thanks for your answers,
but that still don't explain me which method is the best to manage Busy
statement, to do a loop or to use a busy callback. And as I'm very curious,
especially why one method is better than the other. :)
Thanks,
Ludovic
On 3/5/06, John Stanton <[EMAIL PROTECTED]> wrote:
>
> I have a several of suggestions for that busy logic.
> 1. Perform a "yield()" or Win sleep(0) to give up the current
> timeslice and thus have a busy wait with as little system impact
> as possible but fastest turnaround. An upper limit of 100 probes
> before failing as deadlocked seems to be reasonable with that
> approach.
> 2. Launch a "reset" call to restart the sqlite3_step on finding
> a BUSY to make sure that deadlock situations are broken by
> brute force, with all but one process yielding control.
> 3. If the contention comes from competing threads within a process
> or competing processes in an application, define a semaphore or
> similar appropriate lock to synchronize each database and avoid the
> possibility of ever having a BUSY. In windows it looks like this
> sqlite3_prep
> sqlite3_bind
> WaitOnSingleEvent
> sqlite3_step
> ....
> SetEvent
> This is a lower overhead, higher performance and generally more
> elegant approach than polling. It does however assume that there
> are co-operating threads and processes.
> JS
>
> Jay Sprenkle wrote:
> > On 3/3/06, Ludovic Ferrandis <[EMAIL PROTECTED]> wrote:
> >
> >>I want to manage the SQLITE_BUSY error like this: If it fails, sleep X
> >>ms then try the command Y times. I found 2 ways to do it:
> >
> >
> > I do it using sqlite3_step(); Using bound variables and step eliminates
> the need
> > for escaping string data and prevents SQL injection attacks. I retry
> > the statement
> > up to 10 times in case another process has locked the database.
> > Psuedo code looks like this:
> >
> > // open database
> > dbOpen();
> >
> > // Get configuration information for this website instance
> > string sql = "SELECT blah"
> > " FROM Setup"
> > ;
> >
> > // prepare statement instead of building it to avoid sql injection
> attacks
> > if ( ! dbPrep( sql ) )
> > throw ConException( string("Cannot prepare sql: ") + sql +
> > string(", ") + + sqlite3_errmsg(db) );
> >
> > bool loop = true;
> > for ( int i = 0; ( i < 10 ) && ( loop ); i++ )
> > switch ( dbStep() )
> > {
> > // if database busy wait for a short time
> > // to see if it becomes available
> > case SQLITE_BUSY:
> > case SQLITE_LOCKED:
> > break;
> > case SQLITE_ROW:
> > // get results ( 0 based index!!! )
> > blah = dbColumn( 0 );
> > break;
> > case SQLITE_DONE:
> > if ( CookieUser.empty() )
> > throw ConException( string("Invalid configuration") );
> > loop = false;
> > break;
> > default:
> > throw ConException( string("Cannot execute sql: ") + sql );
> > break;
> > }
> >
> > // clean up when finished
> > dbFinalize();
> > dbClose();
>
>