summaryrefslogtreecommitdiff
path: root/src/database/include/database.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/database/include/database.hpp')
-rw-r--r--src/database/include/database.hpp77
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