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
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users