Task #3147
Updated by Zhiyi Zhang over 8 years ago
To manage members and schedules in GroupManager, we need a database to store these informations. GroupManagerDB is used to manage the database of GroupManager. GroupManagerDB uses SQLITE as the database. Here is the draft database design : CREATE TABLE IF NOT EXISTS schedules( schedule_id INTEGER PRIMARY KEY, schedule_name TEXT NOT NULL, schedule BLOB NOT NULL ); CREATE UNIQUE INDEX IF NOT EXISTS scheduleNameIndex ON schedules(schedule_name); CREATE TABLE IF NOT EXISTS members( member_id INTEGER PRIMARY KEY, schedule_id INTEGER NOT NULL, member_name BLOB NOT NULL, member_cert BLOB NOT NULL, FOREIGN KEY(schedule_id) REFERENCES schedules(id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX IF NOT EXISTS memNameIndex ON members(member_name); Here is the daft abstraction of GroupManagerDB : class GroupManagerDB { public: class Error : public std::runtime_error { public: explicit Error(const std::string& what) : std::runtime_error(what) { } }; public: GroupManagerDB(); explicit GroupManagerDB(const Name& managerNamespace, const std::string dbDir = "", ); ""); public: ////////////////////////////////////////////////////// // schedule management /// @brief Check if there is a schedule by name @p name bool hasSchedule(const std::string& name) const; /// @brief List all the names of the schedules std::list<std::string> listAllScheduleNames() const; /// @brief Get schedule by name @p name Schedule getSchedule(const std::string& name) const; /// @brief Get member identities of a schedule named @p name std::list<Name> getScheduleMembers(const std::string& name) const; /// @brief Add a schedule @p schedule with the name @p name to DB bool addSchedule(const Schedule& schedule, const std::string& name, const Schedule& schedule); name); /// @brief Delete the schedule by name @p name bool deleteSchedule(const std::string& name); /// @brief Update the schedule name bool updateScheduleName(const std::string& old, const std::string& new); /// @brief Update the schedule by name @p name bool updateSchedule(const std::string& name, const Schedule& schedule); ////////////////////////////////////////////////////// // member management /// @brief Check if there is a member by identity @p identity bool hasMember(const Name& identity) const; /// @brief List all the members std::list<Name> listAllMembers() const; /// @brief Get the certificate of the member by identity @p identity Data getMemberCert(const Name& identity) const; /// @brief Get the schedule name of the member std::string getMemberSchedule(const Name& identity) const; /// @brief Add a new member bool addMember(const Data& certificate, const std::string& scheduleName, const Data& certificate); scheduleName); /// @brief Update a member to change the schedule of this member bool updateMemberSchedule(const Name& identity, const std::string& schedule); private: /// @brief Hide the database in the class Impl class Impl; unique_ptr<Impl> m_impl; sqlite3* m_database; };