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