Received: from candle.pha.pa.us ([162.33.245.46]) by mail.postgresql.org (8.11.1/8.11.1) with ESMTP id f1SHGZx56055 for ; Wed, 28 Feb 2001 12:16:35 -0500 (EST) (envelope-from pgman@candle.pha.pa.us) Received: (from pgman@localhost) by candle.pha.pa.us (8.9.0/8.9.0) id MAA02741; Wed, 28 Feb 2001 12:14:54 -0500 (EST) From: Bruce Momjian Message-Id: <200102281714.MAA02741@candle.pha.pa.us> Subject: Re: libpq++: suggested patches for PgTransaction In-Reply-To: <20010228135500.C20079@cistron.nl> "from J. T. Vermeulen at Feb 28, 2001 01:55:00 pm" To: "J. T. Vermeulen" Date: Wed, 28 Feb 2001 12:14:54 -0500 (EST) CC: pgsql-interfaces@postgresql.org X-Mailer: ELM [version 2.4ME+ PL77 (25)] MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII X-Archive-Number: 200102/190 X-Sequence-Number: 1154 I will keep this for 7.2. Thanks. > The original PgTransaction, apparently having been written without exceptions > in mind, didn't know how to abort a transaction. The suggested change makes > it abort if the transaction object is destroyed without an explicit commit, > as would happen if the program fell out of the transaction code through an > unhandled exception (plus the patch makes constructors explicit where > appropriate). > > Actually this still isn't very effective; I think it would be more useful to > have a separate transaction object "latch onto" an existing connection and > represent a single transaction delimited by the object's entire lifetime. > That would make it easier to perform multiple independent (but presumably > non-overlapping) transactions over the lifetime of a single connection in > an exception-safe manner. > > > --- postgresql-7.0.3/src/interfaces/libpq++/pgtransdb.cc Sun May 30 17:17:58 1999 > +++ postgresql-7.0.3-jtv/src/interfaces/libpq++/pgtransdb.cc Wed Feb 28 13:34:20 2001 > @@ -25,7 +25,8 @@ > // Make a connection to the specified database with default environment > // See PQconnectdb() for conninfo usage. > PgTransaction::PgTransaction(const char* conninfo) > - : PgDatabase(conninfo) > + : PgDatabase(conninfo), > + pgCommitted(true) > { > BeginTransaction(); > } > @@ -33,17 +34,20 @@ > // Destructor: End the transaction block > PgTransaction::~PgTransaction() > { > - EndTransaction(); > + if (!pgCommitted) Exec("ABORT"); > } > > // Begin the transaction block > ExecStatusType PgTransaction::BeginTransaction() > { > + pgCommitted = false; > return Exec("BEGIN"); > } // End BeginTransaction() > > // Begin the transaction block > ExecStatusType PgTransaction::EndTransaction() > { > + pgCommitted = true; > return Exec("END"); > } // End EndTransaction() > + > > > > --- postgresql-7.0.3/src/interfaces/libpq++/pgtransdb.h Sun Apr 23 00:39:15 2000 > +++ postgresql-7.0.3-jtv/src/interfaces/libpq++/pgtransdb.h Wed Feb 28 13:34:42 2001 > @@ -36,9 +36,9 @@ > // the object is destroyed. > class PgTransaction : public PgDatabase { > public: > - PgTransaction(const char* conninfo); // use reasonable & environment defaults > + explicit PgTransaction(const char conninfo[]); // use reasonable & environment defaults > // connect to the database with given environment and database name > - // PgTransaction(const PgConnection&); > + // explicit PgTransaction(const PgConnection&); > ~PgTransaction(); // close connection and clean up > > protected: > @@ -46,9 +46,11 @@ > ExecStatusType EndTransaction(); > > protected: > - PgTransaction() : PgDatabase() {} // Do not connect > + PgTransaction() : PgDatabase(), pgCommitted(true) {} // Do not connect > > private: > + bool pgCommitted; > + > // We don't support copying of PgTransaction objects, > // so make copy constructor and assignment op private. > PgTransaction(const PgTransaction&); > > > > Jeroen > > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026