diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2013-01-09 14:50:26 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2013-01-16 07:42:55 +0200 |
commit | 3f8c83103af11906adbd9c399f1c9efb2eb9b0ed (patch) | |
tree | 250229c2821c520094b14b27dbe6e206f648a72b | |
parent | 96571f2f1174ab0baafc335afbf5d699ee7bf4cd (diff) |
Implement two-phase session insertion
On the first step an uninitialized object is inserted into the cache
as before (this is necessary to handle recursive loading). The second
step is to notify the session that the object has been initialized.
On this second step the session can perform change tracking preparations,
such as make a copy of the object or reset the modification flag.
New test: common/session/custom (implements a custom session that uses
copies to track changes).
-rw-r--r-- | odb/sqlite/polymorphic-object-result.txx | 1 | ||||
-rw-r--r-- | odb/sqlite/simple-object-statements.txx | 11 |
2 files changed, 5 insertions, 7 deletions
diff --git a/odb/sqlite/polymorphic-object-result.txx b/odb/sqlite/polymorphic-object-result.txx index 486af8e..7591194 100644 --- a/odb/sqlite/polymorphic-object-result.txx +++ b/odb/sqlite/polymorphic-object-result.txx @@ -155,6 +155,7 @@ namespace odb ce = callback_event::post_load; pi.dispatch (info_type::call_callback, this->db_, pobj, &ce); + object_traits::pointer_cache_traits::initialize (ig.position ()); ig.release (); } diff --git a/odb/sqlite/simple-object-statements.txx b/odb/sqlite/simple-object-statements.txx index 8c61d5d..f3e617a 100644 --- a/odb/sqlite/simple-object-statements.txx +++ b/odb/sqlite/simple-object-statements.txx @@ -82,7 +82,7 @@ namespace odb while (!dls.empty ()) { delayed_load l (dls.back ()); - typename pointer_cache_traits::insert_guard g (l.pos); + typename pointer_cache_traits::insert_guard ig (l.pos); dls.pop_back (); if (l.loader == 0) @@ -118,7 +118,8 @@ namespace odb else l.loader (db, l.id, *l.obj); - g.release (); + pointer_cache_traits::initialize (ig.position ()); + ig.release (); } } @@ -126,11 +127,7 @@ namespace odb void object_statements<T>:: clear_delayed_ () { - // Remove the objects from the session cache. This is not the most - // efficient way to do this (cache_traits::erase() will check for - // a session on every iteration), but the delay vector won't be - // empty only if something goes wrong (i.e., we are throwing an - // exception). + // Remove the objects from the session cache. // for (typename delayed_loads::iterator i (delayed_.begin ()), e (delayed_.end ()); i != e; ++i) |