aboutsummaryrefslogtreecommitdiff
path: root/odb
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-12-22 11:03:29 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-01-20 15:43:45 +0200
commitbf122510c89d80380277ab3fb374e647bd3e2ac8 (patch)
treeaa25f22c7c1679ad8e0d3fb5010ffefb988f9dc6 /odb
parentc81d68fd7c0bf884942bd5108008d9718ae87719 (diff)
Handle delayed result set freeing in all places
Diffstat (limited to 'odb')
-rw-r--r--odb/relational/mssql/source.cxx11
-rw-r--r--odb/relational/source.hxx46
2 files changed, 43 insertions, 14 deletions
diff --git a/odb/relational/mssql/source.cxx b/odb/relational/mssql/source.cxx
index 629f823..c1236b8 100644
--- a/odb/relational/mssql/source.cxx
+++ b/odb/relational/mssql/source.cxx
@@ -1279,12 +1279,11 @@ namespace relational
virtual void
init_value_extra ()
{
- os << "sts.find_statement ().stream_result ();"
- << "sts.find_statement ().free_result ();";
+ os << "sts.find_statement ().stream_result ();";
}
virtual void
- free_statement_result ()
+ free_statement_result_immediate ()
{
// Only free the result if there are no rows. Otherwise we
// need to keep the result alive until after we are done
@@ -1296,6 +1295,12 @@ namespace relational
}
virtual void
+ free_statement_result_delayed ()
+ {
+ os << "sts.find_statement ().free_result ();";
+ }
+
+ virtual void
persist_statement_extra (type& c,
relational::query_parameters&,
persist_position p)
diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx
index 3d3ea07..db8d9e6 100644
--- a/odb/relational/source.hxx
+++ b/odb/relational/source.hxx
@@ -2302,13 +2302,20 @@ namespace relational
{
}
+ // By default we free statement result immediately after fetch.
+ //
virtual void
- free_statement_result ()
+ free_statement_result_immediate ()
{
os << "st.free_result ();";
}
virtual void
+ free_statement_result_delayed ()
+ {
+ }
+
+ virtual void
object_query_statement_ctor_args (type&)
{
os << "sts.connection ()," << endl
@@ -2987,11 +2994,13 @@ namespace relational
// will run the SELECT query using the find_() function.
//
os << "if (!find_ (sts, obj." << id->name () << "))" << endl
- << "throw object_not_persistent ();";
+ << "throw object_not_persistent ();"
+ << endl;
+
+ free_statement_result_delayed ();
if (straight_readwrite_containers)
- os << endl
- << "binding& idb (sts.id_image_binding ());"
+ os << "binding& idb (sts.id_image_binding ());"
<< endl;
}
@@ -3128,9 +3137,15 @@ namespace relational
// have been more efficient but it would complicated and bloat
// things significantly.
//
- os << "if (!find_ (sts, obj." << id->name () << ") ||" << endl
- << "version (sts.image ()) != obj." << optimistic->name () <<
- ")" << endl
+
+ os << "if (!find_ (sts, obj." << id->name () << "))" << endl
+ << "throw object_changed ();"
+ << endl;
+
+ free_statement_result_delayed ();
+
+ os << "if (version (sts.image ()) != obj." <<
+ optimistic->name () << ")" << endl
<< "throw object_changed ();"
<< endl;
@@ -3177,6 +3192,7 @@ namespace relational
<< "init (obj, sts.image (), db);";
init_value_extra ();
+ free_statement_result_delayed ();
os << "load_ (sts, obj);"
<< "sts.load_delayed ();"
@@ -3222,6 +3238,7 @@ namespace relational
<< "init (obj, sts.image (), db);";
init_value_extra ();
+ free_statement_result_delayed ();
os << "load_ (sts, obj);"
<< "sts.load_delayed ();"
@@ -3256,15 +3273,22 @@ namespace relational
<< endl;
if (optimistic != 0)
+ {
os << "if (version (sts.image ()) == obj." <<
- optimistic->name () << ")" << endl
- << "return true;"
- << endl;
+ optimistic->name () << ")"
+ << "{";
+
+ free_statement_result_delayed ();
+
+ os << "return true;"
+ << "}";
+ }
os << "callback (db, obj, callback_event::pre_load);"
<< "init (obj, sts.image (), db);";
init_value_extra ();
+ free_statement_result_delayed ();
os << "load_ (sts, obj);"
<< "sts.load_delayed ();"
@@ -3331,7 +3355,7 @@ namespace relational
<< "}"
<< "}";
- free_statement_result ();
+ free_statement_result_immediate ();
os << "return r != select_statement::no_data;"
<< "}";