aboutsummaryrefslogtreecommitdiff
path: root/odb
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-08-24 13:42:04 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-08-24 13:42:04 +0200
commit1d42e7cc891403b5f20eb67bc08f23a667019402 (patch)
tree8cad3b525097d47b933e5f10c11ed83c6d661895 /odb
parent148e68c83c45bb374785306476351181e00f0a09 (diff)
Add support for transaction multiplexing
Also delay getting a connection until after we do all the sanity checks (e.g., that there is no active transaction). Otherwise we are running risk of getting blocked rather than throwing an exception.
Diffstat (limited to 'odb')
-rw-r--r--odb/tracer/connection.cxx6
-rw-r--r--odb/tracer/database.cxx4
-rw-r--r--odb/tracer/database.hxx2
-rw-r--r--odb/tracer/transaction-impl.cxx21
-rw-r--r--odb/tracer/transaction-impl.hxx9
-rw-r--r--odb/tracer/transaction.hxx5
-rw-r--r--odb/tracer/transaction.ixx6
7 files changed, 40 insertions, 13 deletions
diff --git a/odb/tracer/connection.cxx b/odb/tracer/connection.cxx
index 516e36a..54c233c 100644
--- a/odb/tracer/connection.cxx
+++ b/odb/tracer/connection.cxx
@@ -27,11 +27,7 @@ namespace odb
transaction_impl* connection::
begin ()
{
- if (odb::transaction::has_current ())
- throw already_in_transaction ();
-
- return new transaction_impl (
- connection_ptr (inc_ref (this)));
+ return new transaction_impl (connection_ptr (inc_ref (this)));
}
}
}
diff --git a/odb/tracer/database.cxx b/odb/tracer/database.cxx
index 90cfdfd..5e032ee 100644
--- a/odb/tracer/database.cxx
+++ b/odb/tracer/database.cxx
@@ -18,10 +18,10 @@ namespace odb
transaction_impl* database::
begin ()
{
- return connection ()->begin ();
+ return new transaction_impl (*this);
}
- inline connection_ptr database::
+ connection_ptr database::
connection ()
{
// Go through the virtual connection_() function instead of
diff --git a/odb/tracer/database.hxx b/odb/tracer/database.hxx
index 2468583..acdad8a 100644
--- a/odb/tracer/database.hxx
+++ b/odb/tracer/database.hxx
@@ -26,7 +26,7 @@ namespace odb
virtual
~database ();
- transaction_impl*
+ virtual transaction_impl*
begin ();
connection_ptr
diff --git a/odb/tracer/transaction-impl.cxx b/odb/tracer/transaction-impl.cxx
index 2069568..bf272b3 100644
--- a/odb/tracer/transaction-impl.cxx
+++ b/odb/tracer/transaction-impl.cxx
@@ -17,12 +17,17 @@ namespace odb
namespace tracer
{
transaction_impl::
+ transaction_impl (database_type& db)
+ : odb::transaction_impl (db), finalized_ (false)
+ {
+ }
+
+ transaction_impl::
transaction_impl (connection_ptr c)
: odb::transaction_impl (c->database (), *c),
finalized_ (false),
connection_ (c)
{
- cout << "begin transaction" << endl;
}
transaction_impl::
@@ -33,6 +38,20 @@ namespace odb
}
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 ();
+ }
+
+ cout << "begin transaction" << endl;
+ }
+
+ void transaction_impl::
commit ()
{
cout << "commit transaction" << endl;
diff --git a/odb/tracer/transaction-impl.hxx b/odb/tracer/transaction-impl.hxx
index f926183..b92797b 100644
--- a/odb/tracer/transaction-impl.hxx
+++ b/odb/tracer/transaction-impl.hxx
@@ -20,18 +20,19 @@ namespace odb
{
class LIBODB_TRACER_EXPORT transaction_impl: public odb::transaction_impl
{
- protected:
- friend class connection;
- friend class transaction;
-
+ public:
typedef tracer::database database_type;
+ transaction_impl (database_type&);
transaction_impl (connection_ptr);
virtual
~transaction_impl ();
virtual void
+ start ();
+
+ virtual void
commit ();
virtual void
diff --git a/odb/tracer/transaction.hxx b/odb/tracer/transaction.hxx
index 0dbc366..b65903d 100644
--- a/odb/tracer/transaction.hxx
+++ b/odb/tracer/transaction.hxx
@@ -38,6 +38,11 @@ namespace odb
static transaction&
current ();
+ // Set the current thread's transaction.
+ //
+ static void
+ current (transaction&);
+
public:
transaction_impl&
implementation ();
diff --git a/odb/tracer/transaction.ixx b/odb/tracer/transaction.ixx
index a36c426..d936e8d 100644
--- a/odb/tracer/transaction.ixx
+++ b/odb/tracer/transaction.ixx
@@ -31,5 +31,11 @@ namespace odb
return static_cast<transaction_impl&> (
odb::transaction::implementation ());
}
+
+ inline void transaction::
+ current (transaction& t)
+ {
+ odb::transaction::current (t);
+ }
}
}