// 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&); // Session for the current thread. This can be implemented in pretty // much any way that makes sense to the application. It can be a global // session as we have here. In multi-threaded applications we could use // TLS instead. // public: 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; }; enum object_state { tracking, // Tracking any modifications by storing the original copy. changed, // Known to be changed. flushed // Flushed but not yet committed/rolled back. }; template struct object_data { typedef typename odb::object_traits::pointer_type pointer_type; explicit object_data (pointer_type o): obj (o), state (tracking) {} pointer_type obj; pointer_type orig; object_state state; }; template struct object_map: object_map_base, std::map::id_type, object_data > { 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 (): map_ (0) {} position (map& m, const iterator& p): map_ (&m), pos_ (p) {} map* map_; iterator pos_; }; // Cache management. // template static position insert (odb::database&, const typename odb::object_traits::id_type&, const typename odb::object_traits::pointer_type&); template static typename odb::object_traits::pointer_type find (odb::database&, const typename odb::object_traits::id_type&); template static void erase (const position& p) { if (p.map_ != 0) p.map_->erase (p.pos_); } // Notifications. // template static void persist (const position& p) { load (p); } template static void load (const position&); template static void update (odb::database&, const T&); template static void erase (odb::database&, const typename odb::object_traits::id_type&); private: typedef std::map, odb::details::type_info_comparator> type_map; type_map map_; }; #include "session.txx" #endif // SESSION_HXX