From 26e36b3a9d7b49d46ecfa69b447482251acba8ac Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 24 Jan 2024 16:53:38 +0300 Subject: Turn libodb repository into package for muti-package repository --- libodb/odb/cache-traits.hxx | 182 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 libodb/odb/cache-traits.hxx (limited to 'libodb/odb/cache-traits.hxx') diff --git a/libodb/odb/cache-traits.hxx b/libodb/odb/cache-traits.hxx new file mode 100644 index 0000000..a8cf750 --- /dev/null +++ b/libodb/odb/cache-traits.hxx @@ -0,0 +1,182 @@ +// file : odb/cache-traits.hxx +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_CACHE_TRAITS_HXX +#define ODB_CACHE_TRAITS_HXX + +#include + +#include +#include +#include +#include +#include + +namespace odb +{ + // pointer_cache_traits + // + // Caching traits for objects passed by pointer. P should be the canonical + // pointer (non-const). + // + template + struct pointer_cache_traits_impl + { + typedef P pointer_type; + typedef S session_type; + typedef odb::pointer_traits pointer_traits; + typedef typename pointer_traits::element_type object_type; + typedef typename object_traits::id_type id_type; + typedef typename session_type::template cache_position + position_type; + + struct insert_guard + { + insert_guard () {} + insert_guard (const position_type& pos): pos_ (pos) {} + ~insert_guard () {session_type::_cache_erase (pos_);} + + const position_type& + position () const {return pos_;} + + void + release () {pos_ = position_type ();} + + // Note: doesn't call erase() on the old position (assumes empty). + // + void + reset (const position_type& pos) {pos_ = pos;} + + private: + position_type pos_; + }; + + // Cache management. + // + // We need the insert() overload with explicit id to handle self- + // references. In such cases the object is not yet loaded and the + // id member does not contain the correct id. + // + // Qualify the database type to resolve a phony ambiguity in VC 10. + // + static position_type + insert (odb::database& db, const id_type& id, const pointer_type& p) + { + return session_type::template _cache_insert (db, id, p); + } + + static position_type + insert (odb::database& db, const pointer_type& p) + { + const id_type& id ( + object_traits::id ( + pointer_traits::get_ref (p))); + + return session_type::template _cache_insert (db, id, p); + } + + static pointer_type + find (odb::database& db, const id_type& id) + { + return session_type::template _cache_find (db, id); + } + + static void + erase (const position_type& p) + { + session_type::template _cache_erase (p); + } + + // Notifications. + // + static void + persist (const position_type& p) + { + session_type::template _cache_persist (p); + } + + static void + load (const position_type& p) + { + session_type::template _cache_load (p); + } + + static void + update (odb::database& db, const object_type& obj) + { + session_type::template _cache_update (db, obj); + } + + static void + erase (odb::database& db, const id_type& id) + { + session_type::template _cache_erase (db, id); + } + }; + + // Unique pointers don't work with the object cache. + // + template + struct pointer_cache_traits_impl: + no_op_pointer_cache_traits

{}; + + template + struct pointer_cache_traits: + pointer_cache_traits_impl::kind> {}; + + // reference_cache_traits + // + // Caching traits for objects passed by reference. T should be the + // canonical object type (non-const). Only if the object pointer + // kind is raw do we add the object to the session. + // + template + struct reference_cache_traits_impl: no_op_reference_cache_traits {}; + + template + struct reference_cache_traits_impl + { + typedef T object_type; + typedef typename object_traits::pointer_type pointer_type; + typedef typename object_traits::id_type id_type; + + typedef pointer_cache_traits pointer_traits; + typedef typename pointer_traits::position_type position_type; + typedef typename pointer_traits::insert_guard insert_guard; + + static position_type + insert (odb::database& db, const id_type& id, object_type& obj) + { + pointer_type p (&obj); + return pointer_traits::insert (db, id, p); + } + + static position_type + insert (odb::database& db, object_type& obj) + { + pointer_type p (&obj); + return pointer_traits::insert (db, p); + } + + static void + persist (const position_type& p) + { + pointer_traits::persist (p); + } + + static void + load (const position_type& p) + { + pointer_traits::load (p); + } + }; + + template + struct reference_cache_traits: + reference_cache_traits_impl< + T, S, pointer_traits::pointer_type>::kind> {}; +} + +#include + +#endif // ODB_CACHE_TRAITS_HXX -- cgit v1.1