// file : odb/database.txx // author : Boris Kolpackov // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #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::persist (*this, obj); const typename object_traits::id_type& id (object_traits::id (obj)); reference_cache_traits::insert (*this, id, obj); return id; } 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::persist (*this, obj); const typename object_traits::id_type& id (object_traits::id (obj)); pointer_cache_traits::insert (*this, id, pobj); return id; } template typename object_traits::pointer_type database:: load (const typename object_traits::id_type& id) { 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 typename object_traits::pointer_type database:: find (const typename object_traits::id_type& id) { // 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; // 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 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 (); 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::update (*this, obj); } 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 (); object_traits::update (*this, pointer_traits::get_ref (pobj)); } template void database:: erase (const typename object_traits::id_type& id) { // 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; if (!transaction::has_current ()) throw not_in_transaction (); object_traits::erase (*this, id); pointer_cache_traits::erase (*this, id); } template result database:: query (const odb::query::object_type>& q, bool cache) { // 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 (); result r (object_traits::template query (*this, q)); if (cache) r.cache (); return r; } }