// file : odb/database.txx // copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #include #include #include #include #include #include namespace odb { template typename object_traits::id_type database:: persist (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_persist); object_traits::persist (*this, obj); object_traits::callback (*this, obj, callback_event::post_persist); reference_cache_traits::insert (*this, obj); return object_traits::id (obj); } template typename object_traits::id_type database:: persist_ (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_persist); object_traits::persist (*this, obj); object_traits::callback (*this, obj, callback_event::post_persist); pointer_cache_traits::insert (*this, pobj); return object_traits::id (obj); } template typename object_traits::pointer_type database:: load (const typename object_traits::id_type& id) { // T is always object_type. // typedef typename object_traits::pointer_type pointer_type; typedef odb::pointer_traits pointer_traits; pointer_type r (find (id)); if (pointer_traits::null_ptr (r)) throw object_not_persistent (); return r; } template void database:: load (const typename object_traits::id_type& id, T& obj) { if (!find (id, obj)) throw object_not_persistent (); } template void database:: reload (T& obj) { // T should be object_type (cannot be const). // typedef odb::object_traits object_traits; 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 call (database& db, const odb::query& q) { return object_traits::query (db, q); } }; template struct database::query_ { static result call (database& db, const odb::query& q) { return view_traits::query (db, q); } }; template result database:: query (const odb::query& q, bool cache) { // T is always object_type. // if (!transaction::has_current ()) throw not_in_transaction (); result r (query_::kind>::call (*this, q)); if (cache) r.cache (); return r; } }