Hi,

I am not able to query SQLite3 database files using threads; without threads it is working fine. I tried both etc.c.sqlite3 and d2sqlite3, and both seem to be facing the same issue: They stuck when executing a select query (using sqlite3_exec(...) for etc.c.sqlite3 or using RowCache(db.execute(...)) in case of d2sqlite3). Since d2sqlite3 is a wrapper for native sqlite3, I think it faces the same limitation which native sqlite does, so next lines will describe native SQLite3 code.

---------------------------------------------------------------
This works fine (non-relevant code and validations are omitted for simplicity)
---------------------------------------------------------------
import etc.c.sqlite3,...
...
extern(C) int myCallback(void *a_parm, int argc, char **argv, char **column)
{
printf("%s\n", argv[1] ? argv[1] : "NULL"); // this prints first column of each row, all is well
     return 0;
}
void querySQLite(string dbName)
{
        sqlite3* db;
        auto ret = sqlite3_open(toStringz(dbName), &db);
        string query = "SELECT * FROM my_table";
        sqlite3_exec(db,toStringz(query),&myCallback,null,null);
        sqlite3_close(db);
}
void main()
{
        querySQLite("db1.sl3");
        querySQLite("db2.sl3");
...// in fact, here is a foreach loop which is calling querySQLite with about 30 database files
        querySQLite("db30.sl3");      
}

---------------------------------------------------------------
However, if I change main function to spawn querySQLite, instead of calling it in sequence from the main thread,
then "myCallback()" is not executed.
void main()
{
        spawn(&querySQLite,"db1.sl3");
        spawn(&querySQLite,"db2.sl3");
        ...
        spawn(&querySQLite,"db30.sl3");
}
It is stuck inside this line in querySQLite():
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        sqlite3_exec(db,toStringz(query),&myCallback,null,null);
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
If I comment it, the flow continues and returns fine from all spawn-ed functions, so it is definitely something wrong in this line.
---------------------------------------------------------------

I think I am missing some kind of thread locking code in querySQLite() - since it is working with C code I think it needs more attention.

I tried to compile SQLite with different multithreading options, but that did not help.

Any advice is much appreciated.

Using dmd.2.066.1.linux
RedHat 5 64bit
Compiled using dmd
sqlite-amalgamation-3080803

Thanks,
Vitalie

Reply via email to