diff --git a/iFacility/db/database.cpp b/iFacility/db/database.cpp new file mode 100644 index 0000000..d0ed8d3 --- /dev/null +++ b/iFacility/db/database.cpp @@ -0,0 +1,79 @@ +#include "database.h" + +Database *Database::mInstance = new Database(); +const QString Database::mFilename = "data.bin"; + +Database* Database::instance() { + return Database::mInstance; +} + +QVector Database::professions() const { + return mProfessions; +} + +QVector Database::users() const { + return mUsers; +} + +bool Database::addUser(User usr) { + if (getUser(usr.getLogin()) != nullptr) { + return false; + } + mUsers.push_back(usr); + return true; +} + +QVector Database::findUserByPredicat(UserPredicat predicat) { + QVector out; + auto it = mUsers.begin(); + while (it != mUsers.end()) { + it = std::find_if(it, mUsers.end(), predicat); + if (it != mUsers.end()) { + out.push_back(it++); + } + } + return out; +} + +User* Database::getUser(UID uid) { + auto pred = [uid](User u) { return u.uID() == uid; }; + auto users = findUserByPredicat(pred); + return users.isEmpty()? nullptr : users[0]; +} + +User* Database::getUser(QString login) { + auto pred = [login](User u) { return u.getLogin() == login; }; + auto users = findUserByPredicat(pred); + return users.isEmpty()? nullptr : users[0]; +} + +QVector Database::getUsersByType(UserType type) { + auto pred = [type](User u) { return u.getUserType() == type; }; + return findUserByPredicat(pred); +} + +QVector Database::getUsersByProfession(Profession prof) { + auto pred = [prof](User u) { return u.hasProfession(prof.pID()); }; + return findUserByPredicat(pred); +} + +void Database::save() { + QFile f(Database::mFilename); + f.open(QIODevice::ReadOnly); + QDataStream stream(&f); + stream << mProfessions << mUsers; + f.close(); +} + +void Database::load() { + if (!QFile().exists(Database::mFilename)) { + return; + } + mUsers.clear(); + mProfessions.clear(); + QFile f(Database::mFilename); + f.open(QIODevice::WriteOnly); + QDataStream stream(&f); + stream >> mProfessions >> mUsers; + f.close(); +} diff --git a/iFacility/db/database.h b/iFacility/db/database.h new file mode 100644 index 0000000..73f09a0 --- /dev/null +++ b/iFacility/db/database.h @@ -0,0 +1,45 @@ +#ifndef DATABASE_H +#define DATABASE_H + +#include +#include + +#include +#include +#include +#include + +#include "../objects/profession.h" +#include "../objects/user.h" + +typedef std::function UserPredicat; + +class Database { +private: + static Database *mInstance; + static const QString mFilename; + + Database() = default; + QVector mProfessions; + QVector mUsers; + + QVector findUserByPredicat(UserPredicat predicat); + +public: + static Database* instance(); + QVector professions() const; + QVector users() const; + + bool addUser(User usr); + User* getUser(UID uid); + User* getUser(QString login); + QVector getUsersByType(UserType type); + QVector getUsersByProfession(Profession prof); + + Profession* getProfession(PID pid); + + void save(); + void load(); +}; + +#endif // DATABASE_H diff --git a/iFacility/iFacility.pro b/iFacility/iFacility.pro index a31255d..b909493 100644 --- a/iFacility/iFacility.pro +++ b/iFacility/iFacility.pro @@ -13,13 +13,15 @@ SOURCES += \ loginwindow.cpp \ objects/profession.cpp \ objects/user.cpp \ - objects/userprofession.cpp + objects/userprofession.cpp \ + db/database.cpp HEADERS += \ loginwindow.h \ objects/profession.h \ objects/user.h \ - objects/userprofession.h + objects/userprofession.h \ + db/database.h FORMS += \ loginwindow.ui diff --git a/iFacility/objects/profession.h b/iFacility/objects/profession.h index 05ff91a..08e1310 100644 --- a/iFacility/objects/profession.h +++ b/iFacility/objects/profession.h @@ -12,9 +12,9 @@ private: PID mPID; QString mTitle; +public: Profession() = default; -public: QString title() const; PID pID() const;