aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--odb/mysql/connection-factory.cxx2
-rw-r--r--odb/mysql/connection.cxx7
-rw-r--r--odb/mysql/connection.hxx12
-rw-r--r--odb/mysql/database.cxx2
-rw-r--r--odb/mysql/statement.cxx24
-rw-r--r--odb/mysql/transaction-impl.cxx7
6 files changed, 33 insertions, 21 deletions
diff --git a/odb/mysql/connection-factory.cxx b/odb/mysql/connection-factory.cxx
index 2f1b00c..2d86b82 100644
--- a/odb/mysql/connection-factory.cxx
+++ b/odb/mysql/connection-factory.cxx
@@ -229,7 +229,9 @@ namespace odb
void connection_pool_factory::
release (pooled_connection* c)
{
+ c->clear ();
c->pool_ = 0;
+
lock l (mutex_);
// Determine if we need to keep or free this connection.
diff --git a/odb/mysql/connection.cxx b/odb/mysql/connection.cxx
index 98fd427..cfdd26c 100644
--- a/odb/mysql/connection.cxx
+++ b/odb/mysql/connection.cxx
@@ -8,6 +8,7 @@
#include <odb/mysql/database.hxx>
#include <odb/mysql/connection.hxx>
+#include <odb/mysql/statement.hxx>
#include <odb/mysql/error.hxx>
#include <odb/mysql/exceptions.hxx>
#include <odb/mysql/statement-cache.hxx>
@@ -92,6 +93,12 @@ namespace odb
}
}
+ void connection::
+ clear_ ()
+ {
+ active_->cancel (); // Should clear itself from active_.
+ }
+
MYSQL_STMT* connection::
alloc_stmt_handle ()
{
diff --git a/odb/mysql/connection.hxx b/odb/mysql/connection.hxx
index 16d3438..89103c7 100644
--- a/odb/mysql/connection.hxx
+++ b/odb/mysql/connection.hxx
@@ -94,6 +94,15 @@ namespace odb
free_stmt_handles ();
}
+ // Cancel and clear the active statement, if any.
+ //
+ void
+ clear ()
+ {
+ if (active_ != 0)
+ clear_ ();
+ }
+
public:
MYSQL_STMT*
alloc_stmt_handle ();
@@ -109,6 +118,9 @@ namespace odb
void
free_stmt_handles ();
+ void
+ clear_ ();
+
private:
database_type& db_;
bool failed_;
diff --git a/odb/mysql/database.cxx b/odb/mysql/database.cxx
index 72b18d8..31d6c7b 100644
--- a/odb/mysql/database.cxx
+++ b/odb/mysql/database.cxx
@@ -218,6 +218,8 @@ namespace odb
throw not_in_transaction ();
connection_type& c (transaction::current ().connection ());
+ c.clear ();
+
MYSQL* h (c.handle ());
if (mysql_real_query (h, s, static_cast<unsigned long> (n)))
diff --git a/odb/mysql/statement.cxx b/odb/mysql/statement.cxx
index 7ab9c04..b311dbe 100644
--- a/odb/mysql/statement.cxx
+++ b/odb/mysql/statement.cxx
@@ -68,8 +68,7 @@ namespace odb
data_ (data),
data_version_ (0)
{
- if (statement* a = conn_.active ())
- a->cancel ();
+ conn_.clear ();
if (mysql_stmt_prepare (stmt_, s.c_str (), s.size ()) != 0)
translate_error (conn_, stmt_);
@@ -78,8 +77,7 @@ namespace odb
void select_statement::
execute ()
{
- if (statement* a = conn_.active ())
- a->cancel ();
+ conn_.clear ();
if (cached_)
free_result ();
@@ -230,8 +228,7 @@ namespace odb
insert_statement (connection& conn, const string& s, binding& data)
: statement (conn), data_ (data), data_version_ (0)
{
- if (statement* a = conn_.active ())
- a->cancel ();
+ conn_.clear ();
if (mysql_stmt_prepare (stmt_, s.c_str (), s.size ()) != 0)
translate_error (conn_, stmt_);
@@ -240,8 +237,7 @@ namespace odb
bool insert_statement::
execute ()
{
- if (statement* a = conn_.active ())
- a->cancel ();
+ conn_.clear ();
if (mysql_stmt_reset (stmt_))
translate_error (conn_, stmt_);
@@ -284,8 +280,7 @@ namespace odb
image_ (image),
image_version_ (0)
{
- if (statement* a = conn_.active ())
- a->cancel ();
+ conn_.clear ();
if (mysql_stmt_prepare (stmt_, s.c_str (), s.size ()) != 0)
translate_error (conn_, stmt_);
@@ -294,8 +289,7 @@ namespace odb
void update_statement::
execute ()
{
- if (statement* a = conn_.active ())
- a->cancel ();
+ conn_.clear ();
if (mysql_stmt_reset (stmt_))
translate_error (conn_, stmt_);
@@ -338,8 +332,7 @@ namespace odb
delete_statement (connection& conn, const string& s, binding& cond)
: statement (conn), cond_ (cond), cond_version_ (0)
{
- if (statement* a = conn_.active ())
- a->cancel ();
+ conn_.clear ();
if (mysql_stmt_prepare (stmt_, s.c_str (), s.size ()) != 0)
translate_error (conn_, stmt_);
@@ -348,8 +341,7 @@ namespace odb
unsigned long long delete_statement::
execute ()
{
- if (statement* a = conn_.active ())
- a->cancel ();
+ conn_.clear ();
if (mysql_stmt_reset (stmt_))
translate_error (conn_, stmt_);
diff --git a/odb/mysql/transaction-impl.cxx b/odb/mysql/transaction-impl.cxx
index b523568..659dc56 100644
--- a/odb/mysql/transaction-impl.cxx
+++ b/odb/mysql/transaction-impl.cxx
@@ -6,7 +6,6 @@
#include <odb/mysql/mysql.hxx>
#include <odb/mysql/database.hxx>
#include <odb/mysql/connection.hxx>
-#include <odb/mysql/statement.hxx>
#include <odb/mysql/error.hxx>
#include <odb/mysql/transaction-impl.hxx>
@@ -30,8 +29,7 @@ namespace odb
void transaction_impl::
commit ()
{
- if (statement* a = connection_->active ())
- a->cancel ();
+ connection_->clear ();
if (mysql_real_query (connection_->handle (), "commit", 6) != 0)
translate_error (*connection_);
@@ -44,8 +42,7 @@ namespace odb
void transaction_impl::
rollback ()
{
- if (statement* a = connection_->active ())
- a->cancel ();
+ connection_->clear ();
if (mysql_real_query (connection_->handle (), "rollback", 8) != 0)
translate_error (*connection_);