aboutsummaryrefslogtreecommitdiff
path: root/odb/result.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-10-15 13:17:30 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-10-19 11:38:24 +0200
commit1e78bdc724e95898c04a3409b0b192aa7f77780b (patch)
treed26ae47ae9956612b5973f536219f0c9b455db03 /odb/result.cxx
parent5b0430fdf4617b396e462872d438a663b174a3a8 (diff)
Implement early connection release
Diffstat (limited to 'odb/result.cxx')
-rw-r--r--odb/result.cxx28
1 files changed, 28 insertions, 0 deletions
diff --git a/odb/result.cxx b/odb/result.cxx
index e5b72d0..a088913 100644
--- a/odb/result.cxx
+++ b/odb/result.cxx
@@ -3,11 +3,39 @@
// license : GNU GPL v2; see accompanying LICENSE file
#include <odb/result.hxx>
+#include <odb/connection.hxx>
namespace odb
{
result_impl::
~result_impl ()
{
+ if (next_ != this)
+ list_remove ();
+ }
+
+ result_impl::
+ result_impl (connection& c)
+ : db_ (c.database ()), conn_ (c), prev_ (0), next_ (this)
+ {
+ // Add to the list.
+ //
+ next_ = conn_.results_;
+ conn_.results_ = this;
+
+ if (next_ != 0)
+ next_->prev_ = this;
+ }
+
+ void result_impl::
+ list_remove ()
+ {
+ (prev_ == 0 ? conn_.results_ : prev_->next_) = next_;
+
+ if (next_ != 0)
+ next_->prev_ = prev_;
+
+ prev_ = 0;
+ next_ = this;
}
}