Many thanks for your instant help so far! I will run a few tests actually I use 
on single class instantiation and each thread has an pointer to the object. The 
code I put below is incomplete but describes the standard behavoir in all the 
database methods, I don't want to give full access to the db, only some 
functionalities should be accessable. So the structure is somehow like this:

Main:
Creates an instance to the DB and opens it.
All Threads using the database are started here and get a pointer to this 
single instance. 
Within the instance only methods like: int getAttributeID (int id) are 
accessable.
To ensure that there are not 2 requests at the same time I manually put mutexes 
at the beginning of each function which will block until the mutex is 
available. At the end of each function or before I return from the function I 
release the mutex in order to give access to the next request.

Correct me if I'm wrong but I guess there could not be any call to a function 
at the same time beside I miss to set/release a mutex in one of these functions.

Best regards, Chris








-------- Original-Nachricht --------
> Datum: Fri, 28 Oct 2011 12:51:21 +0000
> Von: "Black, Michael (IS)" <michael.bla...@ngc.com>
> An: General Discussion of SQLite Database <sqlite-users@sqlite.org>
> Betreff: Re: [sqlite] Segmentation Fault on SQLITE3_exex

> What you're showing should basically work as long it's not a single class
> instantiation being used by multiple threads.
> Also, your missing a bind on the 2nd statement.
> And you're not retrieving the results of the query (I assume you left that
> out for brevity).
> 
> What I would do is this to maximize speed...you keep the prepared
> statement around for each query and reuse it.
> Somebody else may have a better idea.  But hopefully this shows how to
> "reuse" a prepared statement.
> 
> 
> db = MyDBClass("mydb.sqlite"); // opens database
> run_threads(); // you did say you have threads so kick them off
> 
> // here's what a thread would look like -- note that I don't have complete
> error checking in here for brevity
> thread()
> {
>   pStmt1=db->getPreparedStatement("SELECT * from model where id=?");
>   pStmt2=db->getPreparedStatement("SELECT * from type where id=?");
>   while (1) { // or whatever loop you're running
>      // 1st query
>      sqlite3_bind_int (pStmt1, 1, dd.deviceIndex);
>      doStmt(pStmt1);
>      int myIndex=sqlite3_column_int(pStmt1,0);
>      // 2nd query
>      sqlite3_bind_int (pStmt2, 1, dd.deviceIndex);
>      doStmt(pStmt2);
>      int myType=sqlite3_column_int(pStmt2,0);
>   }
>   sqlite3_finalize(pStmt1);
>   sqlite3_finalize(pStmt2);
> }
> 
> doStmt(sqlite3_stmt *pStmt)
> {
>     sqlite3_reset(pStmt); // we reset on the way in so we can use the
> results AFTER we step outside this function
>     sqlite3_step(pStmt);
> }
> 
> Michael D. Black
> Senior Scientist
> Advanced Analytics Directorate
> Advanced GEOINT Solutions Operating Unit
> Northrop Grumman Information Systems
> 
> 
> 
> From: sqlite-users-boun...@sqlite.org [sqlite-users-boun...@sqlite.org] on
> behalf of Christian [siriu...@gmx.de]
> Sent: Friday, October 28, 2011 3:07 AM
> To: General Discussion of SQLite Database; sqlite-users@sqlite.org
> Subject: EXT :Re: [sqlite] Segmentation Fault on SQLITE3_exex
> 
> 
> First of all thanks for your detailed reply! According to the
> documentation its not recommended to reuse a preparedStatement after 
> finalizing it. So
> my initial guess to do something like this:
> 
> sqlite3_stmt *preparedStatement = 0;
> static char command [1024];
> 
> sprintf (command, "SELECT * from model where id=?");
> 
> if (sqlite3_prepare_v2 (db, command, strlen(command), &preparedStatement,
> 0) != SQLITE_OK)
>       {
>       LOG_MESSAGE ("SQLite Error: %s error=%d\n", sqlite3_errmsg (db),
> sqlite3_errcode (db));
>       sqlite3_finalize (preparedStatement);
>       return FALSE;
>       }
> sqlite3_bind_int (preparedStatement, 1, dd.deviceIndex);
> success = sqlite3_step(preparedStatement);
> 
> //read result
> 
> if ((retVal= sqlite3_finalize(preparedStatement)) != SQLITE_OK){
> LOG_MESSAGE ("SQLite Error: %s error=%d\n", sqlite3_errmsg (db),
> sqlite3_errcode (db));
> }
> else
> preparedStatement=0;
> 
> 
> sprintf (command, "SELECT * FROM type WHERE id=%d", id);
> 
> if (sqlite3_prepare_v2 (db, command, strlen(command), &preparedStatement,
> 0) != SQLITE_OK)
>            {
>           LOG_MESSAGE ("SQLite Error: %s error=%d\n", sqlite3_errmsg (db),
> sqlite3_errcode (db));
>           sqlite3_finalize (preparedStatement);
>            return FALSE;
>            }
> if ((success = sqlite3_step(preparedStatement)) != SQLITE_ROW)
>       {
>       LOG_MESSAGE ("SQLite Error: %s error=%d\n", sqlite3_errmsg (db),
> sqlite3_errcode (db));
>       sqlite3_finalize (preparedStatement);
>       return FALSE;
>       }
> 
> //read result
> 
> sqlite3_finalize (preparedStatement);
> return TRUE;
> 
> 
> Am I right that this is not possible? So I have to use one sqlite3_stmt
> for each prepare?
> 
> Best regards,
> Chris.
> 
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

-- 
NEU: FreePhone - 0ct/min Handyspartarif mit Geld-zurück-Garantie!               
Jetzt informieren: http://www.gmx.net/de/go/freephone
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to