summaryrefslogtreecommitdiff
path: root/src/database
diff options
context:
space:
mode:
Diffstat (limited to 'src/database')
-rw-r--r--src/database/database.cpp31
-rw-r--r--src/database/include/database.hpp6
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;