> 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 <stdio.h>      // for printf()
> #include <signal.h>     // for signal()
> #include <unistd.h>     // for alarm()
> #include <stdlib.h>     // for system()
> #include <sqlite3.h>    // 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, &p_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", &db );
>
>    // create tables: ts1 and ts2
>    sqlite3_helper_create_db ();
>
>    // insert datas into the tables(ts1&ts2)
>    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, &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 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, &p_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 this message in context: 
> http://www.nabble.com/there-is-problem-when-getting-data-by-sqlite3%27s-c-apis-in-signal-handling-func-tp24365955p24365955.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
>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to