Add DB serialization and user bindings
This commit is contained in:
parent
0871eaad37
commit
462bd42521
4 changed files with 129 additions and 3 deletions
79
iFacility/db/database.cpp
Normal file
79
iFacility/db/database.cpp
Normal 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
45
iFacility/db/database.h
Normal 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
|
||||||
|
|
@ -13,13 +13,15 @@ SOURCES += \
|
||||||
loginwindow.cpp \
|
loginwindow.cpp \
|
||||||
objects/profession.cpp \
|
objects/profession.cpp \
|
||||||
objects/user.cpp \
|
objects/user.cpp \
|
||||||
objects/userprofession.cpp
|
objects/userprofession.cpp \
|
||||||
|
db/database.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
loginwindow.h \
|
loginwindow.h \
|
||||||
objects/profession.h \
|
objects/profession.h \
|
||||||
objects/user.h \
|
objects/user.h \
|
||||||
objects/userprofession.h
|
objects/userprofession.h \
|
||||||
|
db/database.h
|
||||||
|
|
||||||
FORMS += \
|
FORMS += \
|
||||||
loginwindow.ui
|
loginwindow.ui
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,9 @@ private:
|
||||||
PID mPID;
|
PID mPID;
|
||||||
QString mTitle;
|
QString mTitle;
|
||||||
|
|
||||||
|
public:
|
||||||
Profession() = default;
|
Profession() = default;
|
||||||
|
|
||||||
public:
|
|
||||||
QString title() const;
|
QString title() const;
|
||||||
PID pID() const;
|
PID pID() const;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue