From bf122510c89d80380277ab3fb374e647bd3e2ac8 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 22 Dec 2011 11:03:29 +0200 Subject: Handle delayed result set freeing in all places --- odb/relational/mssql/source.cxx | 11 +++++++--- odb/relational/source.hxx | 46 +++++++++++++++++++++++++++++++---------- 2 files changed, 43 insertions(+), 14 deletions(-) (limited to 'odb') 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;" << "}"; -- cgit v1.1