// file : bpkg/database -*- C++ -*- // copyright : Copyright (c) 2014-2016 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #ifndef BPKG_DATABASE #define BPKG_DATABASE #include // remove_reference #include #include #include #include #include #include #include namespace bpkg { using odb::query; using odb::result; using odb::session; using odb::sqlite::database; using odb::sqlite::transaction; database open (const dir_path& configuration, tracer&, bool create = false); struct tracer_guard { tracer_guard (database& db, tracer& t) : db_ (db), t_ (db.tracer ()) {db.tracer (t);} ~tracer_guard () {db_.tracer (*t_);} private: database& db_; odb::tracer* t_; }; // Range-based for-loop iteration over query result that returns // object pointers. For example: // // for (shared_ptr o: pointer_result (db.query (...))) // template class pointer_result_range { R r_; public: pointer_result_range (R&& r): r_ (forward (r)) {} using base_iterator = typename std::remove_reference::type::iterator; struct iterator: base_iterator { iterator () = default; explicit iterator (base_iterator i): base_iterator (move (i)) {} typename base_iterator::pointer_type operator* () {return this->load ();} }; iterator begin () {return iterator (r_.begin ());} iterator end () {return iterator (r_.end ());} }; template inline pointer_result_range pointer_result (R&& r) { return pointer_result_range (forward (r)); } } #endif // BPKG_DATABASE