From 09c0e1608f2d88f56d8bf87ff90482459376ad95 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 23 Nov 2023 14:08:46 +1100 Subject: Implement adding to the playback queue from lua --- src/database/database.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/database/database.cpp') 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 db, const IndexInfo& idx) Iterator::Iterator(std::weak_ptr 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 { + auto db = db_.lock(); + if (!db) { + return {}; + } + return db->worker_task_ + ->Dispatch>( + [=]() -> std::optional { + std::lock_guard lock{pos_mutex_}; + if (!current_pos_) { + return {}; + } + std::unique_ptr> res{ + db->dbGetPage(*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) { -- cgit v1.2.3