This commit is contained in:
Ondřej Fischer 2019-11-21 15:33:22 +01:00
parent e5fa284f03
commit 4fe612d11d
7 changed files with 60 additions and 51 deletions

View File

@ -31,7 +31,7 @@ int main(int argc, char *argv[])
// Log messge Filtering // Log messge Filtering
QStringList filters; QStringList filters;
filters << "qt.*=false"; filters << "qt.*=false";
filters << "sdk.core.*=true"; filters << "sdk*=false";
//filters << "*=false"; //filters << "*=false";
QLoggingCategory::setFilterRules(filters.join(QStringLiteral("\n"))); QLoggingCategory::setFilterRules(filters.join(QStringLiteral("\n")));

View File

@ -7,7 +7,7 @@ ColnodAPI::ColnodAPI(serversdk::RequestManager* reqMan, const qint64 &lastSync,
:mReqMan(reqMan), mUserName(userName), mPassword(password), mDryMode(dryMode) :mReqMan(reqMan), mUserName(userName), mPassword(password), mDryMode(dryMode)
{ {
mLastSync.set_timestamp(lastSync); mLastSync.set_timestamp(lastSync);
data = std::make_shared<Data>(); mData = std::make_shared<Data>();
// ----------------------------------- // -----------------------------------
mReqMan->setIgnoreSsl(true); mReqMan->setIgnoreSsl(true);
@ -35,6 +35,13 @@ void ColnodAPI::downloadData()
void ColnodAPI::processData(const std::shared_ptr<Data> &data) void ColnodAPI::processData(const std::shared_ptr<Data> &data)
{ {
qInfo(colnod) << tab << "-> DATA PROCESSED TO COLNOD:";
qInfo(colnod) << tab << tab << data->updatedTokens.size() << "TOKENS UPDATED";
qInfo(colnod) << tab << tab << data->deletedTokens.size() << "TOKENS DELETED";
qInfo(colnod) << dash;
connect(this, &ColnodAPI::partOfDataProcessFinished, this, &ColnodAPI::isDataProcessFinished); connect(this, &ColnodAPI::partOfDataProcessFinished, this, &ColnodAPI::isDataProcessFinished);
if ( !data->updatedTokens.isEmpty() && !mDryMode) { if ( !data->updatedTokens.isEmpty() && !mDryMode) {
setTokens(data->updatedTokens); setTokens(data->updatedTokens);
@ -76,7 +83,7 @@ void ColnodAPI::getTokensUpdated(const Timestamp &time)
mReqMan->processRequest(request); mReqMan->processRequest(request);
connect(request.get(), &serversdk::Request::finished, [=](){ connect(request.get(), &serversdk::Request::finished, [=](){
saveUpdatedTokens(request->responseData()); saveUpdatedTokens(request->responseData());
emit partOfDataReady(data); emit partOfDataReady(mData);
}); });
} }
@ -188,13 +195,13 @@ 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 << mData->updatedTokens.size() << "TOKENS WERE MODIFIED";
qInfo(colnod) << tab << tab << data->deletedTokens.size() << "TOKENS MARKED FOR DELETION"; qInfo(colnod) << tab << tab << mData->deletedTokens.size() << "TOKENS MARKED FOR DELETION";
qInfo(colnod) << tab << tab << data->updatedSubjects.size() << "SUBJECTS WERE MODIFIED"; qInfo(colnod) << tab << tab << mData->updatedSubjects.size() << "SUBJECTS WERE MODIFIED";
qInfo(colnod) << tab << tab << data->deletedSubjects.size() << "SUBJECTS MARKED FOR DELETION"; qInfo(colnod) << tab << tab << mData->deletedSubjects.size() << "SUBJECTS MARKED FOR DELETION";
qInfo(colnod) << dash; qInfo(colnod) << dash;
emit downloadDataFinished(data); emit downloadDataFinished(mData);
newData(); newData();
} }
} }
@ -202,18 +209,13 @@ 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 << tab << data->updatedTokens.size() << "TOKENS UPDATED";
qInfo(colnod) << tab << tab << data->deletedTokens.size() << "TOKENS DELETED";
qInfo(colnod) << dash;
emit dataProcessFinished(); emit dataProcessFinished();
} }
} }
void ColnodAPI::saveUpdatedTokens(const QByteArray &responseData) void ColnodAPI::saveUpdatedTokens(const QByteArray &responseData)
{ {
data->loadTokensFromJson(responseData); mData->loadTokensFromJson(responseData);
} }
void ColnodAPI::saveDeletedTokens(const QByteArray &responseData) void ColnodAPI::saveDeletedTokens(const QByteArray &responseData)
@ -221,13 +223,13 @@ void ColnodAPI::saveDeletedTokens(const QByteArray &responseData)
QJsonDocument doc = QJsonDocument::fromJson(responseData); QJsonDocument doc = QJsonDocument::fromJson(responseData);
QJsonArray items = doc.object()["items"].toArray(); QJsonArray items = doc.object()["items"].toArray();
for (QJsonValueRef item : items) { for (QJsonValueRef item : items) {
data->deletedTokens.append(item.toString()); mData->deletedTokens.append(item.toString());
} }
} }
void ColnodAPI::saveUpdatedSubjects(const QByteArray &responseData) void ColnodAPI::saveUpdatedSubjects(const QByteArray &responseData)
{ {
data->loadSubjectsFormJson(responseData); mData->loadSubjectsFormJson(responseData);
} }
void ColnodAPI::saveDeletedSubjects(const QByteArray &responseData) void ColnodAPI::saveDeletedSubjects(const QByteArray &responseData)
@ -235,13 +237,13 @@ void ColnodAPI::saveDeletedSubjects(const QByteArray &responseData)
QJsonDocument doc = QJsonDocument::fromJson(responseData); QJsonDocument doc = QJsonDocument::fromJson(responseData);
QJsonArray items = doc.object()["items"].toArray(); QJsonArray items = doc.object()["items"].toArray();
for (QJsonValueRef item : items) { for (QJsonValueRef item : items) {
data->deletedSubjects.append(item.toString()); mData->deletedSubjects.append(item.toString());
} }
} }
void ColnodAPI::newData() void ColnodAPI::newData()
{ {
data = std::make_shared<Data>(); mData = std::make_shared<Data>();
} }
bool ColnodAPI::checkResponse(const QByteArray &responseData) bool ColnodAPI::checkResponse(const QByteArray &responseData)

