aboutsummaryrefslogtreecommitdiff
path: root/odb/mssql/no-id-object-result.txx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-03-21 08:37:25 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-04-23 16:49:43 +0200
commit290d22210040a7b373e2dc9084240cdeffa1fa3a (patch)
tree78f090fe5d9da0e4b1d486a39c605c784637b67f /odb/mssql/no-id-object-result.txx
parentc1b8b6f16e4881e57aa0da67e6f09ad71ee6099d (diff)
Polymorphic inheritance support
Diffstat (limited to 'odb/mssql/no-id-object-result.txx')
-rw-r--r--odb/mssql/no-id-object-result.txx142
1 files changed, 142 insertions, 0 deletions
diff --git a/odb/mssql/no-id-object-result.txx b/odb/mssql/no-id-object-result.txx
new file mode 100644
index 0000000..f3674fb
--- /dev/null
+++ b/odb/mssql/no-id-object-result.txx
@@ -0,0 +1,142 @@
+// file : odb/mssql/no-id-object-result.txx
+// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC
+// license : ODB NCUEL; see accompanying LICENSE file
+
+#include <odb/callback.hxx>
+#include <odb/exceptions.hxx> // result_not_cached
+
+#include <odb/mssql/exceptions.hxx> // long_data_reload
+#include <odb/mssql/no-id-object-statements.hxx>
+
+namespace odb
+{
+ namespace mssql
+ {
+ template <typename T>
+ no_id_object_result_impl<T>::
+ ~no_id_object_result_impl ()
+ {
+ change_callback_type& cc (statements_.image ().change_callback_);
+
+ if (cc.context == this)
+ {
+ cc.context = 0;
+ cc.callback = 0;
+ }
+
+ if (!this->end_)
+ statement_->free_result ();
+
+ delete image_copy_;
+ }
+
+ template <typename T>
+ no_id_object_result_impl<T>::
+ no_id_object_result_impl (const query&,
+ details::shared_ptr<select_statement> statement,
+ statements_type& statements)
+ : base_type (statements.connection ().database ()),
+ statement_ (statement),
+ statements_ (statements),
+ use_copy_ (false),
+ image_copy_ (0)
+ {
+ }
+
+ template <typename T>
+ void no_id_object_result_impl<T>::
+ load (object_type& obj)
+ {
+ if (!can_load_)
+ throw long_data_reload ();
+
+ odb::database& db (this->database ());
+
+ object_traits::callback (db, obj, callback_event::pre_load);
+
+ object_traits::init (obj,
+ use_copy_ ? *image_copy_ : statements_.image (),
+ &db);
+
+ // If we are using a copy, make sure the callback information for
+ // long data also comes from the copy.
+ //
+ can_load_ = !statement_->stream_result (
+ use_copy_ ? &statements_.image () : 0,
+ use_copy_ ? image_copy_ : 0);
+
+ object_traits::callback (db, obj, callback_event::post_load);
+ }
+
+ template <typename T>
+ void no_id_object_result_impl<T>::
+ next ()
+ {
+ can_load_ = true;
+ this->current (pointer_type ());
+
+ typename object_traits::image_type& im (statements_.image ());
+ change_callback_type& cc (im.change_callback_);
+
+ if (cc.context == this)
+ {
+ cc.callback = 0;
+ cc.context = 0;
+ }
+
+ use_copy_ = false;
+
+ if (im.version != statements_.select_image_version ())
+ {
+ binding& b (statements_.select_image_binding ());
+ object_traits::bind (b.bind, im, statement_select);
+ statements_.select_image_version (im.version);
+ b.version++;
+ }
+
+ if (statement_->fetch () == select_statement::no_data)
+ {
+ statement_->free_result ();
+ this->end_ = true;
+ }
+ else
+ {
+ cc.callback = &change_callback;
+ cc.context = this;
+ }
+ }
+
+ template <typename T>
+ void no_id_object_result_impl<T>::
+ cache ()
+ {
+ }
+
+ template <typename T>
+ std::size_t no_id_object_result_impl<T>::
+ size ()
+ {
+ throw result_not_cached ();
+ }
+
+ template <typename T>
+ void no_id_object_result_impl<T>::
+ change_callback (void* c)
+ {
+ no_id_object_result_impl<T>* r (
+ static_cast<no_id_object_result_impl<T>*> (c));
+
+ typename object_traits::image_type im (r->statements_.image ());
+
+ if (r->image_copy_ == 0)
+ r->image_copy_ = new typename object_traits::image_type (im);
+ else
+ *r->image_copy_ = im;
+
+ im.change_callback_.callback = 0;
+ im.change_callback_.context = 0;
+
+ r->use_copy_ = true;
+ }
+ }
+}