summaryrefslogtreecommitdiff
path: root/src/database/include
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-12-05 11:36:34 +1100
committerjacqueline <me@jacqueline.id.au>2023-12-05 11:36:34 +1100
commit4f5422e906b1d17720592d97bc0d5e82a71b1e5f (patch)
tree4e8116510d57fb54c30fc18f1fe591a9aff4e3a0 /src/database/include
parent67f2f2de8393951d2eabac26f9afab2dc9388713 (diff)
downloadtangara-fw-4f5422e906b1d17720592d97bc0d5e82a71b1e5f.tar.gz
Rewrite the track queue to work directly with database iterators
Diffstat (limited to 'src/database/include')
-rw-r--r--src/database/include/database.hpp29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/database/include/database.hpp b/src/database/include/database.hpp
index 36f734b8..263153fb 100644
--- a/src/database/include/database.hpp
+++ b/src/database/include/database.hpp
@@ -12,6 +12,7 @@
#include <future>
#include <memory>
#include <optional>
+#include <stack>
#include <string>
#include <utility>
#include <vector>
@@ -168,6 +169,8 @@ class Database {
template <typename T>
auto dbGetPage(const Continuation& c) -> Result<T>*;
+ auto dbCount(const Continuation& c) -> size_t;
+
template <typename T>
auto ParseRecord(const leveldb::Slice& key, const leveldb::Slice& val)
-> std::shared_ptr<T>;
@@ -193,7 +196,9 @@ class Iterator {
public:
Iterator(std::weak_ptr<Database>, const IndexInfo&);
Iterator(std::weak_ptr<Database>, const Continuation&);
- Iterator(const Iterator &);
+ Iterator(const Iterator&);
+
+ Iterator& operator=(const Iterator& other);
auto database() const { return db_; }
@@ -204,8 +209,13 @@ class Iterator {
auto Prev(Callback) -> void;
+ auto PeekSync() -> std::optional<IndexRecord>;
+
+ auto Size() const -> size_t;
private:
+ friend class TrackIterator;
+
auto InvokeNull(Callback) -> void;
std::weak_ptr<Database> db_;
@@ -215,4 +225,21 @@ class Iterator {
std::optional<Continuation> prev_pos_;
};
+class TrackIterator {
+ public:
+ TrackIterator(const Iterator&);
+ TrackIterator(const TrackIterator&);
+
+ TrackIterator& operator=(TrackIterator&& other);
+
+ auto Next() -> std::optional<TrackId>;
+ auto Size() const -> size_t;
+
+ private:
+ auto NextLeaf() -> void;
+
+ std::weak_ptr<Database> db_;
+ std::vector<Iterator> levels_;
+};
+
} // namespace database