Re: libpq++: suggested patches for PgTransaction

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: "J(dot) T(dot) Vermeulen" <jtv(at)cistron-office(dot)nl>
Cc: pgsql-interfaces(at)postgresql(dot)org
Subject: Re: libpq++: suggested patches for PgTransaction
Date: 2001-02-28 17:14:54
Message-ID: 200102281714.MAA02741@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-interfaces

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(at)candle(dot)pha(dot)pa(dot)us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026

In response to

Browse pgsql-interfaces by date

  From Date Subject
Next Message Bruce Momjian 2001-02-28 17:32:25 Re: Double newline bug with DBD::Pg: Where best to fix?
Previous Message Peter Eisentraut 2001-02-28 17:11:06 Re: Double newline bug with DBD::Pg: Where best to fix?