aboutsummaryrefslogtreecommitdiff
path: root/odb/mysql/statement.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-11-07 15:00:06 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-11-07 15:00:06 +0200
commit57d5d8fe9dc4c0d6b4ef21754c5a3539e4c01cf9 (patch)
tree4daef878ce8276b663a2bc5470e3d9dc37ee2086 /odb/mysql/statement.cxx
parent2077828442e58677a2af1d15c6d5266455e50cad (diff)
Add support for SQL statement tracing
Diffstat (limited to 'odb/mysql/statement.cxx')
-rw-r--r--odb/mysql/statement.cxx96
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_);