View File

@ -91,7 +91,7 @@ private:
Timestamp mLastSync; Timestamp mLastSync;
bool mDryMode = false; bool mDryMode = false;
std::shared_ptr<Data> data; std::shared_ptr<Data> mData;
QString authToken; QString authToken;
qint16 amountData = 0; qint16 amountData = 0;

View File

@ -1,6 +1,6 @@
#include "databaseapi.h" #include "databaseapi.h"
Q_LOGGING_CATEGORY(database, "db.api"); Q_LOGGING_CATEGORY(database, "database.api");
DatabaseAPI::DatabaseAPI(serversdk::DatabaseManager *dbMan, bool dryMode) DatabaseAPI::DatabaseAPI(serversdk::DatabaseManager *dbMan, bool dryMode)
: mDryMode(dryMode), : mDryMode(dryMode),
@ -129,7 +129,6 @@ void DatabaseAPI::uploadTokens(const QHash<QString, std::shared_ptr<Token>> &tok
else { else {
query = utils->insertIntoTable(token.get(), "colnod_token"); query = utils->insertIntoTable(token.get(), "colnod_token");
} }
query = mDbMan->executeQuery(query);
} }
} }
@ -144,7 +143,6 @@ void DatabaseAPI::uploadSubjects(const QHash<QString, std::shared_ptr<Subject>>
else { else {
query = utils->insertIntoTable(attribute.get(), "colnod_subject_attribute"); query = utils->insertIntoTable(attribute.get(), "colnod_subject_attribute");
} }
query = mDbMan->executeQuery(query);
} }
// NOTE: about actions // NOTE: about actions
if (exists(subject->id(), "colnod_subject")) { if (exists(subject->id(), "colnod_subject")) {
@ -153,7 +151,6 @@ void DatabaseAPI::uploadSubjects(const QHash<QString, std::shared_ptr<Subject>>
else { else {
query = utils->insertIntoTable(subject.get(), "colnod_subject"); query = utils->insertIntoTable(subject.get(), "colnod_subject");
} }
query = mDbMan->executeQuery(query);
} }
} }
@ -172,13 +169,13 @@ void DatabaseAPI::deleteItems(const QList<QString> &ids, const QString &tableNam
std::shared_ptr<Token> DatabaseAPI::getLastUpdate(const QString &id) std::shared_ptr<Token> DatabaseAPI::getLastUpdate(const QString &id)
{ {
auto query = mDbMan->createQuery(); auto query = mDbMan->createQuery();
query.prepare("SELECT last_update FROM colnod_token WHERE id = :id"); query.prepare("SELECT * FROM colnod_token WHERE id = :id");
query.bindValue(":id", id); query.bindValue(":id", id);
mDbMan->executeQuery(query); mDbMan->executeQuery(query);
if (query.next()) { auto list = utils->tableFromQuery<Token>(query);
return utils->tableFromQuery<Token>(query).at(0); if (list.isEmpty())
}
return nullptr; return nullptr;
return list.at(0);
} }
bool DatabaseAPI::exists(const QString &id, const QString &tableName) bool DatabaseAPI::exists(const QString &id, const QString &tableName)

View File

@ -21,6 +21,9 @@ bool Subject::fromJson(const QByteArray &data)
attributes.append(newAtr); attributes.append(newAtr);
} }
QVariantMap variant = qvariant_cast<QVariantMap>(doc.toVariant()); QVariantMap variant = qvariant_cast<QVariantMap>(doc.toVariant());
auto lastUpdate = variant["lastUpdate"].toLongLong();
variant["lastUpdate"] = QDateTime::fromMSecsSinceEpoch(lastUpdate);
variant.insert("lastModified", QDateTime::fromMSecsSinceEpoch(lastUpdate));
// Populate this object data // Populate this object data
bool res = fromVariantMap(variant); bool res = fromVariantMap(variant);

