#pragma once #include #include #include #include #include #include #include #include "leveldb/cache.h" #include "leveldb/db.h" #include "leveldb/iterator.h" #include "leveldb/slice.h" #include "result.hpp" namespace database { 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 class DbResult { public: DbResult(const std::vector& values, std::unique_ptr it) : values_(values), it_(std::move(it)) {} auto values() -> std::vector { return values_; } auto it() -> leveldb::Iterator* { return it_.release(); }; private: std::vector values_; std::unique_ptr it_; }; class Database { public: enum DatabaseError { ALREADY_OPEN, FAILED_TO_OPEN, }; static auto Open() -> cpp::result; ~Database(); auto Populate() -> std::future; auto GetArtists(std::size_t page_size) -> std::future>; auto GetMoreArtists(std::size_t page_size, DbResult continuation) -> std::future>; auto GetAlbums(std::size_t page_size, std::optional artist) -> std::future>; auto GetMoreAlbums(std::size_t page_size, DbResult continuation) -> std::future>; auto GetSongs(std::size_t page_size) -> std::future>; auto GetSongs(std::size_t page_size, std::optional artist) -> std::future>; auto GetSongs(std::size_t page_size, std::optional artist, std::optional album) -> std::future>; auto GetMoreSongs(std::size_t page_size, DbResult continuation) -> std::future>; auto GetSongIds(std::optional artist, std::optional album) -> std::future>; auto GetSongFilePath(SongId_t id) -> std::future>; auto GetSongMetadata(SongId_t id) -> std::future>; Database(const Database&) = delete; Database& operator=(const Database&) = delete; private: std::unique_ptr db_; std::unique_ptr cache_; Database(leveldb::DB* db, leveldb::Cache* cache); }; } // namespace database