aboutsummaryrefslogtreecommitdiff
path: root/odb/mysql/statement.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-09-10 12:57:53 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-09-10 12:57:53 +0200
commit97916660cebbf590b6c1cdaa586930eca8997b8e (patch)
tree94823af73089e5234448b78543e29ca852dc3fc5 /odb/mysql/statement.cxx
parent763f4c740164da99d280ed053383b1c27f720e37 (diff)
Add support for result caching
Diffstat (limited to 'odb/mysql/statement.cxx')
-rw-r--r--odb/mysql/statement.cxx31
1 files changed, 27 insertions, 4 deletions
diff --git a/odb/mysql/statement.cxx b/odb/mysql/statement.cxx
index 0cab7cc..df1ce03 100644
--- a/odb/mysql/statement.cxx
+++ b/odb/mysql/statement.cxx
@@ -41,7 +41,9 @@ namespace odb
query_statement::
~query_statement ()
{
- if (conn_.active () == this)
+ statement* as (conn_.active ());
+
+ if (cached_ || as == this)
{
try
{
@@ -51,6 +53,9 @@ namespace odb
{
}
}
+
+ if (as == this)
+ conn_.active (0);
}
query_statement::
@@ -59,6 +64,7 @@ namespace odb
binding& image,
MYSQL_BIND* parameters)
: statement (conn),
+ cached_ (false),
image_ (image),
image_version_ (0),
parameters_ (parameters)
@@ -73,6 +79,9 @@ namespace odb
if (statement* a = conn_.active ())
a->cancel ();
+ if (cached_)
+ free_result ();
+
if (mysql_stmt_reset (stmt_))
throw database_exception (stmt_);
@@ -105,6 +114,15 @@ namespace odb
conn_.active (this);
}
+ void query_statement::
+ cache ()
+ {
+ if (mysql_stmt_store_result (stmt_))
+ throw database_exception (stmt_);
+
+ cached_ = true;
+ }
+
query_statement::result query_statement::
fetch ()
{
@@ -152,16 +170,21 @@ namespace odb
void query_statement::
free_result ()
{
+ cached_ = false;
+
if (mysql_stmt_free_result (stmt_))
throw database_exception (stmt_);
-
- conn_.active (0);
}
void query_statement::
cancel ()
{
- free_result ();
+ // If we cached the result, don't free it just yet.
+ //
+ if (!cached_)
+ free_result ();
+
+ conn_.active (0);
}
// persist_statement