From 738050f2a71b2f0d094a692cc48c94653b82287f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 22 Sep 2015 13:41:54 +0200 Subject: Implement rep-fetch command --- bpkg/database | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'bpkg/database') diff --git a/bpkg/database b/bpkg/database index 05ffb04..f7de4d5 100644 --- a/bpkg/database +++ b/bpkg/database @@ -5,6 +5,9 @@ #ifndef BPKG_DATABASE #define BPKG_DATABASE +#include // forward() + +#include #include #include @@ -12,6 +15,8 @@ namespace bpkg { + using odb::session; + using odb::sqlite::database; using odb::sqlite::transaction; @@ -28,6 +33,43 @@ namespace bpkg 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_ (std::forward (r)) {} + + using base_iterator = typename R::iterator; + + struct iterator: base_iterator + { + iterator () = default; + + explicit + iterator (base_iterator i): base_iterator (std::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 (std::forward (r)); + } } #endif // BPKG_DATABASE -- cgit v1.1