diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-04-27 16:03:55 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-04-27 16:03:55 +1000 |
| commit | cd520b9360f0d0d4ab7582d2cbf2aa96060a0500 (patch) | |
| tree | b55e9c4376395e79e3d85fe02e26ec730803d284 /src/database/database.cpp | |
| parent | 5d7cbec34cd5e473d5768b39054d99bc72ddad62 (diff) | |
| download | tangara-fw-cd520b9360f0d0d4ab7582d2cbf2aa96060a0500.tar.gz | |
Make queries a little less copy-paste
Diffstat (limited to 'src/database/database.cpp')
| -rw-r--r-- | src/database/database.cpp | 41 |
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); }); } |
