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

Reply via email to