summaryrefslogtreecommitdiff
path: root/src/database/database.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-04-27 16:03:55 +1000
committerjacqueline <me@jacqueline.id.au>2023-04-27 16:03:55 +1000
commitcd520b9360f0d0d4ab7582d2cbf2aa96060a0500 (patch)
treeb55e9c4376395e79e3d85fe02e26ec730803d284 /src/database/database.cpp
parent5d7cbec34cd5e473d5768b39054d99bc72ddad62 (diff)
downloadtangara-fw-cd520b9360f0d0d4ab7582d2cbf2aa96060a0500.tar.gz
Make queries a little less copy-paste
Diffstat (limited to 'src/database/database.cpp')
-rw-r--r--src/database/database.cpp41
1 files changed, 16 insertions, 25 deletions
diff --git a/src/database/database.cpp b/src/database/database.cpp
index 8ca72771..2cff51ce 100644
--- a/src/database/database.cpp
+++ b/src/database/database.cpp
@@ -1,4 +1,5 @@
#include "database.hpp"
+#include <functional>
#include "esp_log.h"
#include "ff.h"
@@ -92,34 +93,24 @@ auto Database::Populate() -> std::future<void> {
});
}
-auto Database::GetSongs(std::size_t page_size) -> std::future<DbResult<Song>> {
- return RunOnDbTask<DbResult<Song>>([&]() -> DbResult<Song> {
- std::unique_ptr<leveldb::Iterator> it(
- db_->NewIterator(leveldb::ReadOptions()));
- it->Seek("title:");
- std::vector<Song> results;
- IterateAndParse(it.get(), page_size,
- [&](const leveldb::Slice& key, const leveldb::Slice& val) {
- Song s;
- s.title = key.ToString();
- results.push_back(s);
- });
- return DbResult<Song>(results, std::move(it));
+auto parse_song(const leveldb::Slice& key, const leveldb::Slice& val)
+ -> std::optional<Song> {
+ Song s;
+ s.title = key.ToString();
+ return s;
+}
+
+auto Database::GetSongs(std::size_t page_size) -> std::future<Result<Song>> {
+ return RunOnDbTask<Result<Song>>([=, this]() -> Result<Song> {
+ return Query<Song>("title:", page_size, &parse_song);
});
}
-auto Database::GetMoreSongs(std::size_t page_size, DbResult<Song> continuation)
- -> std::future<DbResult<Song>> {
- return RunOnDbTask<DbResult<Song>>([&]() -> DbResult<Song> {
- std::unique_ptr<leveldb::Iterator> it(continuation.it());
- std::vector<Song> results;
- IterateAndParse(it.get(), page_size,
- [&](const leveldb::Slice& key, const leveldb::Slice& val) {
- Song s;
- s.title = key.ToString();
- results.push_back(s);
- });
- return DbResult<Song>(results, std::move(it));
+auto Database::GetMoreSongs(std::size_t page_size, Continuation c)
+ -> std::future<Result<Song>> {
+ leveldb::Iterator* it = c.release();
+ return RunOnDbTask<Result<Song>>([=, this]() -> Result<Song> {
+ return Query<Song>(it, page_size, &parse_song);
});
}