> there is problem when getting data by sqlite3's c apis in signal-handling
> func.
What problem?
And as a hint: are you sure that your SQLite is in correct
thread-safety mode and you're not trying to dead-lock your
application?
Pavel
On Mon, Jul 6, 2009 at 9:58 PM, liubin liu<7101...@sina.com> wrote:
>
> there is problem when getting data by sqlite3's c apis in signal-handling
> func.
>
>
> _
>
>
> #include // for printf()
> #include // for signal()
> #include // for alarm()
> #include // for system()
> #include // for sqlite3_***
>
>
>
> sqlite3 *db = NULL;
>
>
> int sqlite3_helper_create_db (void);
>
>
> int sqlite3_helper_insert_data (void);
>
>
> // psf - sqlite3_prepare_v2()+sqlite3_step()+sqlite3_finalize()
> int sqlite3_helper_get_data_psf_from_tb1 ( int id );
>
> void timer_handler()
> {
> printf ( "# IN timer_handler()\n" );
>
>
> int ret = -1;
> int i = 9;
>
> char *query_format2 = "SELECT * FROM ts2 WHERE id=%d;";
> char *query_string = NULL;
>
>
> sqlite3_stmt *p_stmt = NULL;
>
> printf ( "# IN timer_handler(), ago sqlite3_mprintf()\n" );
> query_string = sqlite3_mprintf ( query_format2, i%500 );
>
> printf ( "# IN timer_handler(), ago sqlite3_prepare_v2()\n" );
> ret = sqlite3_prepare_v2 ( db, query_string, -1, _stmt, NULL );
> printf ( "# IN timer_handler(), ago sqlite3_step()\n" );
> ret = sqlite3_step ( p_stmt );
> printf ( "# IN timer_handler(), ago printf()\n" );
> if ( SQLITE_ROW == ret )
> printf ( "# IN timer_handler(), id: %d, length: %d\n",
> sqlite3_column_int( p_stmt, 0 ), sqlite3_column_int( p_stmt, 1 ) );
> printf ( "# IN timer_handler(), ago sqlite3_free_table()\n" );
> sqlite3_finalize ( p_stmt );
>
>
> alarm(1);
> }
>
> int inittimer()
> {
> signal ( SIGALRM, timer_handler );
> alarm(1);
> return 0;
> }
>
>
> int main ( void )
> {
> int ret = -1;
> int i = 0;
>
>
> // open db file
> ret = sqlite3_open ( "testsignal.db", );
>
> // create tables: ts1 and ts2
> sqlite3_helper_create_db ();
>
> // insert datas into the tables(ts1)
> sqlite3_helper_insert_data ();
>
> // init the timer
> ret = inittimer();
>
> // get datas from table ts1
> for ( i=0; ; i++ )
> ret = sqlite3_helper_get_data_psf_from_tb1 ( i );
>
> // close db file
> ret = sqlite3_close ( db );
>
> // get the num of records
> system ( "sqlite3 testsignal.db \"SELECT COUNT(*) FROM ts1;\"" );
>
> // delete db file
> //system ( "rm testsignal.db -rf" );
>
> return 0;
> }
>
>
> int sqlite3_helper_create_db (void)
> {
> int ret = -1;
> char *cr_tb1 = "CREATE TABLE ts1 (id INTEGER PRIMARY KEY, length
> INTEGER, data CHAR(50));";
> char *cr_tb2 = "CREATE TABLE ts2 (id INTEGER PRIMARY KEY, length
> INTEGER, data CHAR(50));";
>
> ret = sqlite3_exec ( db, cr_tb1, NULL, NULL, NULL );
> //printf ( "ret: %d\n", ret );
> ret = sqlite3_exec ( db, cr_tb2, NULL, NULL, NULL );
> //printf ( "ret: %d\n", ret );
> if ( SQLITE_OK == ret )
> printf ( "# IN main(), create tables, DONE~\n" );
>
>
> return 0;
> }
>
>
> int sqlite3_helper_insert_data (void)
> {
> int ret = -1;
> int i = 0;
>
> sqlite3_stmt *p_stmt = NULL;
>
>
> char *sql_format1 = "INSERT OR REPLACE INTO ts1 (id, length, data)
> VALUES (%d, %d, %Q);";
> char *sql_format2 = "INSERT OR REPLACE INTO ts2 (id, length, data)
> VALUES (%d, %d, %Q);";
> char *sql = NULL;
>
>
> ret = sqlite3_exec ( db, "BEGIN", NULL, NULL, NULL );
> for ( i=0; i<500; i++ )
> {
> sql = sqlite3_mprintf ( sql_format1, i, i%10,
> "datadatadatadatadatadatadatadatadatadatadata" );
> ret = sqlite3_prepare_v2 ( db, sql, -1, _stmt, NULL );
> ret = sqlite3_step ( p_stmt );
> sqlite3_free ( sql );
> ret = sqlite3_finalize ( p_stmt );
>
> sql = sqlite3_mprintf ( sql_format2, i, i%10,
> "datadatadatadatadatadatadatadatadatadatadata" );
> ret = sqlite3_prepare_v2 ( db, sql, -1, _stmt, NULL );
> ret = sqlite3_step ( p_stmt );
> sqlite3_free ( sql );
> ret = sqlite3_finalize ( p_stmt );
> }
> ret = sqlite3_exec ( db, "COMMIT", NULL, NULL, NULL );
> if ( SQLITE_OK == ret )
> printf ( "# IN main(), insert datas, DONE~\n" );
>
> return 0;
> }
>
>
> int sqlite3_helper_get_data_psf_from_tb1 ( int id )
> {
> int ret = -1;
>
> sqlite3_stmt *p_stmt = NULL;
>
>
> char *query_format1 = "SELECT * FROM ts1 WHERE id=%d;";
> char *query_string = NULL;
>
> query_string = sqlite3_mprintf ( query_format1, id%500 );
> ret = sqlite3_prepare_v2 ( db, query_string, -1, _stmt, NULL );
> ret = sqlite3_step ( p_stmt );
> if ( SQLITE_ROW == ret )
> printf ( "# IN main(), id: %d, length: %d\n", sqlite3_column_int(
> p_stmt, 0 ), sqlite3_column_int( p_stmt, 1 ) );
> sqlite3_finalize ( p_stmt );
>
> return 0;
> }
>
>
> --
> View