diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2011-11-07 15:00:06 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2011-11-07 15:00:06 +0200 |
commit | 57d5d8fe9dc4c0d6b4ef21754c5a3539e4c01cf9 (patch) | |
tree | 4daef878ce8276b663a2bc5470e3d9dc37ee2086 /odb/mysql/statement.cxx | |
parent | 2077828442e58677a2af1d15c6d5266455e50cad (diff) |
Add support for SQL statement tracing
Diffstat (limited to 'odb/mysql/statement.cxx')
-rw-r--r-- | odb/mysql/statement.cxx | 96 |
1 files changed, 68 insertions, 28 deletions
diff --git a/odb/mysql/statement.cxx b/odb/mysql/statement.cxx index d4e4943..04f59f6 100644 --- a/odb/mysql/statement.cxx +++ b/odb/mysql/statement.cxx @@ -5,9 +5,12 @@ #include <cassert> +#include <odb/tracer.hxx> + #include <odb/mysql/mysql.hxx> -#include <odb/mysql/statement.hxx> +#include <odb/mysql/database.hxx> #include <odb/mysql/connection.hxx> +#include <odb/mysql/statement.hxx> #include <odb/mysql/error.hxx> using namespace std; @@ -20,15 +23,34 @@ namespace odb // statement:: - statement (connection& conn) - : conn_ (conn), stmt_ (conn_.alloc_stmt_handle ()) + statement (connection& conn, const string& text) + : conn_ (conn), text_ (text), stmt_ (conn_.alloc_stmt_handle ()) { + conn_.clear (); + + if (mysql_stmt_prepare (stmt_, text_.c_str (), text_.size ()) != 0) + translate_error (conn_, stmt_); + { + odb::tracer* t; + if ((t = conn_.transaction_tracer ()) || + (t = conn_.tracer ()) || + (t = conn_.database ().tracer ())) + t->prepare (conn_, *this); + } } statement:: ~statement () { + { + odb::tracer* t; + if ((t = conn_.transaction_tracer ()) || + (t = conn_.tracer ()) || + (t = conn_.database ().tracer ())) + t->deallocate (conn_, *this); + } + // Let the connection handle the release of the statement (it // may delay the actual freeing if it will mess up the currently // active statement). @@ -36,6 +58,12 @@ namespace odb conn_.free_stmt_handle (stmt_); } + const char* statement:: + text () const + { + return text_.c_str (); + } + void statement:: cancel () { @@ -64,7 +92,7 @@ namespace odb const string& s, binding& param, binding& result) - : statement (conn), + : statement (conn, s), end_ (false), cached_ (false), rows_ (0), @@ -73,15 +101,11 @@ namespace odb result_ (result), result_version_ (0) { - conn_.clear (); - - if (mysql_stmt_prepare (stmt_, s.c_str (), s.size ()) != 0) - translate_error (conn_, stmt_); } select_statement:: select_statement (connection& conn, const string& s, binding& result) - : statement (conn), + : statement (conn, s), end_ (false), cached_ (false), rows_ (0), @@ -89,10 +113,6 @@ namespace odb result_ (result), result_version_ (0) { - conn_.clear (); - - if (mysql_stmt_prepare (stmt_, s.c_str (), s.size ()) != 0) - translate_error (conn_, stmt_); } void select_statement:: @@ -117,6 +137,14 @@ namespace odb param_version_ = param_->version; } + { + odb::tracer* t; + if ((t = conn_.transaction_tracer ()) || + (t = conn_.tracer ()) || + (t = conn_.database ().tracer ())) + t->execute (conn_, *this); + } + if (mysql_stmt_execute (stmt_)) translate_error (conn_, stmt_); @@ -249,12 +277,8 @@ namespace odb insert_statement:: insert_statement (connection& conn, const string& s, binding& param) - : statement (conn), param_ (param), param_version_ (0) + : statement (conn, s), param_ (param), param_version_ (0) { - conn_.clear (); - - if (mysql_stmt_prepare (stmt_, s.c_str (), s.size ()) != 0) - translate_error (conn_, stmt_); } bool insert_statement:: @@ -273,6 +297,14 @@ namespace odb param_version_ = param_.version; } + { + odb::tracer* t; + if ((t = conn_.transaction_tracer ()) || + (t = conn_.tracer ()) || + (t = conn_.database ().tracer ())) + t->execute (conn_, *this); + } + if (mysql_stmt_execute (stmt_)) { if (mysql_stmt_errno (stmt_) == ER_DUP_ENTRY) @@ -300,12 +332,8 @@ namespace odb update_statement:: update_statement (connection& conn, const string& s, binding& param) - : statement (conn), param_ (param), param_version_ (0) + : statement (conn, s), param_ (param), param_version_ (0) { - conn_.clear (); - - if (mysql_stmt_prepare (stmt_, s.c_str (), s.size ()) != 0) - translate_error (conn_, stmt_); } unsigned long long update_statement:: @@ -324,6 +352,14 @@ namespace odb param_version_ = param_.version; } + { + odb::tracer* t; + if ((t = conn_.transaction_tracer ()) || + (t = conn_.tracer ()) || + (t = conn_.database ().tracer ())) + t->execute (conn_, *this); + } + if (mysql_stmt_execute (stmt_)) translate_error (conn_, stmt_); @@ -345,12 +381,8 @@ namespace odb delete_statement:: delete_statement (connection& conn, const string& s, binding& param) - : statement (conn), param_ (param), param_version_ (0) + : statement (conn, s), param_ (param), param_version_ (0) { - conn_.clear (); - - if (mysql_stmt_prepare (stmt_, s.c_str (), s.size ()) != 0) - translate_error (conn_, stmt_); } unsigned long long delete_statement:: @@ -369,6 +401,14 @@ namespace odb param_version_ = param_.version; } + { + odb::tracer* t; + if ((t = conn_.transaction_tracer ()) || + (t = conn_.tracer ()) || + (t = conn_.database ().tracer ())) + t->execute (conn_, *this); + } + if (mysql_stmt_execute (stmt_)) translate_error (conn_, stmt_); |