diff options
Diffstat (limited to 'src/database')
| -rw-r--r-- | src/database/database.cpp | 31 | ||||
| -rw-r--r-- | src/database/include/database.hpp | 6 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/database/database.cpp b/src/database/database.cpp index dad983d0..76d3a2ab 100644 --- a/src/database/database.cpp +++ b/src/database/database.cpp @@ -874,6 +874,12 @@ Iterator::Iterator(std::weak_ptr<Database> db, const IndexInfo& idx) Iterator::Iterator(std::weak_ptr<Database> db, const Continuation& c) : db_(db), pos_mutex_(), current_pos_(c), prev_pos_() {} +Iterator::Iterator(const Iterator& other) + : db_(other.db_), + pos_mutex_(), + current_pos_(other.current_pos_), + prev_pos_(other.prev_pos_) {} + auto Iterator::Next(Callback cb) -> void { auto db = db_.lock(); if (!db) { @@ -899,6 +905,31 @@ auto Iterator::Next(Callback cb) -> void { }); } +auto Iterator::NextSync() -> std::optional<IndexRecord> { + auto db = db_.lock(); + if (!db) { + return {}; + } + return db->worker_task_ + ->Dispatch<std::optional<IndexRecord>>( + [=]() -> std::optional<IndexRecord> { + std::lock_guard lock{pos_mutex_}; + if (!current_pos_) { + return {}; + } + std::unique_ptr<Result<IndexRecord>> res{ + db->dbGetPage<IndexRecord>(*current_pos_)}; + prev_pos_ = current_pos_; + current_pos_ = res->next_page(); + if (!res || res->values().empty() || !res->values()[0]) { + ESP_LOGI(kTag, "dropping empty result"); + return {}; + } + return *res->values()[0]; + }) + .get(); +} + auto Iterator::Prev(Callback cb) -> void { auto db = db_.lock(); if (!db) { diff --git a/src/database/include/database.hpp b/src/database/include/database.hpp index e18701eb..36f734b8 100644 --- a/src/database/include/database.hpp +++ b/src/database/include/database.hpp @@ -193,12 +193,18 @@ class Iterator { public: Iterator(std::weak_ptr<Database>, const IndexInfo&); Iterator(std::weak_ptr<Database>, const Continuation&); + Iterator(const Iterator &); + + auto database() const { return db_; } using Callback = std::function<void(std::optional<IndexRecord>)>; auto Next(Callback) -> void; + auto NextSync() -> std::optional<IndexRecord>; + auto Prev(Callback) -> void; + private: auto InvokeNull(Callback) -> void; |
