Received: from smtp.cistron-office.nl (10fwd.cistron-office.nl [195.64.65.197]) by mail.postgresql.org (8.11.1/8.11.1) with ESMTP id f1SCt6x24680 for ; Wed, 28 Feb 2001 07:55:07 -0500 (EST) (envelope-from jtv@cistron-office.nl) Received: from slipstream.cistron-office.nl ([195.64.65.252]) by smtp.cistron-office.nl with smtp (Exim 3.22 #1 (Debian)) id 14Y68C-0000Dj-00 for ; Wed, 28 Feb 2001 13:55:00 +0100 Received: by slipstream.cistron-office.nl (sSMTP sendmail emulation); Wed, 28 Feb 2001 13:55:00 +0100 From: "J. T. Vermeulen" Date: Wed, 28 Feb 2001 13:55:00 +0100 To: pgsql-interfaces@postgresql.org Subject: libpq++: suggested patches for PgTransaction Message-ID: <20010228135500.C20079@cistron.nl> Mail-Followup-To: pgsql-interfaces@postgresql.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.15i X-Disclaimer: Include standard disclaimer here. X-Archive-Number: 200102/188 X-Sequence-Number: 1152 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