aboutsummaryrefslogtreecommitdiff
path: root/odb/transaction.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-06-04 16:33:08 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-06-04 16:33:08 +0200
commit6f0d40508286afc8cdd72a0b5f807d5c2a589cfc (patch)
treef22a38560560664cae731c37537c2bb04bffdc2a /odb/transaction.cxx
parente0f3efd9df3e7eefa06777717f23905022d1949e (diff)
Initial implementation
Diffstat (limited to 'odb/transaction.cxx')
-rw-r--r--odb/transaction.cxx93
1 files changed, 93 insertions, 0 deletions
diff --git a/odb/transaction.cxx b/odb/transaction.cxx
new file mode 100644
index 0000000..7b28ea2
--- /dev/null
+++ b/odb/transaction.cxx
@@ -0,0 +1,93 @@
+// file : odb/transaction.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#include <odb/exceptions.hxx>
+#include <odb/transaction.hxx>
+
+namespace odb
+{
+ //
+ // transaction
+ //
+
+ static transaction* current_transaction = 0;
+
+ transaction::
+ transaction (transaction_impl* impl)
+ : finilized_ (false), impl_ (impl)
+ {
+ current_transaction = this;
+ }
+
+ transaction::
+ ~transaction ()
+ {
+ if (!finilized_)
+ {
+ try
+ {
+ rollback ();
+ }
+ catch (const database_exception&)
+ {
+ // Ignore it.
+ }
+ }
+
+ current_transaction = 0;
+ delete impl_;
+ }
+
+ bool transaction::
+ has_current ()
+ {
+ return current_transaction != 0;
+ }
+
+ transaction& transaction::
+ current ()
+ {
+ if (current_transaction == 0)
+ throw not_in_transaction ();
+
+ return *current_transaction;
+ }
+
+ void transaction::
+ commit ()
+ {
+ if (finilized_)
+ throw transaction_already_finilized ();
+
+ // Flush the session if we are in the session-per-transaction mode.
+ //
+ if (impl_->own_session ())
+ session ().flush ();
+
+ impl_->commit ();
+ finilized_ = true;
+ }
+
+ void transaction::
+ rollback ()
+ {
+ if (finilized_)
+ throw transaction_already_finilized ();
+
+ finilized_ = true;
+ impl_->rollback ();
+ }
+
+ //
+ // transaction_impl
+ //
+
+ transaction_impl::
+ ~transaction_impl ()
+ {
+ if (own_session ())
+ reinterpret_cast<session_type*> (&session_mem_)->~session ();
+ }
+}