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();