#pragma once #include #include #include #include #include #include #include struct LinkItem { enum Visibility {PUBLIC, PRIVATE}; 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> items(std::optional parent) = 0; virtual mw::E addLink(LinkItem&& link) = 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> items(std::optional parent) override; mw::E addLink(LinkItem&& link) override; // Do not use. DataSourceSQLite() = default; protected: mw::E setSchemaVersion(int64_t v) const override; private: std::unique_ptr db; };