does it mean that the sqlite3's C-api isn't reentrant or thread-safety?
____________________________________________________________ #include <stdio.h> // for printf() #include <signal.h> // for signal() #include <unistd.h> // for alarm() #include <stdlib.h> // for system() #include <pthread.h> // for pthread_create() #include <sqlite3.h> // for sqlite3_*** sqlite3 *db = NULL; int timer_handle_mark1 = 0; int timer_handle_mark2 = 9; pthread_t trd1; void trd1_task ( void ); int sqlite3_helper_create_db (void); int sqlite3_helper_insert_data (void); // psf - prepare, step, finalize int sqlite3_helper_get_data_psf_from_tb1 ( int id ); void timer_handler() { int ret = -1; int i = 9; char *query_format2 = "SELECT * FROM ts2 WHERE id=%d;"; char *query_string = NULL; sqlite3_stmt *p_stmt = NULL; timer_handle_mark2 = 0; query_string = sqlite3_mprintf ( query_format2, i%500 ); timer_handle_mark1++; timer_handle_mark2 = 1; ret = sqlite3_prepare_v2 ( db, query_string, -1, &p_stmt, NULL ); timer_handle_mark1++; timer_handle_mark2 = 2; ret = sqlite3_step ( p_stmt ); timer_handle_mark1++; //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 ) ); timer_handle_mark2 = 3; sqlite3_finalize ( p_stmt ); timer_handle_mark1++; alarm(1); } int inittimer() { signal ( SIGALRM, timer_handler ); alarm(1); return 0; } void trd1_task ( void ) { sleep (30); printf ( "# IN thread 1, after 30 seconds, timer_handle_mark1: %d, timer_handle_mark2: %d\n", timer_handle_mark1, timer_handle_mark2 ); sleep (50); printf ( "# IN thread 1, after 50 seconds, timer_handle_mark1: %d, timer_handle_mark2: %d\n", timer_handle_mark1, timer_handle_mark2 ); } int main ( void ) { int ret = -1; int i = 0; ret = pthread_create ( &trd1, 0, (void *)trd1_task, 0 ); ret = sqlite3_open ( "testsignal.db", &db ); sqlite3_helper_create_db (); sqlite3_helper_insert_data (); ret = inittimer(); for ( i=0; ; i++ ) ret = sqlite3_helper_get_data_psf_from_tb1 ( i ); ret = sqlite3_close ( db ); system ( "sqlite3 testsignal.db \"SELECT COUNT(*) FROM ts1;\"" ); 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 db file, SUCCESS!\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, &p_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, &p_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 data, SUCCESS!\n" ); return 0; } int sqlite3_helper_get_data_gt_from_tb1 ( int id ) { int ret = -1; char *query_format1 = "SELECT * FROM ts1 WHERE id=%d;"; char *query_string = NULL; char **resultp = NULL; int row = 0; int column = 0; char *errmsg = NULL; char **tmp_str = NULL; query_string = sqlite3_mprintf ( query_format1, id%500 ); ret = sqlite3_get_table ( db, query_string, &resultp, &row, &column, &errmsg ); if ( SQLITE_OK == ret ) { //printf ( "sqlite3_get_table() success!\n" ); tmp_str = resultp + column; printf ( "# IN main(), id: %d, length: %d\n", atoi(tmp_str[0]), atoi(tmp_str[1]) ); } sqlite3_free ( query_string ); sqlite3_free_table ( resultp ); 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, &p_stmt, NULL ); ret = sqlite3_step ( p_stmt ); //if ( SQLITE_ROW == ret ) // printf ( "# IN main(), id: %d, length: %d; timer_handle_mark1: %d\n", sqlite3_column_int( p_stmt, 0 ), sqlite3_column_int( p_stmt, 1 ), timer_handle_mark1 ); sqlite3_finalize ( p_stmt ); return 0; } -- View this message in context: http://www.nabble.com/is-the-sqlite3%27s-C-api-used-in-thread-safety-mode---or-non-reentrant--tp24405739p24405739.html Sent from the SQLite mailing list archive at Nabble.com. _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users