Clanz and clanzy

This commit is contained in:
Ondřej Fischer 2019-11-21 11:50:12 +01:00
parent 97a00c098d
commit e5fa284f03
10 changed files with 72 additions and 91 deletions

View File

@ -10,10 +10,6 @@
#include "colnodapi.h" #include "colnodapi.h"
constexpr auto equels = R"(==================================================================)";
constexpr auto underScore = R"(__________________________________________________________________)";
constexpr auto dash = R"(------------------------------------------------------------------)";
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);

View File

@ -2,11 +2,8 @@
Q_LOGGING_CATEGORY(colnod, "colnod.api"); Q_LOGGING_CATEGORY(colnod, "colnod.api");
ColnodAPI::ColnodAPI()
{
}
ColnodAPI::ColnodAPI(serversdk::RequestManager* reqMan, qint64 lastSync, bool dryMode, QString userName, QString password) ColnodAPI::ColnodAPI(serversdk::RequestManager* reqMan, const qint64 &lastSync, const bool &dryMode, const QString &userName, const QString &password)
:mReqMan(reqMan), mUserName(userName), mPassword(password), mDryMode(dryMode) :mReqMan(reqMan), mUserName(userName), mPassword(password), mDryMode(dryMode)
{ {
mLastSync.set_timestamp(lastSync); mLastSync.set_timestamp(lastSync);
@ -36,7 +33,7 @@ void ColnodAPI::downloadData()
}); });
} }
void ColnodAPI::processData(std::shared_ptr<Data> data) void ColnodAPI::processData(const std::shared_ptr<Data> &data)
{ {
connect(this, &ColnodAPI::partOfDataProcessFinished, this, &ColnodAPI::isDataProcessFinished); connect(this, &ColnodAPI::partOfDataProcessFinished, this, &ColnodAPI::isDataProcessFinished);
if ( !data->updatedTokens.isEmpty() && !mDryMode) { if ( !data->updatedTokens.isEmpty() && !mDryMode) {
@ -190,12 +187,12 @@ void ColnodAPI::areDataReady()
{ {
if (++amountData == 4) { if (++amountData == 4) {
qInfo(colnod) << TAB << "-> COLNOD DATA:"; qInfo(colnod) << tab << "-> COLNOD DATA:";
qInfo(colnod) << TAB << TAB << data->updatedTokens.size() << "TOKENS WERE MODIFIED"; qInfo(colnod) << tab << tab << data->updatedTokens.size() << "TOKENS WERE MODIFIED";
qInfo(colnod) << TAB << TAB << data->deletedTokens.size() << "TOKENS MARKED FOR DELETION"; qInfo(colnod) << tab << tab << data->deletedTokens.size() << "TOKENS MARKED FOR DELETION";
qInfo(colnod) << TAB << TAB << data->updatedSubjects.size() << "SUBJECTS WERE MODIFIED"; qInfo(colnod) << tab << tab << data->updatedSubjects.size() << "SUBJECTS WERE MODIFIED";
qInfo(colnod) << TAB << TAB << data->deletedSubjects.size() << "SUBJECTS MARKED FOR DELETION"; qInfo(colnod) << tab << tab << data->deletedSubjects.size() << "SUBJECTS MARKED FOR DELETION";
qInfo(colnod) << DASH; qInfo(colnod) << dash;
emit downloadDataFinished(data); emit downloadDataFinished(data);
newData(); newData();
@ -205,10 +202,10 @@ void ColnodAPI::areDataReady()
void ColnodAPI::isDataProcessFinished() void ColnodAPI::isDataProcessFinished()
{ {
if (++amountProccessesFinished == 2) { if (++amountProccessesFinished == 2) {
qInfo(colnod) << TAB << "-> DATA PROCESSED TO COLNOD:"; qInfo(colnod) << tab << "-> DATA PROCESSED TO COLNOD:";
qInfo(colnod) << TAB << TAB << data->updatedTokens.size() << "TOKENS UPDATED"; qInfo(colnod) << tab << tab << data->updatedTokens.size() << "TOKENS UPDATED";
qInfo(colnod) << TAB << TAB << data->deletedTokens.size() << "TOKENS DELETED"; qInfo(colnod) << tab << tab << data->deletedTokens.size() << "TOKENS DELETED";
qInfo(colnod) << DASH; qInfo(colnod) << dash;
emit dataProcessFinished(); emit dataProcessFinished();
} }

View File

@ -33,11 +33,11 @@ class ColnodAPI: public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
ColnodAPI(); ColnodAPI() = default;
ColnodAPI(serversdk::RequestManager* reqMan, qint64 lastSync = 0, bool dryMode = false, QString userName = "spaceti", QString password = "spaceti1"); ColnodAPI(serversdk::RequestManager* reqMan, const qint64 &lastSync = 0, const bool &dryMode = false, const QString &userName = "spaceti", const QString &password = "spaceti1");
void downloadData(); void downloadData();
void processData(std::shared_ptr<Data> data); void processData(const std::shared_ptr<Data> &data);
// New approach // New approach
std::shared_ptr<serversdk::Request> requestLogin(); std::shared_ptr<serversdk::Request> requestLogin();
@ -89,7 +89,7 @@ private:
QString mUserName; QString mUserName;
QString mPassword; QString mPassword;
Timestamp mLastSync; Timestamp mLastSync;
bool mDryMode; bool mDryMode = false;
std::shared_ptr<Data> data; std::shared_ptr<Data> data;

View File

@ -1,9 +1,5 @@
#include "data.h" #include "data.h"
Data::Data()
{
}
void Data::clear() void Data::clear()
{ {

View File

@ -4,15 +4,15 @@
#include "subject.h" #include "subject.h"
// constants for output design // constants for output design
#define EQUALS "==================================================================" constexpr auto equals = "==================================================================";
#define UNDERSCORE "__________________________________________________________________" constexpr auto underscore = "__________________________________________________________________";
#define DASH "------------------------------------------------------------------" constexpr auto dash = "------------------------------------------------------------------";
#define TAB "\t" constexpr auto tab = "\t";
class Data class Data
{ {
public: public:
Data(); Data() = default;
void clear(); void clear();

View File

@ -2,8 +2,6 @@
Q_LOGGING_CATEGORY(database, "db.api"); Q_LOGGING_CATEGORY(database, "db.api");
#define STH 803
DatabaseAPI::DatabaseAPI(serversdk::DatabaseManager *dbMan, bool dryMode) DatabaseAPI::DatabaseAPI(serversdk::DatabaseManager *dbMan, bool dryMode)
: mDryMode(dryMode), : mDryMode(dryMode),
mDbMan(dbMan), mDbMan(dbMan),
@ -30,23 +28,23 @@ void DatabaseAPI::downloadData()
emit downloadDataFinished(composeData(updatedQuery, deletedQuery)); emit downloadDataFinished(composeData(updatedQuery, deletedQuery));
} }
void DatabaseAPI::processData(std::shared_ptr<Data> data) void DatabaseAPI::processData(const std::shared_ptr<Data> &data)
{ {
uploadTokens(data->updatedTokens); uploadTokens(data->updatedTokens);
uploadSubjects(data->updatedSubjects); uploadSubjects(data->updatedSubjects);
deleteItems(data->deletedTokens, "colnod_token"); deleteItems(data->deletedTokens, "colnod_token");
deleteItems(data->deletedSubjects, "colnod_subject"); deleteItems(data->deletedSubjects, "colnod_subject");
qInfo(database) << TAB << "-> DATA PROCESSED TO DATABASE:"; qInfo(database) << tab << "-> DATA PROCESSED TO DATABASE:";
qInfo(database) << TAB << TAB << data->updatedTokens.size() << "TOKENS UPDATED"; qInfo(database) << tab << tab << data->updatedTokens.size() << "TOKENS UPDATED";
qInfo(database) << TAB << TAB << data->deletedTokens.size() << "TOKENS DELETED"; qInfo(database) << tab << tab << data->deletedTokens.size() << "TOKENS DELETED";
qInfo(database) << TAB << TAB << data->updatedSubjects.size() << "SUBJECTS UPDATED"; qInfo(database) << tab << tab << data->updatedSubjects.size() << "SUBJECTS UPDATED";
qInfo(database) << TAB << TAB << data->deletedSubjects.size() << "SUBJECTS DELETED"; qInfo(database) << tab << tab << data->deletedSubjects.size() << "SUBJECTS DELETED";
qInfo(database) << DASH; qInfo(database) << dash;
} }
std::shared_ptr<Data> DatabaseAPI::composeData(QSqlQuery updatedQuery, QSqlQuery deletedQuery) std::shared_ptr<Data> DatabaseAPI::composeData(const QSqlQuery &updatedQuery, QSqlQuery &deletedQuery)
{ {
auto data = std::make_shared<Data>(); auto data = std::make_shared<Data>();
auto list = utils->tableFromQuery<Token>(updatedQuery); auto list = utils->tableFromQuery<Token>(updatedQuery);
@ -57,10 +55,10 @@ std::shared_ptr<Data> DatabaseAPI::composeData(QSqlQuery updatedQuery, QSqlQuery
data->deletedTokens.append(deletedQuery.value(0).toString()); data->deletedTokens.append(deletedQuery.value(0).toString());
} }
qInfo(database) << TAB << "-> DATABASE DATA:"; qInfo(database) << tab << "-> DATABASE DATA:";
qInfo(database) << TAB << TAB << data->updatedTokens.size() << "TOKENS WERE MODIFIED"; qInfo(database) << tab << tab << data->updatedTokens.size() << "TOKENS WERE MODIFIED";
qInfo(database) << TAB << TAB << data->deletedTokens.size() << "TOKENS MARKED FOR DELETION"; qInfo(database) << tab << tab << data->deletedTokens.size() << "TOKENS MARKED FOR DELETION";
qInfo(database) << DASH ; qInfo(database) << dash ;
return data; return data;
@ -72,9 +70,7 @@ qint64 DatabaseAPI::getLastSync()
if (query.next()){ if (query.next()){
return query.value(0).toLongLong(); return query.value(0).toLongLong();
} }
else { return -1;
return -1;
}
} }
void DatabaseAPI::setLastSync(qint64 timestamp) void DatabaseAPI::setLastSync(qint64 timestamp)
@ -85,7 +81,7 @@ void DatabaseAPI::setLastSync(qint64 timestamp)
mDbMan->executeQuery(query); mDbMan->executeQuery(query);
} }
void DatabaseAPI::setLastUpdate(QHash<QString, std::shared_ptr<Token>> tokens) void DatabaseAPI::setLastUpdate(const QHash<QString, std::shared_ptr<Token>> &tokens)
{ {
auto query = mDbMan->createQuery(); auto query = mDbMan->createQuery();
for (const auto &token : tokens){ for (const auto &token : tokens){
@ -95,9 +91,9 @@ void DatabaseAPI::setLastUpdate(QHash<QString, std::shared_ptr<Token>> tokens)
mDbMan->executeQuery(query); mDbMan->executeQuery(query);
} }
qInfo(database) << EQUALS; qInfo(database) << equals;
qInfo(database) << "Synchronize last update in database with colnod"; qInfo(database) << "Synchronize last update in database with colnod";
qInfo(database) << EQUALS; qInfo(database) << equals;
} }
qint64 DatabaseAPI::getNow() qint64 DatabaseAPI::getNow()
@ -123,7 +119,7 @@ void DatabaseAPI::initNewTokens()
uploadTokens(tokensToInit); uploadTokens(tokensToInit);
} }
void DatabaseAPI::uploadTokens(QHash<QString, std::shared_ptr<Token>> tokens) void DatabaseAPI::uploadTokens(const QHash<QString, std::shared_ptr<Token>> &tokens)
{ {
auto query = mDbMan->createQuery(); auto query = mDbMan->createQuery();
for (const auto &token : tokens) { for (const auto &token : tokens) {
@ -137,7 +133,7 @@ void DatabaseAPI::uploadTokens(QHash<QString, std::shared_ptr<Token>> tokens)
} }
} }
void DatabaseAPI::uploadSubjects(QHash<QString, std::shared_ptr<Subject>> subjects) void DatabaseAPI::uploadSubjects(const QHash<QString, std::shared_ptr<Subject>> &subjects)
{ {
auto query = mDbMan->createQuery(); auto query = mDbMan->createQuery();
for (const auto &subject : subjects) { for (const auto &subject : subjects) {
@ -161,7 +157,7 @@ void DatabaseAPI::uploadSubjects(QHash<QString, std::shared_ptr<Subject>> subjec
} }
} }
void DatabaseAPI::deleteItems(QList<QString> ids, const QString &tableName) void DatabaseAPI::deleteItems(const QList<QString> &ids, const QString &tableName)
{ {
auto query = mDbMan->createQuery(); auto query = mDbMan->createQuery();
QString nowString = QDateTime::fromMSecsSinceEpoch(getLastSync()).toString("yyyy-MM-dd hh:mm:ss.zzz"); QString nowString = QDateTime::fromMSecsSinceEpoch(getLastSync()).toString("yyyy-MM-dd hh:mm:ss.zzz");
@ -182,9 +178,7 @@ std::shared_ptr<Token> DatabaseAPI::getLastUpdate(const QString &id)
if (query.next()) { if (query.next()) {
return utils->tableFromQuery<Token>(query).at(0); return utils->tableFromQuery<Token>(query).at(0);
} }
else { return nullptr;
return nullptr;
}
} }
bool DatabaseAPI::exists(const QString &id, const QString &tableName) bool DatabaseAPI::exists(const QString &id, const QString &tableName)

View File

@ -20,18 +20,18 @@ public:
bool open(); bool open();
void downloadData(); void downloadData();
void processData(std::shared_ptr<Data> data); void processData(const std::shared_ptr<Data> &data);
qint64 getLastSync(); qint64 getLastSync();
void setLastSync(qint64 timestamp); void setLastSync(qint64 timestamp);
void setLastUpdate(QHash<QString, std::shared_ptr<Token> > tokens); void setLastUpdate(const QHash<QString, std::shared_ptr<Token> > &tokens);
qint64 getNow(); qint64 getNow();
void initNewTokens(); void initNewTokens();
// process data // process data
void uploadTokens(QHash<QString, std::shared_ptr<Token> > tokens); void uploadTokens(const QHash<QString, std::shared_ptr<Token> > &tokens);
void uploadSubjects(QHash<QString, std::shared_ptr<Subject> > subjects); void uploadSubjects(const QHash<QString, std::shared_ptr<Subject> > &subjects);
void deleteItems(QList<QString> ids, const QString &tableName); void deleteItems(const QList<QString> &ids, const QString &tableName);
std::shared_ptr<Token> getLastUpdate(const QString &id); std::shared_ptr<Token> getLastUpdate(const QString &id);
@ -39,7 +39,7 @@ private:
bool exists(const QString &id, const QString &tableName); bool exists(const QString &id, const QString &tableName);
QSqlQuery getUpdatedTokens(); QSqlQuery getUpdatedTokens();
std::shared_ptr<Data> composeData(QSqlQuery updatedQuery, QSqlQuery deletedQuery); std::shared_ptr<Data> composeData(const QSqlQuery &updatedQuery, QSqlQuery &deletedQuery);
qint16 getNumOfTokensOfSubject(const QString &id); qint16 getNumOfTokensOfSubject(const QString &id);
QString getSubjectNameByTokenId(const QString &tokenId); QString getSubjectNameByTokenId(const QString &tokenId);

View File

@ -12,7 +12,7 @@ bool Subject::fromJson(const QByteArray &data)
QJsonObject attr = doc.object()["attributes"].toObject()["items"].toObject(); QJsonObject attr = doc.object()["attributes"].toObject()["items"].toObject();
auto id = doc.object()["id"].toString(); auto id = doc.object()["id"].toString();
for (auto key : attr.keys()) { for (const auto &key : attr.keys()) {
auto newAtr = std::make_shared<SubjectAttribute>(); auto newAtr = std::make_shared<SubjectAttribute>();
newAtr->setId(id + " " + key); newAtr->setId(id + " " + key);
newAtr->setSubjectId(id); newAtr->setSubjectId(id);

View File

@ -32,7 +32,7 @@ void SyncManager::run()
{ {
qint64 syncBegin = database->getNow(); qint64 syncBegin = database->getNow();
qInfo(syncmanager) << EQUALS; qInfo(syncmanager) << equals;
qInfo(syncmanager) << "SYNCHRONIZATION BEGIN"; qInfo(syncmanager) << "SYNCHRONIZATION BEGIN";
database->initNewTokens(); database->initNewTokens();
@ -49,9 +49,9 @@ void SyncManager::run()
qInfo(syncmanager) << "Update last synchronization time to time of this sync (" qInfo(syncmanager) << "Update last synchronization time to time of this sync ("
<< QDateTime::fromMSecsSinceEpoch(syncBegin).toString("yyyy-MM-dd hh:mm:ss.zzz") << QDateTime::fromMSecsSinceEpoch(syncBegin).toString("yyyy-MM-dd hh:mm:ss.zzz")
<< ")"; << ")";
qInfo(syncmanager) << EQUALS; qInfo(syncmanager) << equals;
qInfo(syncmanager) << "SYNCHRONIZATION FINISHED"; qInfo(syncmanager) << "SYNCHRONIZATION FINISHED";
qInfo(syncmanager) << EQUALS; qInfo(syncmanager) << equals;
QCoreApplication::exit(); QCoreApplication::exit();
}); });
@ -63,11 +63,11 @@ void SyncManager::run()
void SyncManager::downloadData() void SyncManager::downloadData()
{ {
qInfo(syncmanager) << EQUALS; qInfo(syncmanager) << equals;
qInfo(syncmanager) << "DOWNLOADING DATA -> BEGIN"; qInfo(syncmanager) << "DOWNLOADING DATA -> BEGIN";
qInfo(syncmanager) << DASH; qInfo(syncmanager) << dash;
qInfo(syncmanager) << "Modified data since last synchronization (" << mlastSync.toDateString() << "):"; qInfo(syncmanager) << "Modified data since last synchronization (" << mlastSync.toDateString() << "):";
qInfo(syncmanager) << DASH; qInfo(syncmanager) << dash;
connect(colnod.get(), &ColnodAPI::downloadDataFinished, this, &SyncManager::saveColnodData); connect(colnod.get(), &ColnodAPI::downloadDataFinished, this, &SyncManager::saveColnodData);
connect(database.get(), &DatabaseAPI::downloadDataFinished, this, &SyncManager::saveDatabaseData); connect(database.get(), &DatabaseAPI::downloadDataFinished, this, &SyncManager::saveDatabaseData);
@ -78,11 +78,11 @@ void SyncManager::downloadData()
// finds conflicts -> changes on both sides (colnod and DB), apply newer change // finds conflicts -> changes on both sides (colnod and DB), apply newer change
void SyncManager::prepareData() void SyncManager::prepareData()
{ {
qInfo(syncmanager) << EQUALS; qInfo(syncmanager) << equals;
qInfo(syncmanager) << "PREPARING DATA -> BEGIN"; qInfo(syncmanager) << "PREPARING DATA -> BEGIN";
qInfo(syncmanager) << DASH; qInfo(syncmanager) << dash;
qInfo(syncmanager) << "Resolve conflicts ( changes on same item on both Colnod and DB ):"; qInfo(syncmanager) << "Resolve conflicts ( changes on same item on both Colnod and DB ):";
qInfo(syncmanager) << DASH; qInfo(syncmanager) << dash;
colnodDataToProcess = std::make_shared<Data>(*colnodData); colnodDataToProcess = std::make_shared<Data>(*colnodData);
@ -108,10 +108,10 @@ void SyncManager::prepareData()
for (const auto &id : alreadySynced) for (const auto &id : alreadySynced)
colnodDataToProcess->updatedTokens.remove(id); colnodDataToProcess->updatedTokens.remove(id);
qInfo(syncmanager) << TAB << "-> COLNOD DATA - CHANGES:"; qInfo(syncmanager) << tab << "-> COLNOD DATA - CHANGES:";
qInfo(syncmanager) << TAB << TAB << conflicts.size() << "TOKENS WERE MODIFIED IN DATABASE"; qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE MODIFIED IN DATABASE";
qInfo(syncmanager) << TAB << TAB << alreadySynced.size() << "TOKENS WERE ALREADY SYNCED"; qInfo(syncmanager) << tab << tab << alreadySynced.size() << "TOKENS WERE ALREADY SYNCED";
qInfo(syncmanager) << DASH; qInfo(syncmanager) << dash;
conflicts.clear(); conflicts.clear();
@ -124,28 +124,28 @@ void SyncManager::prepareData()
for (const auto &id : conflicts) for (const auto &id : conflicts)
colnodDataToProcess->updatedTokens.remove(id); colnodDataToProcess->updatedTokens.remove(id);
qInfo(syncmanager) << TAB << "-> DATABASE DATA - CHANGES:"; qInfo(syncmanager) << tab << "-> DATABASE DATA - CHANGES:";
qInfo(syncmanager) << TAB << TAB << conflicts.size() << "TOKENS WERE MODIFIED IN COLNOD"; qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE MODIFIED IN COLNOD";
qInfo(syncmanager) << DASH; qInfo(syncmanager) << dash;
qInfo(syncmanager) << "PREPARING DATA -> FINISHED"; qInfo(syncmanager) << "PREPARING DATA -> FINISHED";
qInfo(syncmanager) << EQUALS; qInfo(syncmanager) << equals;
} }
void SyncManager::processData() void SyncManager::processData()
{ {
qInfo(syncmanager) << EQUALS; qInfo(syncmanager) << equals;
qInfo(syncmanager) << "PROCESSING DATA -> BEGIN"; qInfo(syncmanager) << "PROCESSING DATA -> BEGIN";
qInfo(syncmanager) << DASH; qInfo(syncmanager) << dash;
qInfo(syncmanager) << "Push changes to both Colnod ad Database:"; qInfo(syncmanager) << "Push changes to both Colnod ad Database:";
qInfo(syncmanager) << DASH; qInfo(syncmanager) << dash;
database->processData(colnodDataToProcess); database->processData(colnodDataToProcess);
connect(colnod.get(), &ColnodAPI::dataProcessFinished, this, &SyncManager::dataProcessFinished); connect(colnod.get(), &ColnodAPI::dataProcessFinished, this, &SyncManager::dataProcessFinished);
colnod->processData(databaseDataToProcess); colnod->processData(databaseDataToProcess);
qInfo(syncmanager) << "PROCESSING DATA -> FINISHED"; qInfo(syncmanager) << "PROCESSING DATA -> FINISHED";
qInfo(syncmanager) << EQUALS; qInfo(syncmanager) << equals;
} }
void SyncManager::updateLastUpdate(qint64 syncBegin) void SyncManager::updateLastUpdate(qint64 syncBegin)
@ -153,7 +153,7 @@ void SyncManager::updateLastUpdate(qint64 syncBegin)
Timestamp time; Timestamp time;
time.set_timestamp(syncBegin); time.set_timestamp(syncBegin);
colnod->getTokensUpdated(time); colnod->getTokensUpdated(time);
connect(colnod.get(), &ColnodAPI::partOfDataReady, [=](std::shared_ptr<Data> data){ connect(colnod.get(), &ColnodAPI::partOfDataReady, [=](const std::shared_ptr<Data> &data){
database->setLastUpdate(data->updatedTokens); database->setLastUpdate(data->updatedTokens);
emit syncFinished(); emit syncFinished();
}); });
@ -164,7 +164,7 @@ void SyncManager::areDataReady()
if (++dataAmount == 2) { if (++dataAmount == 2) {
qInfo(syncmanager) << "DOWNLOADING DATA -> FINISHED"; qInfo(syncmanager) << "DOWNLOADING DATA -> FINISHED";
qInfo(syncmanager) << EQUALS; qInfo(syncmanager) << equals;
emit dataReady(); emit dataReady();
} }

View File

@ -51,7 +51,7 @@ bool Token::fromJson(const QByteArray &data)
QVariantMap variant = qvariant_cast<QVariantMap>(doc.toVariant()); QVariantMap variant = qvariant_cast<QVariantMap>(doc.toVariant());
QVariantList flags = variant["flags"].toList(); QVariantList flags = variant["flags"].toList();
for (auto value : flags) { for (const auto &value : flags) {
if ( value.toString() == "Enabled") { if ( value.toString() == "Enabled") {
variant.insert("enabled", true); variant.insert("enabled", true);
} }
@ -82,11 +82,9 @@ QByteArray Token::idsToJSON(const QList<QString> &ids)
return doc.toJson(); return doc.toJson();
} }
#include <qsqlrecord.h>
void Token::fromSQLRecord(const QSqlQuery& query) void Token::fromSQLRecord(const QSqlQuery& query)
{ {
auto rec = query.record();
setId(query.value(0).toString()); setId(query.value(0).toString());
a_authErrors = query.value(1).toInt(); a_authErrors = query.value(1).toInt();
setDescription(query.value(2).toString()); setDescription(query.value(2).toString());