// file : common/session/custom/session.hxx // copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #ifndef SESSION_HXX #define SESSION_HXX #include #include #include #include #include // odb::object_traits #include // odb::details::type_info_comparator // This custom session implementation assumes we are working with // one database at a time. // class session { public: session (); ~session (); private: session (const session&); session& operator= (const session&); // Current session interface. // public: static bool has_current (); static session& current (); // Change tracking interface. // // Call flush() within a transaction to apply the changes to the // database. Then after successfully committing the transaction, // call mark() to mark all the changed objects as again unchanged. // public: void flush (odb::database&); void mark (); private: struct object_map_base { virtual ~object_map_base () {} virtual void flush (odb::database&) = 0; virtual void mark () = 0; }; template struct object_state { typedef typename odb::object_traits::pointer_type pointer_type; explicit object_state (pointer_type o): obj (o), flushed_ (false) {} pointer_type obj; pointer_type orig; bool flushed_; }; template struct object_map: object_map_base, std::map::id_type, object_state > { virtual void flush (odb::database&); virtual void mark (); }; // Object cache interface. // public: template struct position { typedef object_map map; typedef typename map::iterator iterator; position () {} position (map& m, const iterator& p): map_ (&m), pos_ (p) {} map* map_; iterator pos_; }; template position insert (odb::database&, const typename odb::object_traits::id_type&, const typename odb::object_traits::pointer_type&); template static void initialize (const position&); template typename odb::object_traits::pointer_type find (odb::database&, const typename odb::object_traits::id_type&) const; template void erase (odb::database&, const typename odb::object_traits::id_type&); template static void erase (const position& p) { p.map_->erase (p.pos_); } private: typedef std::map, odb::details::type_info_comparator> type_map; type_map map_; }; #include "session.txx" #endif // SESSION_HXX