From 0dea65a0b65c9a363306caa3bc371392b571119d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Thu, 28 Nov 2019 15:02:45 +0100 Subject: [PATCH 1/5] WIP: prepare data --- src/colnod/syncmanager.cpp | 42 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/colnod/syncmanager.cpp b/src/colnod/syncmanager.cpp index cccecec..7278037 100644 --- a/src/colnod/syncmanager.cpp +++ b/src/colnod/syncmanager.cpp @@ -131,8 +131,46 @@ bool SyncManager::startSynchronization() std::unique_ptr SyncManager::prepareDataNew(const std::shared_ptr &databaseData, const std::shared_ptr &colnodData) { - Q_UNUSED(databaseData); - Q_UNUSED(colnodData); + auto preperedColnodData = std::make_shared(); + auto preperedDatabaseData = std::make_shared(); + + QList conflicts; + QList alreadySynced; + + for (const auto &colnodToken : colnodData->updatedTokens) { + + // not conflict so add to prepered tokens + if (!databaseData->updatedTokens.contains(colnodToken->id())) { + preperedColnodData->updatedTokens.insert(colnodToken->id(), colnodToken); + continue; + } + + // change in colnod is newer + if (databaseData->updatedTokens.value(colnodToken->id()) < colnodToken) { + preperedColnodData->updatedTokens.insert(colnodToken->id(), colnodToken); + } + + // updated in db later + if (databaseData->updatedTokens.value(colnodToken->id()) > colnodToken) { + conflicts.append(colnodToken->id()); + } + } + auto token = database->getToken(colnodToken->id()); + if ( token ) + // alredy synced ( tokens are same ) + if (token == colnodToken) + alreadySynced.append(colnodToken->id()); + } + // remove tokens which should be not updated + for (const auto &id : conflicts) + colnodData->updatedTokens.remove(id); + for (const auto &id : alreadySynced) + colnodData->updatedTokens.remove(id); + + qInfo(syncmanager) << tab << "-> COLNOD DATA - CHANGES:"; + qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE ADDED/UPDATED IN DATABASE TOO"; + qInfo(syncmanager) << tab << tab << alreadySynced.size() << "TOKENS WERE ALREADY SYNCED"; + return nullptr; } From 53015d839aa99536a8d5be7a3a8c301d9cc10430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Thu, 28 Nov 2019 15:16:34 +0100 Subject: [PATCH 2/5] WIP: prepare data --- src/colnod/syncmanager.cpp | 46 +++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/colnod/syncmanager.cpp b/src/colnod/syncmanager.cpp index 7278037..4d7ed4d 100644 --- a/src/colnod/syncmanager.cpp +++ b/src/colnod/syncmanager.cpp @@ -149,27 +149,53 @@ std::unique_ptr SyncManager::prepareDataNew(const std::shared_ptr< if (databaseData->updatedTokens.value(colnodToken->id()) < colnodToken) { preperedColnodData->updatedTokens.insert(colnodToken->id(), colnodToken); } - - // updated in db later - if (databaseData->updatedTokens.value(colnodToken->id()) > colnodToken) { - conflicts.append(colnodToken->id()); - } + else { + conflicts.append(colnodToken->id()); } + auto token = database->getToken(colnodToken->id()); if ( token ) // alredy synced ( tokens are same ) if (token == colnodToken) alreadySynced.append(colnodToken->id()); } - // remove tokens which should be not updated - for (const auto &id : conflicts) - colnodData->updatedTokens.remove(id); - for (const auto &id : alreadySynced) - colnodData->updatedTokens.remove(id); + + for (const auto &id : colnodData->deletedTokens) { + if (!database->isAlreadyDeleted(id)) { + preperedColnodData->deletedTokens.append(id); + } + } qInfo(syncmanager) << tab << "-> COLNOD DATA - CHANGES:"; qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE ADDED/UPDATED IN DATABASE TOO"; qInfo(syncmanager) << tab << tab << alreadySynced.size() << "TOKENS WERE ALREADY SYNCED"; + qInfo(syncmanager) << tab << tab << colnodData->updatedTokens.size() - preperedColnodData->deletedTokens.size() << "TOKENS WERE ALREADY DELETED"; + qInfo(syncmanager) << dash; + + for (const auto &databaseToken : databaseData->updatedTokens) { + if (!colnodData->updatedTokens.contains(databaseToken->id())) { + preperedDatabaseData->updatedTokens.insert(databaseToken->id(), databaseToken); + } + if (databaseToken < colnodData->updatedTokens.value(databaseToken->id())) + conflicts.append(databaseToken->id()); + } + else { + // restriction cauesed by colnod rest api + if (databaseToken->description() != "mobile") { + qCritical(syncmanager) << "Token:" << databaseToken->id() << "doesn't have 'mobile' in description, can't be "; + conflicts.append(databaseToken->id()); + } + } + } + for (const auto &id : conflicts) + colnodData->updatedTokens.remove(id); + + qInfo(syncmanager) << tab << "-> DATABASE DATA - CHANGES:"; + qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE ADDED/UPDATED IN IN COLNOD TOO"; + qInfo(syncmanager) << dash; + + qInfo(syncmanager) << "PREPARING DATA -> FINISHED"; + qInfo(syncmanager) << equals; return nullptr; } From 1945e7e002077a7d756412ab49343e196048e028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Thu, 28 Nov 2019 15:49:49 +0100 Subject: [PATCH 3/5] finished prepere data, but not hadling new tokens --- src/colnod/data.h | 8 +++++ src/colnod/syncmanager.cpp | 61 +++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/colnod/data.h b/src/colnod/data.h index 5ef4827..cd6d512 100644 --- a/src/colnod/data.h +++ b/src/colnod/data.h @@ -39,6 +39,14 @@ public: struct PreparedData { +public: + PreparedData() = default; + PreparedData(std::shared_ptr database, std::shared_ptr colnod) + :databaseData(database), colnodData(colnod) + { + } + + // TODO: make unique_ptr ( neeed because of ColnodAPI ) std::shared_ptr databaseData; std::shared_ptr colnodData; diff --git a/src/colnod/syncmanager.cpp b/src/colnod/syncmanager.cpp index 4d7ed4d..1529509 100644 --- a/src/colnod/syncmanager.cpp +++ b/src/colnod/syncmanager.cpp @@ -49,7 +49,7 @@ bool SyncManager::startSynchronization() qInfo(syncmanager) << equals; qInfo(syncmanager) << "SYNCHRONIZATION BEGIN"; - // TODO: check error + // TODO: solve this in prepare data database->initNewTokens(); @@ -63,8 +63,8 @@ bool SyncManager::startSynchronization() colnod->downloadData(Timestamp(syncBegin)); - connect(colnod.get(), &ColnodAPI::downloadDataFinished, [=](std::shared_ptr data) { - if (!data) { + connect(colnod.get(), &ColnodAPI::downloadDataFinished, [=](std::shared_ptr colnodData) { + if (!colnodData) { qCritical(syncmanager) << "Not possible to get correct data from colnod"; QCoreApplication::exit(-1); return; @@ -73,7 +73,7 @@ bool SyncManager::startSynchronization() // NOW I SHOULD HAVE VALID DATA FROM COLNOD // I can process data qDebug(syncmanager) << "I have colnod and database data"; - qDebug(syncmanager) << "updated token count" << data->updatedTokens.count(); + qDebug(syncmanager) << "updated token count" << colnodData->updatedTokens.count(); std::unique_ptr preparedData = prepareDataNew(databaseData, colnodData); if (!preparedData) { @@ -88,11 +88,6 @@ bool SyncManager::startSynchronization() return true; //downloadData(); - auto colnodDataFinished = [=](std::shared_ptr data) { - Q_UNUSED(data) - qDebug() << "Now I can check that I have all data I need"; - }; - //connect(this, &SyncManager::dataReady, processDownloadedData); @@ -131,8 +126,8 @@ bool SyncManager::startSynchronization() std::unique_ptr SyncManager::prepareDataNew(const std::shared_ptr &databaseData, const std::shared_ptr &colnodData) { - auto preperedColnodData = std::make_shared(); - auto preperedDatabaseData = std::make_shared(); + auto preparedColnodData = std::make_shared(); + auto preparedDatabaseData = std::make_shared(); QList conflicts; QList alreadySynced; @@ -141,13 +136,13 @@ std::unique_ptr SyncManager::prepareDataNew(const std::shared_ptr< // not conflict so add to prepered tokens if (!databaseData->updatedTokens.contains(colnodToken->id())) { - preperedColnodData->updatedTokens.insert(colnodToken->id(), colnodToken); + preparedColnodData->updatedTokens.insert(colnodToken->id(), colnodToken); continue; } // change in colnod is newer if (databaseData->updatedTokens.value(colnodToken->id()) < colnodToken) { - preperedColnodData->updatedTokens.insert(colnodToken->id(), colnodToken); + preparedColnodData->updatedTokens.insert(colnodToken->id(), colnodToken); } else { conflicts.append(colnodToken->id()); @@ -162,42 +157,46 @@ std::unique_ptr SyncManager::prepareDataNew(const std::shared_ptr< for (const auto &id : colnodData->deletedTokens) { if (!database->isAlreadyDeleted(id)) { - preperedColnodData->deletedTokens.append(id); + preparedColnodData->deletedTokens.append(id); } } qInfo(syncmanager) << tab << "-> COLNOD DATA - CHANGES:"; - qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE ADDED/UPDATED IN DATABASE TOO"; + qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE ADDED/UPDATED IN DATABASE AFTER"; qInfo(syncmanager) << tab << tab << alreadySynced.size() << "TOKENS WERE ALREADY SYNCED"; - qInfo(syncmanager) << tab << tab << colnodData->updatedTokens.size() - preperedColnodData->deletedTokens.size() << "TOKENS WERE ALREADY DELETED"; + qInfo(syncmanager) << tab << tab << colnodData->deletedTokens.size() - preparedColnodData->deletedTokens.size() << "TOKENS WERE ALREADY DELETED"; qInfo(syncmanager) << dash; for (const auto &databaseToken : databaseData->updatedTokens) { + + // restriction cauesed by colnod rest api + if (databaseToken->description() != "mobile") { + qCritical(syncmanager) << "Token:" << databaseToken->id() << "doesn't have 'mobile' in description, can't be "; + continue; + } + + // no conflict if (!colnodData->updatedTokens.contains(databaseToken->id())) { - preperedDatabaseData->updatedTokens.insert(databaseToken->id(), databaseToken); - } - if (databaseToken < colnodData->updatedTokens.value(databaseToken->id())) - conflicts.append(databaseToken->id()); - } - else { - // restriction cauesed by colnod rest api - if (databaseToken->description() != "mobile") { - qCritical(syncmanager) << "Token:" << databaseToken->id() << "doesn't have 'mobile' in description, can't be "; - conflicts.append(databaseToken->id()); - } + preparedDatabaseData->updatedTokens.insert(databaseToken->id(), databaseToken); + continue; } + + // database change is newer + if (databaseToken > colnodData->updatedTokens.value(databaseToken->id())) { + preparedDatabaseData->updatedTokens.insert(databaseToken->id(), databaseToken); + } } - for (const auto &id : conflicts) - colnodData->updatedTokens.remove(id); qInfo(syncmanager) << tab << "-> DATABASE DATA - CHANGES:"; - qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE ADDED/UPDATED IN IN COLNOD TOO"; + qInfo(syncmanager) << tab << tab << databaseData->updatedTokens.size() - preparedColnodData->updatedTokens.size() << "TOKENS WERE ADDED/UPDATED IN COLNOD AFTER"; qInfo(syncmanager) << dash; qInfo(syncmanager) << "PREPARING DATA -> FINISHED"; qInfo(syncmanager) << equals; - return nullptr; + + auto preparedData = std::make_unique(preparedDatabaseData, preparedColnodData); + return preparedData; } bool SyncManager::downloadData() From 53697249c634d3f6ffd1649d7222d0c3c5c1abf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Thu, 28 Nov 2019 16:00:22 +0100 Subject: [PATCH 4/5] Add handle of init new tokens --- src/colnod/syncmanager.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/colnod/syncmanager.cpp b/src/colnod/syncmanager.cpp index 1529509..9e630c2 100644 --- a/src/colnod/syncmanager.cpp +++ b/src/colnod/syncmanager.cpp @@ -99,7 +99,7 @@ bool SyncManager::startSynchronization() qInfo(syncmanager) << "PROCESSING DATA -> FINISHED"; qInfo(syncmanager) << equals; - updateLastUpdate(syncBegin); + updateLastUpdate(syncBegin); // TODO: change to update all attrinutes connect(this, &SyncManager::syncFinished, [=](){ if (database->isValid() && colnod->isValid()) { database->setLastSync(syncBegin); @@ -168,6 +168,9 @@ std::unique_ptr SyncManager::prepareDataNew(const std::shared_ptr< qInfo(syncmanager) << dash; for (const auto &databaseToken : databaseData->updatedTokens) { + if (databaseToken->name().isEmpty()) { + initNewToken(databaseToken); + } // restriction cauesed by colnod rest api if (databaseToken->description() != "mobile") { @@ -199,6 +202,16 @@ std::unique_ptr SyncManager::prepareDataNew(const std::shared_ptr< return preparedData; } +void SyncManager::initNewToken(std::shared_ptr token) +{ + qint16 num = database->getNumOfTokensOfSubject(token->subjectId()); + token->setName(database->getSubjectNameByTokenId(token->id()) + "_mobile_" + QString::number(num + 1)); + token->setDescription("mobile"); + token->setTokenData(token->tokenData().toUpper()); + + qInfo(syncmanager).noquote() << Message::massageTemplate("Inicializing new", "token", "sync manager", token->name()); +} + bool SyncManager::downloadData() { bool res = true; From dd0f8fe26736172a4d28e385c9680467fb700674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Thu, 28 Nov 2019 16:02:35 +0100 Subject: [PATCH 5/5] fix cpp check, and unsaved stuff from previous commit --- src/colnod/data.h | 2 +- src/colnod/databaseapi.h | 5 +++-- src/colnod/syncmanager.h | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/colnod/data.h b/src/colnod/data.h index cd6d512..a0f607a 100644 --- a/src/colnod/data.h +++ b/src/colnod/data.h @@ -41,7 +41,7 @@ struct PreparedData { public: PreparedData() = default; - PreparedData(std::shared_ptr database, std::shared_ptr colnod) + PreparedData(const std::shared_ptr &database, const std::shared_ptr &colnod) :databaseData(database), colnodData(colnod) { } diff --git a/src/colnod/databaseapi.h b/src/colnod/databaseapi.h index 34b125d..8668b2f 100644 --- a/src/colnod/databaseapi.h +++ b/src/colnod/databaseapi.h @@ -48,13 +48,14 @@ public: bool isValid(); + qint16 getNumOfTokensOfSubject(const QString &id); + QString getSubjectNameByTokenId(const QString &tokenId); + private: int exists(const QString &id, const QString &tableName); QSqlQuery getUpdatedTokens(); std::shared_ptr composeData(const QSqlQuery &updatedQuery, QSqlQuery &deletedQuery); - qint16 getNumOfTokensOfSubject(const QString &id); - QString getSubjectNameByTokenId(const QString &tokenId); signals: void downloadDataFinished(std::shared_ptr = std::shared_ptr()); diff --git a/src/colnod/syncmanager.h b/src/colnod/syncmanager.h index 5fbfa31..0d2719b 100644 --- a/src/colnod/syncmanager.h +++ b/src/colnod/syncmanager.h @@ -28,6 +28,8 @@ private: std::unique_ptr prepareDataNew(const std::shared_ptr &databaseData, const std::shared_ptr &colnodData); private: + void initNewToken(std::shared_ptr token); + bool downloadData(); bool prepareData(); bool processData();