View File

@ -42,6 +42,10 @@ void SyncManager::run()
prepareData(); prepareData();
connect(this, &SyncManager::dataProcessFinished, [=](){ connect(this, &SyncManager::dataProcessFinished, [=](){
qInfo(syncmanager) << "PROCESSING DATA -> FINISHED";
qInfo(syncmanager) << equals;
updateLastUpdate(syncBegin); updateLastUpdate(syncBegin);
connect(this, &SyncManager::syncFinished, [=](){ connect(this, &SyncManager::syncFinished, [=](){
database->setLastSync(syncBegin); database->setLastSync(syncBegin);
@ -99,7 +103,7 @@ void SyncManager::prepareData()
continue; continue;
} }
auto token = database->getLastUpdate(colnodToken->id()); auto token = database->getLastUpdate(colnodToken->id());
if ( !token ) if ( token )
if (token == colnodToken) if (token == colnodToken)
alreadySynced.append(colnodToken->id()); alreadySynced.append(colnodToken->id());
} }
@ -120,6 +124,12 @@ void SyncManager::prepareData()
if (databaseToken > colnodDataToProcess->updatedTokens.value(databaseToken->id())) if (databaseToken > colnodDataToProcess->updatedTokens.value(databaseToken->id()))
conflicts.append(databaseToken->id()); conflicts.append(databaseToken->id());
} }
else {
if (databaseToken->description() != "mobile") {
qWarning(syncmanager) << "Token:" << databaseToken->id() << "doesn't have 'mobile' in description and won't be pushed to Colnod";
conflicts.append(databaseToken->id());
}
}
} }
for (const auto &id : conflicts) for (const auto &id : conflicts)
colnodDataToProcess->updatedTokens.remove(id); colnodDataToProcess->updatedTokens.remove(id);
@ -137,15 +147,12 @@ 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 and 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) << equals;
} }
void SyncManager::updateLastUpdate(qint64 syncBegin) void SyncManager::updateLastUpdate(qint64 syncBegin)

View File

@ -43,26 +43,26 @@ public:
QByteArray jsonData(const QSet<QString> &filters = {}) const override; QByteArray jsonData(const QSet<QString> &filters = {}) const override;
bool fromJson(const QByteArray &data) override; bool fromJson(const QByteArray &data) override;
friend bool operator<(const Token &lToken, const Token &rToken){ friend bool operator<(const std::shared_ptr<Token> &lToken, const std::shared_ptr<Token> &rToken){
return lToken.lastModified() < rToken.lastUpdate(); return lToken->lastModified() < rToken->lastUpdate();
} }
friend bool operator>(const Token &lToken, const Token &rToken){ friend bool operator>(const std::shared_ptr<Token> &lToken, const std::shared_ptr<Token> &rToken){
return lToken.lastModified() > rToken.lastUpdate(); return lToken->lastModified() > rToken->lastUpdate();
} }
friend bool operator==(const std::shared_ptr<Token> &lToken, const std::shared_ptr<Token> &rToken)
friend bool operator==(const Token &lToken, const Token &rToken){ {
return lToken.id() == rToken.id() && return lToken->id() == rToken->id() &&
lToken.name() == rToken.name() && lToken->name() == rToken->name() &&
lToken.description() == rToken.description() && lToken->description() == rToken->description() &&
lToken.lastUpdate() == rToken.lastUpdate() && lToken->lastUpdate() == rToken->lastUpdate() &&
lToken.tokenType() == rToken.tokenType() && lToken->tokenType() == rToken->tokenType() &&
lToken.tokenBits() == rToken.tokenBits() && lToken->tokenBits() == rToken->tokenBits() &&
lToken.tokenData() == rToken.tokenData() && lToken->tokenData() == rToken->tokenData() &&
lToken.timeToLive() == rToken.timeToLive() && lToken->timeToLive() == rToken->timeToLive() &&
lToken.authErrors() == rToken.authErrors() && lToken->authErrors() == rToken->authErrors() &&
lToken.noValidity() == rToken.noValidity() && lToken->noValidity() == rToken->noValidity() &&
lToken.enabled() == rToken.enabled() && lToken->enabled() == rToken->enabled() &&
lToken.subjectId() == rToken.subjectId(); lToken->subjectId() == rToken->subjectId();
} }
void fromSQLRecord(const QSqlQuery& query); void fromSQLRecord(const QSqlQuery& query);