aboutsummaryrefslogtreecommitdiff
path: root/bpkg/database
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-09-22 13:41:54 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-09-22 13:41:54 +0200
commit738050f2a71b2f0d094a692cc48c94653b82287f (patch)
tree874b79e5017be0aefde4f9427ecf6fc95cbe36be /bpkg/database
parent221f0250fcd7cba4fa4b5e4fd6c0d410eb6e5811 (diff)
Implement rep-fetch command
Diffstat (limited to 'bpkg/database')
-rw-r--r--bpkg/database42
1 files changed, 42 insertions, 0 deletions
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 <utility> // forward()
+
+#include <odb/session.hxx>
#include <odb/sqlite/database.hxx>
#include <bpkg/types>
@@ -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<object> o: pointer_result (db.query<object> (...)))
+ //
+ template <typename R>
+ class pointer_result_range
+ {
+ R r_;
+
+ public:
+ pointer_result_range (R&& r): r_ (std::forward<R> (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 <typename R>
+ inline pointer_result_range<R>
+ pointer_result (R&& r)
+ {
+ return pointer_result_range<R> (std::forward<R> (r));
+ }
}
#endif // BPKG_DATABASE