Hi,

I am using an in-memory dbase in a multi-threaded application and have
the following two questions:

I create  dbase connections by each thread using the API:

{
        Sqlite3 *db = NULL;

        Sqlite3_open(":memory:", &db);

When I try to use sqlite3_exec( )   I get segmentation faults.
}

Question1:  Can I have multiple connections opened for each thread to
the same in-memory dbase.  According to the documentation, the
sqlite3_open( ) API can be used multiple times to open multiple
connections to the same database, but its not clear is same applies to
in-memory databases too.

Question2:  Why is sqlite3_exec( ) giving Segmentation Fault error:
segfault at 00002b90153ac905 rip 00002b90153ac905 rsp 00007fff95b1d938
error 15
Segmentation fault

Below is my code:
uint32  aim_sql_open (char *ptr, sqlite3 **db)
{

    int n;
    n = sqlite3_open(ptr,db);

    if( n != SQLITE_OK )
    {
        /* zz get the wt_id */
        printf("Error opening database for thread = %d.\n",n);
        return (0);
    }
    else {
        /* zz get the wt_id */
        printf("Database open for thread = %d ok.\n",n);
    }
}
NOTE:  sqlite3_open( ) returns SQLITE_OK and the value of db is updated.

uint32 aim_db_init( ) {
    char dbname[10];
    char tbname[13];
    char statement[760], *db_err;
    sqlite3 *db = NULL;
    int n;
    bzero(dbname,10);
    bzero(tbname,13);
    bzero(statement,760);
    memcpy(dbname,DB_NAME,9);
    /* no need for dbname for inmemory dbase */
    n = aim_sql_open(":memory:", &db);
    memcpy(tbname,AIM_TABLE_NAME,12);
    if(!strcmp(tbname,""))
        return(FALSE);
    sprintf(statement, "CREATE TABLE %s (%s INTEGER PRIMARY KEY,%s
DATE,%s INTEGER,%s INTEGER,%s INTEGER,%s TEXT,%s TEXT,%s TEXT,%s
INTEGER,%s INTEGER,%s INTEGER,%s INTEGER,%s DATE,%s INTEGER,%s DATE,%s
INTEGER,%s DATE,%s INTEGER,%s DATE,%s INTEGER,%s INTEGER,%s DATE);",
tbname,COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10,COL11,COL12,CO
L13,COL14,COL15,COL16,COL17,COL18,COL19,COL20,COL21,COL22);
    n = sqlite3_exec(db, statement, NULL, 0, &db_err);
    if( n != SQLITE_OK )
    {
        printf("Error executing: %s\n",db_err);
        sqlite3_free(db_err);
        return (FALSE);
    }
         

The backtrace from GDB is as follows:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x2b7070afe1a0 (LWP 699)]
0x00002b706fcc6905 in read () from /usr/lib64/libaimdb.so
(gdb) bt
#0  0x00002b706fcc6905 in read () from /usr/lib64/libaimdb.so
#1  0x00002b70703a4120 in unixRandomness (NotUsed=<value optimized out>,
    nBuf=<value optimized out>, zBuf=0x7fff3b203050 "") at
../sqlite3.c:27932
#2  0x00002b707035b0f5 in sqlite3_randomness (N=4, pBuf=<value optimized
out>)
    at ../sqlite3.c:13876
#3  0x00002b707035b28f in writeJournalHdr (pPager=0x62b788)
    at ../sqlite3.c:36096
#4  0x00002b707035b4fb in pager_write (pPg=0x639e08) at
../sqlite3.c:39815
#5  0x00002b7070366195 in sqlite3PagerWrite (pDbPage=0x7) at
../sqlite3.c:40151
#6  0x00002b7070368466 in newDatabase (pBt=0x62b6d8) at
../sqlite3.c:47668
#7  0x00002b707037a18c in sqlite3BtreeBeginTrans (p=0x62b678, wrflag=1)
    at ../sqlite3.c:47798
#8  0x00002b707037fa78 in sqlite3Step (p=0x63a988) at ../sqlite3.c:63062
#9  0x00002b7070383803 in sqlite3_step (pStmt=<value optimized out>)
    at ../sqlite3.c:58768
#10 0x00002b7070386592 in sqlite3_exec (db=0x62b078,
    zSql=0x7fff3b203b10 "CREATE TABLE aim_db_table (hash4ADandDC INTEGER
PRIMARY KEY,entrytime DATE,state INTEGER,bwgain INTEGER,cctimestamp
INTEGER,foreignkeyAD TEXT,popclass TEXT,deviceclass TEXT,vdoBitrate
INTEGER,qualityI"...,
    xCallback=0, pArg=0x0, pzErrMsg=0x7fff3b203e38) at
../sqlite3.c:84165
#11 0x00002b706fac52ac in aim_db_init () at aim_db_main.c:645
#12 0x000000000040566d in main ()


Regards,
Zaryab


_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to