libpq++: suggested patches for PgTransaction

Поиск
Список
Период
Сортировка
От J. T. Vermeulen
Тема libpq++: suggested patches for PgTransaction
Дата
Msg-id 20010228135500.C20079@cistron.nl
обсуждение исходный текст
Ответы Re: libpq++: suggested patches for PgTransaction  (Bruce Momjian <pgman@candle.pha.pa.us>)
Список pgsql-interfaces
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
conninfousage. PgTransaction::PgTransaction(const char* conninfo)
 
-   : PgDatabase(conninfo)
+   : PgDatabase(conninfo),
+     pgCommitted(true){    BeginTransaction();}
@@ -33,17 +34,20 @@// Destructor: End the transaction blockPgTransaction::~PgTransaction(){
-    EndTransaction();
+    if (!pgCommitted) Exec("ABORT");}// Begin the transaction blockExecStatusType PgTransaction::BeginTransaction(){
+        pgCommitted = false;    return Exec("BEGIN");} // End BeginTransaction()// Begin the transaction
blockExecStatusTypePgTransaction::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
databasewith 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 connectprivate:
+  bool pgCommitted;
+// We don't support copying of PgTransaction objects,// so make copy constructor and assignment op private.
PgTransaction(constPgTransaction&);
 



Jeroen



В списке pgsql-interfaces по дате отправления:

Предыдущее
От: Dan Lyke
Дата:
Сообщение: Re: Double newline bug with DBD::Pg: Where best to fix?
Следующее
От: Peter Eisentraut
Дата:
Сообщение: Re: Double newline bug with DBD::Pg: Where best to fix?