diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2011-08-24 13:42:04 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2011-08-24 13:42:04 +0200 |
commit | ce69b47672cab339994828e0ff5e28b058a517f0 (patch) | |
tree | 809b2398a51e4388c483f4671f21ced2b47b739f | |
parent | 19b2244f56731cd23d0298112d1981bd0429ad4b (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.
-rw-r--r-- | odb/mysql/connection.cxx | 3 | ||||
-rw-r--r-- | odb/mysql/database.cxx | 6 | ||||
-rw-r--r-- | odb/mysql/database.hxx | 2 | ||||
-rw-r--r-- | odb/mysql/database.ixx | 6 | ||||
-rw-r--r-- | odb/mysql/transaction-impl.cxx | 23 | ||||
-rw-r--r-- | odb/mysql/transaction-impl.hxx | 9 | ||||
-rw-r--r-- | odb/mysql/transaction.hxx | 5 | ||||
-rw-r--r-- | odb/mysql/transaction.ixx | 6 |
8 files changed, 44 insertions, 16 deletions
diff --git a/odb/mysql/connection.cxx b/odb/mysql/connection.cxx index fe4996f..b783f69 100644 --- a/odb/mysql/connection.cxx +++ b/odb/mysql/connection.cxx @@ -77,9 +77,6 @@ namespace odb transaction_impl* connection:: begin () { - if (transaction::has_current ()) - throw already_in_transaction (); - return new transaction_impl (connection_ptr (inc_ref (this))); } diff --git a/odb/mysql/database.cxx b/odb/mysql/database.cxx index dc78bce..d37351f 100644 --- a/odb/mysql/database.cxx +++ b/odb/mysql/database.cxx @@ -208,6 +208,12 @@ namespace odb details::options::print_usage (os); } + transaction_impl* database:: + begin () + { + return new transaction_impl (*this); + } + odb::connection* database:: connection_ () { diff --git a/odb/mysql/database.hxx b/odb/mysql/database.hxx index 37b966f..ba4ee80 100644 --- a/odb/mysql/database.hxx +++ b/odb/mysql/database.hxx @@ -157,7 +157,7 @@ namespace odb } public: - transaction_impl* + virtual transaction_impl* begin (); public: diff --git a/odb/mysql/database.ixx b/odb/mysql/database.ixx index 399fbdc..3c0e6de 100644 --- a/odb/mysql/database.ixx +++ b/odb/mysql/database.ixx @@ -16,11 +16,5 @@ namespace odb return connection_ptr ( static_cast<mysql::connection*> (connection_ ())); } - - inline transaction_impl* database:: - begin () - { - return connection ()->begin (); - } } } diff --git a/odb/mysql/transaction-impl.cxx b/odb/mysql/transaction-impl.cxx index 86cccbe..24c511f 100644 --- a/odb/mysql/transaction-impl.cxx +++ b/odb/mysql/transaction-impl.cxx @@ -14,11 +14,15 @@ namespace odb namespace mysql { 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) { - if (mysql_real_query (connection_->handle (), "begin", 5) != 0) - translate_error (*connection_); } transaction_impl:: @@ -27,6 +31,21 @@ 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 (); + } + + if (mysql_real_query (connection_->handle (), "begin", 5) != 0) + translate_error (*connection_); + } + + void transaction_impl:: commit () { connection_->clear (); diff --git a/odb/mysql/transaction-impl.hxx b/odb/mysql/transaction-impl.hxx index a8aa491..db87147 100644 --- a/odb/mysql/transaction-impl.hxx +++ b/odb/mysql/transaction-impl.hxx @@ -23,19 +23,20 @@ namespace odb { class LIBODB_MYSQL_EXPORT transaction_impl: public odb::transaction_impl { - protected: - friend class connection; - friend class transaction; - + public: typedef mysql::database database_type; typedef mysql::connection connection_type; + transaction_impl (database_type&); transaction_impl (connection_ptr); virtual ~transaction_impl (); virtual void + start (); + + virtual void commit (); virtual void diff --git a/odb/mysql/transaction.hxx b/odb/mysql/transaction.hxx index cd666b3..90182e1 100644 --- a/odb/mysql/transaction.hxx +++ b/odb/mysql/transaction.hxx @@ -46,6 +46,11 @@ namespace odb static transaction& current (); + // Set the current thread's transaction. + // + static void + current (transaction&); + public: transaction_impl& implementation (); diff --git a/odb/mysql/transaction.ixx b/odb/mysql/transaction.ixx index 5846632..39fb5d1 100644 --- a/odb/mysql/transaction.ixx +++ b/odb/mysql/transaction.ixx @@ -37,5 +37,11 @@ namespace odb { return implementation ().connection (); } + + inline void transaction:: + current (transaction& t) + { + odb::transaction::current (t); + } } } |