From 57d5d8fe9dc4c0d6b4ef21754c5a3539e4c01cf9 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 7 Nov 2011 15:00:06 +0200 Subject: Add support for SQL statement tracing --- odb/mysql/statement.cxx | 96 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 68 insertions(+), 28 deletions(-) (limited to 'odb/mysql/statement.cxx') 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 +#include + #include -#include +#include #include +#include #include 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_); -- cgit v1.1