// file : odb/database.hxx // copyright : Copyright (c) 2009-2015 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #ifndef ODB_DATABASE_HXX #define ODB_DATABASE_HXX #include #include // ODB_CXX11 #include #include #include // std::auto_ptr, std::unique_ptr #include // std::size_t #ifdef ODB_CXX11 # include // std::move # include // std::function # include // std::enable_if, std::is_convertible #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace odb { class transaction_impl; class LIBODB_EXPORT database { public: virtual ~database (); #ifdef ODB_CXX11 //database (database&&) = default; // VC 2013 database (database&& d) : id_ (d.id_), tracer_ (d.tracer_), query_factory_map_ (std::move (d.query_factory_map_)), mutex_ (std::move (d.mutex_)), schema_version_map_ (std::move (d.schema_version_map_)), schema_version_table_ (std::move (d.schema_version_table_)), schema_version_seq_ (d.schema_version_seq_) { } #endif private: database (const database&); database& operator= (const database&); #ifdef ODB_CXX11 database& operator= (const database&&); #endif // Object persistence API. // public: // Make the object persistent. // template typename object_traits::id_type persist (T& object); template typename object_traits::id_type persist (const T& object); template typename object_traits::id_type persist (T* obj_ptr); template class P> typename object_traits::id_type persist (const P& obj_ptr); template class P> typename object_traits::id_type persist (const P& obj_ptr); template class P> typename object_traits::id_type persist (P& obj_ptr); template class P> typename object_traits::id_type persist (P& obj_ptr); template typename object_traits::id_type persist (const typename object_traits::pointer_type& obj_ptr); // Bulk persist. Can be a range of references or pointers (including // smart pointers) to objects. // template void persist (I begin, I end, bool continue_failed = true); // Load an object. Throw object_not_persistent if not found. // template typename object_traits::pointer_type load (const typename object_traits::id_type& id); template void load (const typename object_traits::id_type& id, T& object); // Load (or reload, if it is already loaded) a section of an object. // template void load (T& object, section&); // Reload an object. // template void reload (T& object); template void reload (T* obj_ptr); template class P> void reload (const P& obj_ptr); template class P> void reload (const P& obj_ptr); template class P> void reload (P& obj_ptr); template class P> void reload (P& obj_ptr); template void reload (const typename object_traits::pointer_type& obj_ptr); // Loan an object if found. Return NULL/false if not found. // template typename object_traits::pointer_type find (const typename object_traits::id_type& id); template bool find (const typename object_traits::id_type& id, T& object); // Update the state of a modified objects. // template void update (T& object); template void update (T* obj_ptr); template class P> void update (const P& obj_ptr); template class P> void update (const P& obj_ptr); template class P> void update (P& obj_ptr); template class P> void update (P& obj_ptr); template void update (const typename object_traits::pointer_type& obj_ptr); // Bulk update. Can be a range of references or pointers (including // smart pointers) to objects. // template void update (I begin, I end, bool continue_failed = true); // Update a section of an object. Throws section_not_loaded exception // if section is not loaded. Note also that this function does not // clear the changed flag if it is set. // template void update (const T& object, const section&); // Make the object transient. Throw object_not_persistent if not // found. // template void erase (const typename object_traits::id_type& id); template void erase (T& object); template void erase (T* obj_ptr); template class P> void erase (const P& obj_ptr); template class P> void erase (const P& obj_ptr); template class P> void erase (P& obj_ptr); template class P> void erase (P& obj_ptr); template void erase (const typename object_traits::pointer_type& obj_ptr); // Bulk erase. // template void erase (I id_begin, I id_end, bool continue_failed = true); // Can be a range of references or pointers (including smart pointers) // to objects. // template void erase (I obj_begin, I obj_end, bool continue_failed = true); // Erase multiple objects matching a query predicate. // template unsigned long long erase_query (); template unsigned long long erase_query (const char*); template unsigned long long erase_query (const std::string&); template unsigned long long erase_query (const odb::query&); // Query API. // template result query (bool cache = true); template result query (const char*, bool cache = true); template result query (const std::string&, bool cache = true); template result query (const odb::query&, bool cache = true); // Query one API. // template typename result::pointer_type query_one (); template bool query_one (T& object); template T query_value (); template typename result::pointer_type query_one (const char*); template bool query_one (const char*, T& object); template T query_value (const char*); template typename result::pointer_type query_one (const std::string&); template bool query_one (const std::string&, T& object); template T query_value (const std::string&); template typename result::pointer_type query_one (const odb::query&); template bool query_one (const odb::query&, T& object); template T query_value (const odb::query&); // Query preparation. // template prepared_query prepare_query (const char* name, const char*); template prepared_query prepare_query (const char* name, const std::string&); template prepared_query prepare_query (const char* name, const odb::query&); template void cache_query (const prepared_query&); #ifdef ODB_CXX11 template void cache_query (const prepared_query&, std::unique_ptr

