Re: libpq++: suggested patches for PgTransaction - Mailing list pgsql-interfaces

From Bruce Momjian
Subject Re: libpq++: suggested patches for PgTransaction
Date
Msg-id 200102281714.MAA02741@candle.pha.pa.us
Whole thread Raw
In response to libpq++: suggested patches for PgTransaction  ("J. T. Vermeulen" <jtv@cistron-office.nl>)
List 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@candle.pha.pa.us               |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


pgsql-interfaces by date:

Previous
From: Peter Eisentraut
Date:
Subject: Re: Double newline bug with DBD::Pg: Where best to fix?
Next
From: Bruce Momjian
Date:
Subject: Re: Double newline bug with DBD::Pg: Where best to fix?