pg.ddx.io  pgsql-interfaces@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Bruce Momjian <pgman@candle.pha.pa.us>
To: J. T. Vermeulen <jtv@cistron-office.nl>
Cc: pgsql-interfaces@postgresql.org
Subject: Re: libpq++: suggested patches for PgTransaction
Date: Wed, 28 Feb 2001 12:14:54 -0500 (EST)
Message-ID: <200102281714.MAA02741@candle.pha.pa.us> (raw)
In-Reply-To: <20010228135500.C20079@cistron.nl>

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



view thread (2+ messages)

Message-ID: <200102281714.MAA02741@candle.pha.pa.us>
Permalink:  ../200102281714.MAA02741@candle.pha.pa.us/
Also on:    postgresql.org/message-id/200102281714.MAA02741@candle.pha.pa.us

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-interfaces@postgresql.org
  Cc: pgman@candle.pha.pa.us, jtv@cistron-office.nl
  Subject: Re: libpq++: suggested patches for PgTransaction
  In-Reply-To: <200102281714.MAA02741@candle.pha.pa.us>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox