Hi Tommi,

I see, I made a poor example.

The point is, that I don't know when the connection is changed and during the 
lifetime of the connection I want to keep the statement prepared. That means I 
can reset a statement not until I see that the connectipon has changed.
I also tried to create the statement with new/delete, but when I do it after I 
changed the connection, I also get a Segmentation Fault.

...
   tntdb::Connection conn;
   tntdb::Statement* st = NULL;

   for( int i = 1;; i++) {
      cp = ( i % 2) ?  "sqlite:testdb_2.db" : "postgresql:dbname=test2";
      std::cout << "connecting to " << cp << std::endl;
//      if( st != NULL)
//         delete st;
      conn = tntdb::connect( cp);
      std::cout << "going to prepare statement" << std::endl;

      if( st != NULL)
         delete st;
      st = new tntdb::Statement();
      ( *st) = conn.prepare( "UPDATE y SET x = x + 1");
...

so, is it possible to reset a tntdb::Statement to it's initial state? Or what 
else can I do?

Michael

Am Freitag 13 Mai 2011 17:30:10 schrieb Tommi Mäkitalo:
> Hello,
> 
> the problem, which cases the bug is the lifetime of the objects. A
> tntdb::Statement must be released before the tntdb::Connection, where
> it was prepared. It is not quite obvious here.
> 
> The variables conn and st were declared outside the loop. Inside the
> loop you first create a connection and then prepare the statement. In
> the next iteration a new connection is created. The old one is released
> automatically, since it is the only reference. Here the
> tntdb::Statement is still held. In the next prepare, the previous
> statement is released, but the corresponding connection do not exist
> any more.
> 
> The solution is to put the tntdb::Statement st inside the loop:
> 
>     for( int i = 1;; i++) {
>        cp = ( i % 2) ?  "sqlite:testdb_2.db" : "postgresql:dbname=test2";
>        std::cout << "connecting to " << cp << std::endl;
>        conn = tntdb::connect( cp);
> 
>        std::cout << "going to prepare statement" << std::endl;
>        tntdb::Statement st = conn.prepare( "UPDATE y SET x = x + 1");
>        std::cout << "going to execute statement" << std::endl;
>        st.execute();
> 
> 
> Tommi and many greetings from the LinuxTag 2011 in Berlin.

-- 
Dipl. Ing. Michael Tomuschat

Ing.-Büro Tomuschat       Tel.      : 07071-943866
Steinbößstr. 23                Fax     : 07071-943867 (wenn Büro besetzt ist)
72074 Tübingen              E-mail : michael.tomuschat AT t-online.de
------------------------------------------------------------------------------
Achieve unprecedented app performance and reliability
What every C/C++ and Fortran developer should know.
Learn how Intel has extended the reach of its next-generation tools
to help boost performance applications - inlcuding clusters.
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
Tntnet-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tntnet-general

Reply via email to