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.


-------- Original-Nachricht --------
> Datum: Thu, 27 Oct 2011 16:00:52 +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

> I think we went throught something similar to this a while ago.
> 
> 
> 
> Does each class have it's own instantiation of your database object?
> 
> 
> 
> The way you describe it they are all using the same one.
> 
> 
> 
> sqlite3_reset does not "clean up" -- it "resets" the statement to its
> initial state:
> 
> http://www.sqlite.org/c3ref/reset.html
> 
> 
> 
> sqlite3_finalize is what essentially "deletes" the statement and frees
> memory.
> 
> 
> 
> You quite obviously cannot reuse a prepared statement if you only have one
> class object instantiated.  They'll walk on each other.
> 
> 
> 
> If you want to reuse a prepared statement your threads are going to have
> to maintain the statements and pass it in to your db object.
> 
> 
> 
> But you didn't describe reusing a prepared statement.    Your descriptoin
> is a memory leak as you have two prepare's without a finalize between them.
> 
> 
> 
> 
> 
> 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: Thursday, October 27, 2011 10:24 AM
> To: General Discussion of SQLite Database; sqlite-users@sqlite.org
> Subject: EXT :Re: [sqlite] Segmentation Fault on SQLITE3_exex
> 
> Currently I'm using valgrinds memcheck tools to solve the issue, I already
> found some undelete memory which is definitly not causing the error, but I
> receive a lot of these messages:
> 
> ==13965== 1,006,200 bytes in 975 blocks are possibly lost in loss record
> 226 of 228
> ==13965==    at 0x4024F20: malloc (vg_replace_malloc.c:236)
> ==13965==    by 0x8096FD6: sqlite3MemMalloc (sqlite3.c:14854)
> ==13965==    by 0x8097957: mallocWithAlarm (sqlite3.c:18369)
> ==13965==    by 0x80979EE: sqlite3Malloc (sqlite3.c:18402)
> ==13965==    by 0x809813B: sqlite3DbMallocRaw (sqlite3.c:18734)
> ==13965==    by 0x809818A: sqlite3DbRealloc (sqlite3.c:18753)
> ==13965==    by 0x80BAA5B: growOpArray (sqlite3.c:58415)
> ==13965==    by 0x80BAAD4: sqlite3VdbeAddOp3 (sqlite3.c:58447)
> ==13965==    by 0x80BAB79: sqlite3VdbeAddOp0 (sqlite3.c:58471)
> ==13965==    by 0x80EF9EF: sqlite3GetVdbe (sqlite3.c:93756)
> ==13965==    by 0x80F3C8E: sqlite3Select (sqlite3.c:96128)
> ==13965==    by 0x8103B4D: yy_reduce (sqlite3.c:107894)
> 
> A lot means 200 of them until the program crashes. You're right that I'm
> not able to show you the complete code, beside the fact that the project
> consists of different threads using sqlite3 database. Thats why I'm thinking
> that something is wrong with the setup I use, or the sqlite usage in
> general. I shortly explain what I'm doing. For timing reasons I just have one 
> open
> connection to the database, which seems to be fine according the man page.
> From my main thread I give every accessing thread a pointer to the object
> which maintains all database functionality, there I always use my own
> mutexes to synchronize the access, I also tried using the set command:
> sqlite3_config (SQLITE_CONFIG_SERIALIZED) looking to the sources also tells 
> me that
> it is not neccessary to set own mutexes but I guess it would not have any
> bad effect having them in there.
> 
> From my database class all DB operations are performed. Could it be that
> it is not possible to reuse prepared statements what I basically do in all
> functions is:
> 
>  sprintf (command, "SELECT name FROM attribute WHERE
> id=%d",attributeIndex);
> 
> if (sqlite3_prepare_v2 (db, command, strlen(command), &preparedStatement,
> 0) != SQLITE_OK)
>          {
>          sqlite3_finalize (preparedStatement);
>          }
> 
> sqlite3_reset(preparedStatement);
> // followed by the next prepare
> sqlite3_prepare_v2 (preparedStatement);
> sqlite3_step();
> sqlite3_reset(preparedStatement);
> sqlite3_finalize (preparedStatement);
> 
> 
> I guess reset is not cleaning up the statement as I supposed?
> 
> Best regards,
> Chris.
> 
> -------- Original-Nachricht --------
> > Datum: Thu, 27 Oct 2011 12:12:16 +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
> 
> >
> >
> > Then put a breakpoint on the "p" being passed into this function to
> catch
> > when it changes....it should only change maybe once during execution
> (not
> > sure about that though).
> >
> >
> >
> > Assuming your program runs the same in debug as it does when not in
> debug
> > (which frequently changes behaviors in these situations).
> >
> >
> >
> > Your segfault may move.  Matter of fact, if it doesn't change/move when
> > you add DUMA or such you may have a more systemic error on your side.
> > Usually buffer overruns or stack corruption moves under different
> compilation
> > options.
> >
> >
> >
> > You got arrays of some sort?  Or char* that you are manipulating?  Or
> > char[] that you are abusing?  Those are the most common errors.
> >
> >
> >
> > And I guess you can't show us your code?
> >
> >
> >
> > 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: Thursday, October 27, 2011 6:49 AM
> > To: General Discussion of SQLite Database; sqlite-users@sqlite.org
> > Subject: EXT :Re: [sqlite] Segmentation Fault on SQLITE3_exex
> >
> > Honestly I already expected for this kind  of answer. I keep on
> debugging
> > the code using DUMA. Thanks alot for the swift response!
> >
> >
> >
> >
> > -------- Original-Nachricht --------
> > > Datum: Thu, 27 Oct 2011 10:42:37 +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
> >
> > > Me thinkst you're corrupting your stack or memory.
> > >
> > >
> > >
> > > I'd be willing to bet big money that this is your program causing this
> > as
> > > there are 1000's of people running that exact same call without any
> > problem
> > > at all (like me and I've been using it like crazy across multiple
> > versions
> > > of SQLite)
> > >
> > >
> > >
> > > If you can try using something like efence which may help detect it. 
> I
> > > assume you're on a Unix flavor?
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > 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: Thursday, October 27, 2011 4:51 AM
> > > To: sqlite-users@sqlite.org
> > > Subject: EXT :[sqlite] Segmentation Fault on SQLITE3_exex
> > >
> > > Hello everybody,
> > >
> > > I'm facing a strange issue and believe that my setup is somehow wrong.
> > > From time to time my program crashes with segfault when calling:
> > > if (sqlite3_exec (db, "BEGIN TRANSACTION", 0, 0, 0) != SQLITE_OK)
> > > {
> > >  //error
> > > }
> > >
> > > The stacktrace points to this function:
> > >
> > > static void pthreadMutexEnter(sqlite3_mutex *p){
> > >   assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(p) );
> > >
> > > #ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
> > >   {
> > >     pthread_t self = pthread_self();
> > >     if( p->nRef>0 && pthread_equal(p->owner, self) ){
> > >       p->nRef++;
> > >     }else{
> > >       pthread_mutex_lock(&p->mutex);
> > >       assert( p->nRef==0 );
> > >       p->owner = self;
> > >       p->nRef = 1;
> > >     }
> > >   }
> > > #else
> > >   /* Use the built-in recursive mutexes if they are available.
> > >   */
> > >   pthread_mutex_lock(&p->mutex); //!HERE IT GETS a SEGFAULT!
> > > #if SQLITE_MUTEX_NREF
> > >   assert( p->nRef>0 || p->owner==0 );
> > >   p->owner = pthread_self();
> > >   p->nRef++;
> > > #endif
> > > }
> > >
> > >
> > > Any ideas why this happens, or how I could workaround the issue? The
> > query
> > >  works like 300 times and then suddenly crashes, I checked this with
> > > version 3.6.22 (as library) and the actual sources (3.7.8 _ 3007008).
> > >
> > > Best regards,
> > > Chris.
> > > --
> > > 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
> > > _______________________________________________
> > > sqlite-users mailing list
> > > sqlite-users@sqlite.org
> > > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> >
> > --
> > Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
> > belohnen Sie mit bis zu 50,- Euro!
> >
> https://freundschaftswerbung.gmx.de<https://freundschaftswerbung.gmx.de/<https://freundschaftswerbung.gmx.de%3chttps//freundschaftswerbung.gmx.de/>>
> > _______________________________________________
> > 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
> 
> --
> Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
> belohnen Sie mit bis zu 50,- Euro!
> https://freundschaftswerbung.gmx.de<https://freundschaftswerbung.gmx.de/>
> _______________________________________________
> 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

-- 
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