diff options
-rw-r--r-- | odb/relational/mssql/source.cxx | 11 | ||||
-rw-r--r-- | odb/relational/source.hxx | 46 |
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;" << "}"; |