summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;"
<< "}";