params); #else template void cache_query (const prepared_query&, std::auto_ptr

params); #endif template prepared_query lookup_query (const char* name) const; template prepared_query lookup_query (const char* name, P*& params) const; // Prepared query factory. // public: typedef odb::connection connection_type; typedef void query_factory_type (const char* name, connection_type&); typedef query_factory_type* query_factory_ptr; typedef details::function_wrapper< query_factory_type> query_factory_wrapper; #ifndef ODB_CXX11 void query_factory (const char* name, query_factory_ptr); #else template typename std::enable_if< std::is_convertible< F, std::function>::value, void>::type query_factory (const char* name, F f) { query_factory (name, query_factory_wrapper (std::move (f))); } #endif bool call_query_factory (const char* name, connection_type&) const; private: void query_factory (const char* name, query_factory_wrapper); // Native database statement execution. // public: unsigned long long execute (const char* statement); unsigned long long execute (const std::string& statement); unsigned long long execute (const char* statement, std::size_t length); // Transactions. // public: virtual transaction_impl* begin () = 0; // Connections. // public: connection_ptr connection (); // SQL statement tracing. // public: typedef odb::tracer tracer_type; void tracer (tracer_type&); void tracer (tracer_type*); tracer_type* tracer () const; // Database schema version. // public: typedef odb::schema_version schema_version_type; typedef odb::schema_version_migration schema_version_migration_type; schema_version_type schema_version (const std::string& schema_name = "") const; bool schema_migration (const std::string& schema_name = "") const; // Note that there is code that relies on the returned reference // being valid until the version is changed or the database instance // is destroyed. // const schema_version_migration_type& schema_version_migration (const std::string& schema_name = "") const; // Set schema version and migration state manually. // // Note that the modifier API is not thread-safe. That is, you should // not modify the schema version while other threads may be accessing // or modifying the same information. // void schema_version_migration (schema_version_type, bool migration, const std::string& schema_name = ""); void schema_version_migration (const schema_version_migration_type&, const std::string& schema_name = ""); // Set default schema version table for all the schema names. The table // name should already be quoted if necessary. // void schema_version_table (const std::string& table_name); // Set schema version table for a specific schema. // void schema_version_table (const std::string& table_name, const std::string& schema_name); // Schema version sequence number. It is incremented every time the // schema version or migration flag is changed and can be used to // detect overall version changes. The starting value is 1. // unsigned int schema_version_sequence () const; protected: struct schema_version_info: schema_version_migration_type { std::string version_table; }; virtual const schema_version_info& load_schema_version (const std::string& schema_name) const = 0; private: const schema_version_info& schema_version_migration_ (const std::string& schema_name) const; // Database id. // public: database_id id () const; protected: database (database_id); protected: virtual connection_type* connection_ () = 0; protected: template typename object_traits::id_type persist_ (T&); template typename object_traits::id_type persist_ (const typename object_traits::pointer_type&); template void persist_ (I, I, bool); template void persist_ (I, I, bool, details::meta::no ptr); template void persist_ (I, I, bool, details::meta::yes ptr); template typename object_traits::pointer_type load_ (const typename object_traits::id_type&); template void load_ (const typename object_traits::id_type&, T&); template void load_ (T&, section&); template void reload_ (T&); template typename object_traits::pointer_type find_ (const typename object_traits::id_type&); template bool find_ (const typename object_traits::id_type&, T&); template void update_ (T&); template void update_ (const typename object_traits::pointer_type&); template void update_ (I, I, bool); template void update_ (const T&, const section&); template void erase_ (const typename object_traits::id_type&); template void erase_ (T&); template void erase_ (const typename object_traits::pointer_type&); template void erase_id_ (I, I, bool); template void erase_object_ (I, I, bool); template typename result::pointer_type query_one_ (const Q&); template bool query_one_ (const Q&, T&); template T query_value_ (const Q&); template ::kind> struct query_; protected: typedef std::map query_factory_map; typedef std::map schema_version_map; database_id id_; tracer_type* tracer_; query_factory_map query_factory_map_; details::unique_ptr mutex_; // Dynamic for move support. mutable schema_version_map schema_version_map_; std::string schema_version_table_; unsigned int schema_version_seq_; }; } #include #include #include #endif // ODB_DATABASE_HXX