#pragma once #include #include #include #include #include #include #include struct LinkItem { enum Visibility {PUBLIC, PRIVATE}; static std::string visibilityToStr(Visibility v); int64_t id; int64_t owner_id; // Top-level items don’t have parents. std::optional parent_id; std::string name; // If this is empty, it’s a parent. std::string url; std::string description; Visibility visibility; mw::Time time; }; struct User { int64_t id; std::string openid_uid; std::string name; }; class DataSourceInterface { public: virtual ~DataSourceInterface() = default; // The schema version is the version of the database. It starts // from 1. Every time the schema change, someone should increase // this number by 1, manually, by hand. The intended use is to // help with database migration. virtual mw::E getSchemaVersion() const = 0; virtual mw::E> userByOpenIDUID(const std::string& uid) const = 0; virtual mw::E addUser(User&& u) const = 0; virtual mw::E> userByID(const int64_t) const = 0; virtual mw::E> userByName(const std::string& name) const = 0; virtual mw::E> itemByID(int64_t id) const = 0; // Get all children of “parent”. virtual mw::E> itemsByParent(int64_t parent) const = 0; // Get all top-level items owned by “username”. virtual mw::E> itemsTopLevelByUser(int64_t user_id) const = 0; virtual mw::E addLink(LinkItem&& link) const = 0; protected: virtual mw::E setSchemaVersion(int64_t v) const = 0; }; class DataSourceSQLite : public DataSourceInterface { public: explicit DataSourceSQLite(std::unique_ptr conn) : db(std::move(conn)) {} ~DataSourceSQLite() override = default; static mw::E> fromFile(const std::string& db_file); static mw::E> newFromMemory(); mw::E getSchemaVersion() const override; mw::E> userByOpenIDUID(const std::string& uid) const override; mw::E addUser(User&& u) const override; mw::E> userByID(const int64_t) const override; mw::E> userByName(const std::string& name) const override; mw::E> itemByID(int64_t id) const override; mw::E> itemsByParent(int64_t parent) const override; mw::E> itemsTopLevelByUser(int64_t user_id) const override; mw::E addLink(LinkItem&& link) const override; // Do not use. DataSourceSQLite() = default; protected: mw::E setSchemaVersion(int64_t v) const override; private: std::unique_ptr db; };