summaryrefslogtreecommitdiff
path: root/libodb-pgsql/odb/pgsql/transaction-impl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'libodb-pgsql/odb/pgsql/transaction-impl.cxx')
-rw-r--r--libodb-pgsql/odb/pgsql/transaction-impl.cxx107
1 files changed, 107 insertions, 0 deletions
diff --git a/libodb-pgsql/odb/pgsql/transaction-impl.cxx b/libodb-pgsql/odb/pgsql/transaction-impl.cxx
new file mode 100644
index 0000000..012fe18
--- /dev/null
+++ b/libodb-pgsql/odb/pgsql/transaction-impl.cxx
@@ -0,0 +1,107 @@
+// file : odb/pgsql/transaction-impl.cxx
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#include <cassert>
+
+#include <libpq-fe.h>
+
+#include <odb/tracer.hxx>
+
+#include <odb/pgsql/database.hxx>
+#include <odb/pgsql/connection.hxx>
+#include <odb/pgsql/error.hxx>
+#include <odb/pgsql/exceptions.hxx>
+#include <odb/pgsql/transaction-impl.hxx>
+#include <odb/pgsql/auto-handle.hxx>
+
+namespace odb
+{
+ namespace pgsql
+ {
+ transaction_impl::
+ transaction_impl (database_type& db)
+ : odb::transaction_impl (db)
+ {
+ }
+
+ transaction_impl::
+ transaction_impl (connection_ptr c)
+ : odb::transaction_impl (c->database (), *c), connection_ (c)
+ {
+ }
+
+ transaction_impl::
+ ~transaction_impl ()
+ {
+ }
+
+ void transaction_impl::
+ start ()
+ {
+ // Grab a connection if we don't already have one.
+ //
+ if (connection_ == 0)
+ {
+ connection_ = static_cast<database_type&> (database_).connection ();
+ odb::transaction_impl::connection_ = connection_.get ();
+ }
+
+ {
+ odb::tracer* t;
+ if ((t = connection_->tracer ()) || (t = database_.tracer ()))
+ t->execute (*connection_, "BEGIN");
+ }
+
+ auto_handle<PGresult> h (PQexec (connection_->handle (), "begin"));
+
+ if (!h || PGRES_COMMAND_OK != PQresultStatus (h))
+ translate_error (*connection_, h);
+ }
+
+ void transaction_impl::
+ commit ()
+ {
+ // Invalidate query results.
+ //
+ connection_->invalidate_results ();
+
+ {
+ odb::tracer* t;
+ if ((t = connection_->tracer ()) || (t = database_.tracer ()))
+ t->execute (*connection_, "COMMIT");
+ }
+
+ auto_handle<PGresult> h (PQexec (connection_->handle (), "commit"));
+
+ if (!h || PGRES_COMMAND_OK != PQresultStatus (h))
+ translate_error (*connection_, h);
+
+ // Release the connection.
+ //
+ connection_.reset ();
+ }
+
+ void transaction_impl::
+ rollback ()
+ {
+ // Invalidate query results.
+ //
+ connection_->invalidate_results ();
+
+ {
+ odb::tracer* t;
+ if ((t = connection_->tracer ()) || (t = database_.tracer ()))
+ t->execute (*connection_, "ROLLBACK");
+ }
+
+ auto_handle<PGresult> h (PQexec (connection_->handle (), "rollback"));
+
+ if (!h || PGRES_COMMAND_OK != PQresultStatus (h))
+ translate_error (*connection_, h);
+
+ // Release the connection.
+ //
+ connection_.reset ();
+ }
+ }
+}