// file : odb/sqlite/database.hxx // copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #ifndef ODB_SQLITE_DATABASE_HXX #define ODB_SQLITE_DATABASE_HXX #include #include #include #include // std::auto_ptr, std::unique_ptr #include // std::ostream #include #include #include #include #include #include #include #include #include #include #include namespace odb { namespace sqlite { class transaction_impl; class LIBODB_SQLITE_EXPORT database: public odb::database { public: database (const std::string& name, int flags = SQLITE_OPEN_READWRITE, bool foreign_keys = true, const std::string& vfs = "", details::transfer_ptr = details::transfer_ptr ()); #ifdef _WIN32 database (const std::wstring& name, int flags = SQLITE_OPEN_READWRITE, bool foreign_keys = true, const std::string& vfs = "", details::transfer_ptr = details::transfer_ptr ()); #endif // Extract the database parameters from the command line. The // following options are recognized: // // --database // --create // --read-only // --options-file // // For more information, see the output of the print_usage() function // below. If erase is true, the above options are removed from the argv // array and the argc count is updated accordingly. The command line // options override the flags passed as an argument. This constructor // may throw the cli_exception exception. // database (int& argc, char* argv[], bool erase = false, int flags = SQLITE_OPEN_READWRITE, bool foreign_keys = true, const std::string& vfs = "", details::transfer_ptr = details::transfer_ptr ()); static void print_usage (std::ostream&); public: const std::string& name () const { return name_; } int flags () const { return flags_; } bool foreign_keys () const { return foreign_keys_; } const std::string& vfs () const { return vfs_; } // Object persistence API. // public: // Make the object persistent. // template typename object_traits::id_type persist (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); // 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); // 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); // 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); // 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 sqlite::query_base&); template unsigned long long erase_query (const odb::query_base&); // Query API. // template result query (); template result query (const char*); template result query (const std::string&); template result query (const sqlite::query_base&); template result query (const odb::query_base&); // 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 sqlite::query_base&); template prepared_query prepare_query (const char* name, const odb::query_base&); // Transactions. // public: virtual transaction_impl* begin (); transaction_impl* begin_immediate (); transaction_impl* begin_exclusive (); public: connection_ptr connection (); // SQL statement tracing. // public: typedef sqlite::tracer tracer_type; void tracer (tracer_type& t) { odb::database::tracer (t); } void tracer (tracer_type* t) { odb::database::tracer (t); } using odb::database::tracer; public: // Database id constant (useful for meta-programming). // static const odb::database_id database_id = id_sqlite; public: virtual ~database (); protected: virtual odb::connection* connection_ (); private: std::string name_; int flags_; bool foreign_keys_; std::string vfs_; details::unique_ptr factory_; }; } } #include #include #endif // ODB_SQLITE_DATABASE_HXX