Add DB serialization and user bindings

This commit is contained in:
E. Kozlovskaya 2021-01-04 18:54:15 +07:00
parent 0871eaad37
commit 462bd42521
4 changed files with 129 additions and 3 deletions

79
iFacility/db/database.cpp Normal file
View file

@ -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<Profession> Database::professions() const {
return mProfessions;
}
QVector<User> Database::users() const {
return mUsers;
}
bool Database::addUser(User usr) {
if (getUser(usr.getLogin()) != nullptr) {
return false;
}
mUsers.push_back(usr);
return true;
}
QVector<User*> Database::findUserByPredicat(UserPredicat predicat) {
QVector<User*> 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<User*> Database::getUsersByType(UserType type) {
auto pred = [type](User u) { return u.getUserType() == type; };
return findUserByPredicat(pred);
}
QVector<User*> 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();
}

45
iFacility/db/database.h Normal file
View file

@ -0,0 +1,45 @@
#ifndef DATABASE_H
#define DATABASE_H
#include <algorithm>
#include <functional>
#include <QFile>
#include <QDataStream>
#include <QVector>
#include <QString>
#include "../objects/profession.h"
#include "../objects/user.h"
typedef std::function<bool(User)> UserPredicat;
class Database {
private:
static Database *mInstance;
static const QString mFilename;
Database() = default;
QVector<Profession> mProfessions;
QVector<User> mUsers;
QVector<User*> findUserByPredicat(UserPredicat predicat);
public:
static Database* instance();
QVector<Profession> professions() const;
QVector<User> users() const;
bool addUser(User usr);
User* getUser(UID uid);
User* getUser(QString login);
QVector<User*> getUsersByType(UserType type);
QVector<User*> getUsersByProfession(Profession prof);
Profession* getProfession(PID pid);
void save();
void load();
};
#endif // DATABASE_H

View file

@ -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

View file

@ -12,9 +12,9 @@ private:
PID mPID;
QString mTitle;
public:
Profession() = default;
public:
QString title() const;
PID pID() const;