diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2012-03-07 10:21:07 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2012-03-07 10:21:07 +0200 |
commit | 9542fdc4434c3af3eaed91bf10e5b487044d8cc7 (patch) | |
tree | 93a09e5995fee093cc048e585c29c3d88937dbdb /odb/mysql/statement.cxx | |
parent | 6b9ed661b4bf7f1a07ee34fe205d3e0802df535c (diff) |
Use RAII to free select statement results
Diffstat (limited to 'odb/mysql/statement.cxx')
-rw-r--r-- | odb/mysql/statement.cxx | 39 |
1 files changed, 19 insertions, 20 deletions
diff --git a/odb/mysql/statement.cxx b/odb/mysql/statement.cxx index 9278138..6882a27 100644 --- a/odb/mysql/statement.cxx +++ b/odb/mysql/statement.cxx @@ -104,16 +104,7 @@ namespace odb select_statement:: ~select_statement () { - if (cached_ || conn_.active () == this) - { - try - { - free_result (); - } - catch (...) - { - } - } + assert (freed_); } select_statement:: @@ -124,6 +115,7 @@ namespace odb : statement (conn, t), end_ (false), cached_ (false), + freed_ (true), rows_ (0), param_ (¶m), param_version_ (0), @@ -141,6 +133,7 @@ namespace odb : statement (conn, t, ct), end_ (false), cached_ (false), + freed_ (true), rows_ (0), param_ (¶m), param_version_ (0), @@ -154,6 +147,7 @@ namespace odb : statement (conn, t), end_ (false), cached_ (false), + freed_ (true), rows_ (0), param_ (0), result_ (result), @@ -169,6 +163,7 @@ namespace odb : statement (conn, t, ct), end_ (false), cached_ (false), + freed_ (true), rows_ (0), param_ (0), result_ (result), @@ -179,10 +174,9 @@ namespace odb void select_statement:: execute () { - conn_.clear (); + assert (freed_); - if (cached_) - free_result (); + conn_.clear (); end_ = false; rows_ = 0; @@ -209,6 +203,7 @@ namespace odb if (mysql_stmt_execute (stmt_)) translate_error (conn_, stmt_); + freed_ = false; conn_.active (this); } @@ -306,15 +301,19 @@ namespace odb void select_statement:: free_result () { - end_ = true; - cached_ = false; - rows_ = 0; + if (!freed_) + { + if (mysql_stmt_free_result (stmt_)) + translate_error (conn_, stmt_); - if (mysql_stmt_free_result (stmt_)) - translate_error (conn_, stmt_); + if (conn_.active () == this) + conn_.active (0); - if (conn_.active () == this) - conn_.active (0); + end_ = true; + cached_ = false; + freed_ = true; + rows_ = 0; + } } void select_statement:: |