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:54 +0200 |
commit | d2c1f5f1a3063553483d09dec261efa44c6bc9bf (patch) | |
tree | 1503cbf2f20c5a2525d3fa0044addac4e8132a53 | |
parent | 821e1bdf35c6fc208c421fa630ad3f77e841b60e (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/cache-traits.hxx | 15 | ||||
-rw-r--r-- | odb/database.txx | 14 | ||||
-rw-r--r-- | odb/no-op-cache-traits.hxx | 12 | ||||
-rw-r--r-- | odb/polymorphic-object-result.txx | 4 | ||||
-rw-r--r-- | odb/session.hxx | 6 | ||||
-rw-r--r-- | odb/simple-object-result.txx | 5 |
6 files changed, 48 insertions, 8 deletions
diff --git a/odb/cache-traits.hxx b/odb/cache-traits.hxx index 13363da..5732cfc 100644 --- a/odb/cache-traits.hxx +++ b/odb/cache-traits.hxx @@ -77,6 +77,13 @@ namespace odb return position_type (); } + static void + initialize (const position_type& p) + { + if (!p.empty_) + session_type::template initialize<object_type> (p.pos_); + } + static position_type insert (odb::database& db, const pointer_type& p) { @@ -107,7 +114,7 @@ namespace odb erase (const position_type& p) { if (!p.empty_) - session_type::current ().template erase<object_type> (p.pos_); + session_type::template erase<object_type> (p.pos_); } }; @@ -154,6 +161,12 @@ namespace odb pointer_type p (&obj); return pointer_traits::insert (db, p); } + + static void + initialize (const position_type& p) + { + pointer_traits::initialize (p); + } }; template <typename T, typename S> diff --git a/odb/database.txx b/odb/database.txx index df58f35..b5f9640 100644 --- a/odb/database.txx +++ b/odb/database.txx @@ -36,8 +36,11 @@ namespace odb object_traits::persist (*this, obj); - object_traits::reference_cache_traits::insert ( - *this, reference_cache_type<T>::convert (obj)); + typename object_traits::reference_cache_traits::position_type p ( + object_traits::reference_cache_traits::insert ( + *this, reference_cache_type<T>::convert (obj))); + + object_traits::reference_cache_traits::initialize (p); return object_traits::id (obj); } @@ -58,8 +61,11 @@ namespace odb // Get the canonical object pointer and insert it into object cache. // - object_traits::pointer_cache_traits::insert ( - *this, pointer_cache_type<pointer_type>::convert (pobj)); + typename object_traits::pointer_cache_traits::position_type p ( + object_traits::pointer_cache_traits::insert ( + *this, pointer_cache_type<pointer_type>::convert (pobj))); + + object_traits::pointer_cache_traits::initialize (p); return object_traits::id (obj); } diff --git a/odb/no-op-cache-traits.hxx b/odb/no-op-cache-traits.hxx index 1d9db7c..5600a81 100644 --- a/odb/no-op-cache-traits.hxx +++ b/odb/no-op-cache-traits.hxx @@ -128,6 +128,9 @@ namespace odb static position_type insert (odb::database&, void*) {return position_type ();} + static void + initialize (const position_type&) {} + static pointer_type find (odb::database&, const id_type&) {return pointer_type ();} @@ -151,6 +154,9 @@ namespace odb // static position_type insert (odb::database&, void*) {return position_type ();} + + static void + initialize (const position_type&) {} }; // reference_cache_traits @@ -188,6 +194,9 @@ namespace odb static position_type insert (odb::database&, object_type&) {return position_type ();} + + static void + initialize (const position_type&) {} }; template <typename T> @@ -198,6 +207,9 @@ namespace odb static position_type insert (odb::database&, object_type&) {return position_type ();} + + static void + initialize (const position_type&) {} }; } diff --git a/odb/polymorphic-object-result.txx b/odb/polymorphic-object-result.txx index 5d6c479..69d365d 100644 --- a/odb/polymorphic-object-result.txx +++ b/odb/polymorphic-object-result.txx @@ -60,10 +60,12 @@ namespace odb typedef odb::object_traits<object_type> object_traits; - typename object_traits::reference_cache_traits::insert_guard ig ( + typename object_traits::reference_cache_traits::position_type p ( object_traits::reference_cache_traits::insert ( res_->db_, res_->load_id (), obj)); + typename object_traits::reference_cache_traits::insert_guard ig (p); res_->load (&obj, false); + object_traits::reference_cache_traits::initialize (p); ig.release (); } } diff --git a/odb/session.hxx b/odb/session.hxx index 472ea79..3f58a80 100644 --- a/odb/session.hxx +++ b/odb/session.hxx @@ -106,6 +106,10 @@ namespace odb const typename object_traits<T>::pointer_type&); template <typename T> + static void + initialize (const position<T>&) {} + + template <typename T> typename object_traits<T>::pointer_type find (database_type&, const typename object_traits<T>::id_type&) const; @@ -114,7 +118,7 @@ namespace odb erase (database_type&, const typename object_traits<T>::id_type&); template <typename T> - void + static void erase (const position<T>&); diff --git a/odb/simple-object-result.txx b/odb/simple-object-result.txx index 60705e8..f14caac 100644 --- a/odb/simple-object-result.txx +++ b/odb/simple-object-result.txx @@ -30,6 +30,7 @@ namespace odb object_type& obj (pointer_traits::get_ref (p)); current (p); load (obj, false); + object_traits::pointer_cache_traits::initialize (ig.position ()); ig.release (); } } @@ -47,10 +48,12 @@ namespace odb typedef odb::object_traits<object_type> object_traits; - typename object_traits::reference_cache_traits::insert_guard ig ( + typename object_traits::reference_cache_traits::position_type p ( object_traits::reference_cache_traits::insert ( res_->db_, res_->load_id (), obj)); + typename object_traits::reference_cache_traits::insert_guard ig (p); res_->load (obj, false); + object_traits::reference_cache_traits::initialize (p); ig.release (); } } |