Jay Sprenkle wrote:
> Here's some example code:
>
> sqlite3* db;
>
> // connect to database
> if ( sqlite3_open( "test.db", &db ) )
> throw "Can't open database";
>
> char* sql;
>
> // two forms of the same sql
> sql = "SELECT one.test1, two.test2"
> " FROM one"
> " INNER JOIN two ON one.id = two.id"
> ;
> sqlite3_stmt* pStmt;
>
> if ( sqlite3_prepare( db, sql, strlen(sql), &pStmt, NULL ) != SQLITE_OK )
> {
> string str = "Cannot prepare sql: ";
> str += sql[t];
> str += ", Error: ";
> str += sqlite3_errmsg(db);
> throw str.c_str();
> }
>
> bool Loop = true;
> while ( Loop )
> switch ( sqlite3_step( pStmt ) )
> {
> case SQLITE_ROW:
> // retrieve the results
> char* p = (char *) sqlite3_column_text( pStmt, 0 );
> string test1 = string( p ? p : "" );
>
> p = (char *) sqlite3_column_text( pStmt, 1 );
> string test2 = string( p ? p : "" );
>
> break;
> case SQLITE_DONE:
> Loop = false;
> break;
> case SQLITE_BUSY:
> case SQLITE_LOCKED:
> default:
> string str = "Cannot execute sql: ";
> str += sql[t];
> str += ", Error: ";
> str += sqlite3_errmsg(db);
> throw str.c_str();
> break;
> }
>
> // clean up when finished
> sqlite3_finalize( pStmt );
>
> sqlite3_close( db );
Jay, thank you very much man! That answers a lot. And it showed me that
I was not checking the SQLITE_LOCKED case.
But, from what I can see, if your database is busy or locked you just
stop your program execution, or you will end this function WITHOUT
running neither sqlite3_finalize nor sqlite3_close. Either way you will
have a memory leak and this is not a good thing when you're running an
daemon (my case).
What if you put an loop = false instead of the throw at the 'default'
case? Do you have to you use sqlite3_interrupt before sqlite3_finalize?
Best regards,
Daniel Colchete