From 97916660cebbf590b6c1cdaa586930eca8997b8e Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 10 Sep 2010 12:57:53 +0200 Subject: Add support for result caching --- odb/mysql/statement.cxx | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'odb/mysql/statement.cxx') 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 -- cgit v1.1