From 1896d36996ab48ed7271e855d7e32b4e61f64896 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 23 Apr 2012 16:48:00 +0200 Subject: Polymorphic inheritance support --- odb/database.txx | 162 ++++--------------------------------------------------- 1 file changed, 9 insertions(+), 153 deletions(-) (limited to 'odb/database.txx') diff --git a/odb/database.txx b/odb/database.txx index dd0d995..abc6ba3 100644 --- a/odb/database.txx +++ b/odb/database.txx @@ -5,7 +5,6 @@ #include #include #include -#include #include #include @@ -20,14 +19,10 @@ namespace odb typedef typename odb::object_traits::object_type object_type; typedef odb::object_traits object_traits; - if (!transaction::has_current ()) - throw not_in_transaction (); - - object_traits::callback (*this, obj, callback_event::pre_persist); object_traits::persist (*this, obj); - object_traits::callback (*this, obj, callback_event::post_persist); - reference_cache_traits::insert (*this, obj); + object_traits::reference_cache_traits::insert ( + *this, reference_cache_type::convert (obj)); return object_traits::id (obj); } @@ -44,16 +39,13 @@ namespace odb typedef typename odb::object_traits::pointer_type pointer_type; typedef odb::pointer_traits pointer_traits; - if (!transaction::has_current ()) - throw not_in_transaction (); - T& obj (pointer_traits::get_ref (pobj)); - - object_traits::callback (*this, obj, callback_event::pre_persist); object_traits::persist (*this, obj); - object_traits::callback (*this, obj, callback_event::post_persist); - pointer_cache_traits::insert (*this, pobj); + // Get the canonical object pointer and insert it into object cache. + // + object_traits::pointer_cache_traits::insert ( + *this, pointer_cache_type::convert (pobj)); return object_traits::id (obj); } @@ -91,150 +83,14 @@ namespace odb // typedef odb::object_traits object_traits; + // We don't need to check for transaction here; + // object_traits::reload () does this. + if (!object_traits::reload (*this, obj)) throw object_not_persistent (); } template - typename object_traits::pointer_type database:: - find (const typename object_traits::id_type& id) - { - // T is always object_type. - // - typedef odb::object_traits object_traits; - typedef typename object_traits::pointer_type pointer_type; - typedef odb::pointer_traits pointer_traits; - - // First check the session. - // - { - pointer_type p ( - pointer_cache_traits::find (*this, id)); - - if (!pointer_traits::null_ptr (p)) - return p; - } - - if (!transaction::has_current ()) - throw not_in_transaction (); - - // Compiler error pointing here? Perhaps the object doesn't have the - // default constructor? - // - return pointer_type (object_traits::find (*this, id)); - } - - template - bool database:: - find (const typename object_traits::id_type& id, T& obj) - { - // T is always object_type. - // - if (!transaction::has_current ()) - throw not_in_transaction (); - - return object_traits::find (*this, id, obj); - } - - template - void database:: - update (T& obj) - { - // T can be const T while object_type will always be T. - // - typedef typename odb::object_traits::object_type object_type; - typedef odb::object_traits object_traits; - - if (!transaction::has_current ()) - throw not_in_transaction (); - - object_traits::callback (*this, obj,callback_event::pre_update); - - // Compiler error pointing here? Perhaps the object is readonly or - // doesn't have an object id? Such objects cannot be updated. - // - object_traits::update (*this, obj); - - object_traits::callback (*this, obj, callback_event::post_update); - } - - template - void database:: - update_ (const typename object_traits::pointer_type& pobj) - { - // T can be const T while object_type will always be T. - // - typedef typename odb::object_traits::object_type object_type; - typedef odb::object_traits object_traits; - - typedef typename odb::object_traits::pointer_type pointer_type; - typedef odb::pointer_traits pointer_traits; - - if (!transaction::has_current ()) - throw not_in_transaction (); - - T& obj (pointer_traits::get_ref (pobj)); - - object_traits::callback (*this, obj, callback_event::pre_update); - - // Compiler error pointing here? Perhaps the object is readonly or - // doesn't have an object id? Such objects cannot be updated. - // - object_traits::update (*this, obj); - - object_traits::callback (*this, obj, callback_event::post_update); - } - - template - void database:: - erase (const typename object_traits::id_type& id) - { - // T is always object_type. - // - typedef odb::object_traits object_traits; - typedef typename object_traits::pointer_type pointer_type; - - if (!transaction::has_current ()) - throw not_in_transaction (); - - object_traits::erase (*this, id); - pointer_cache_traits::erase (*this, id); - } - - template - void database:: - erase (T& obj) - { - // T can be const T while object_type will always be T. - // - typedef typename odb::object_traits::object_type object_type; - typedef odb::object_traits object_traits; - typedef typename object_traits::pointer_type pointer_type; - - if (!transaction::has_current ()) - throw not_in_transaction (); - - typename object_traits::id_type id (object_traits::id (obj)); - - object_traits::callback (*this, obj, callback_event::pre_erase); - object_traits::erase (*this, obj); - pointer_cache_traits::erase (*this, id); - object_traits::callback (*this, obj, callback_event::post_erase); - } - - template - unsigned long long database:: - erase_query (const odb::query& q) - { - // T is always object_type. - // - if (!transaction::has_current ()) - throw not_in_transaction (); - - return object_traits::erase_query (*this, q); - } - - template struct database::query_ { static result -- cgit v1.1