diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-04-27 12:55:30 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-04-27 12:55:30 +1000 |
| commit | 5d7cbec34cd5e473d5768b39054d99bc72ddad62 (patch) | |
| tree | f83040e527dc025345b3786a298f11e914b5eb37 /src/database/include/database.hpp | |
| parent | fbe047a35fff100cb5f42d10984bccde137f586e (diff) | |
| download | tangara-fw-5d7cbec34cd5e473d5768b39054d99bc72ddad62.tar.gz | |
Move DB interactions to a background thread
Diffstat (limited to 'src/database/include/database.hpp')
| -rw-r--r-- | src/database/include/database.hpp | 77 |
1 files changed, 60 insertions, 17 deletions
diff --git a/src/database/include/database.hpp b/src/database/include/database.hpp index cb1437df..bc102ca8 100644 --- a/src/database/include/database.hpp +++ b/src/database/include/database.hpp @@ -1,29 +1,85 @@ #pragma once -#include <string> +#include <cstdint> +#include <future> #include <memory> #include <optional> +#include <string> +#include <utility> +#include <vector> #include "leveldb/cache.h" #include "leveldb/db.h" #include "leveldb/iterator.h" +#include "leveldb/slice.h" #include "result.hpp" namespace database { -class Iterator; +struct Artist { + std::string name; +}; + +struct Album { + std::string name; +}; + +typedef uint64_t SongId_t; + +struct Song { + std::string title; + uint64_t id; +}; + +struct SongMetadata {}; + +template <typename T> +class DbResult { + public: + DbResult(const std::vector<T>& values, std::unique_ptr<leveldb::Iterator> it) + : values_(values), it_(std::move(it)) {} + auto values() -> std::vector<T> { return values_; } + auto it() -> leveldb::Iterator* { return it_.release(); }; + + private: + std::vector<T> values_; + std::unique_ptr<leveldb::Iterator> it_; +}; class Database { public: enum DatabaseError { + ALREADY_OPEN, FAILED_TO_OPEN, }; static auto Open() -> cpp::result<Database*, DatabaseError>; ~Database(); - auto Initialise() -> void; - auto ByTitle() -> Iterator; + auto Populate() -> std::future<void>; + + auto GetArtists(std::size_t page_size) -> std::future<DbResult<Artist>>; + auto GetMoreArtists(std::size_t page_size, DbResult<Artist> continuation) + -> std::future<DbResult<Artist>>; + + auto GetAlbums(std::size_t page_size, std::optional<Artist> artist) + -> std::future<DbResult<Album>>; + auto GetMoreAlbums(std::size_t page_size, DbResult<Album> continuation) + -> std::future<DbResult<Album>>; + + auto GetSongs(std::size_t page_size) -> std::future<DbResult<Song>>; + auto GetSongs(std::size_t page_size, std::optional<Artist> artist) + -> std::future<DbResult<Song>>; + auto GetSongs(std::size_t page_size, + std::optional<Artist> artist, + std::optional<Album> album) -> std::future<DbResult<Song>>; + auto GetMoreSongs(std::size_t page_size, DbResult<Song> continuation) + -> std::future<DbResult<Song>>; + + auto GetSongIds(std::optional<Artist> artist, std::optional<Album> album) + -> std::future<std::vector<SongId_t>>; + auto GetSongFilePath(SongId_t id) -> std::future<std::optional<std::string>>; + auto GetSongMetadata(SongId_t id) -> std::future<std::optional<SongMetadata>>; Database(const Database&) = delete; Database& operator=(const Database&) = delete; @@ -35,17 +91,4 @@ class Database { Database(leveldb::DB* db, leveldb::Cache* cache); }; -class Iterator { - public: - explicit Iterator(leveldb::Iterator *it) : it_(it) {} - - auto Next() -> std::optional<std::string>; - - Iterator(const Iterator&) = delete; - Iterator& operator=(const Iterator&) = delete; - - private: - std::unique_ptr<leveldb::Iterator> it_; -}; - } // namespace database |
