This commit is contained in:
Ondřej Fischer 2019-11-07 08:22:19 +00:00
parent 14cdb47fd8
commit bd6b1f4224

View File

@ -1,202 +1,202 @@
#include "syncmanager.h" #include "syncmanager.h"
SyncManager::SyncManager(bool dryMode) SyncManager::SyncManager(bool dryMode)
{ {
reqMan = std::make_unique<RequestManager>(); reqMan = std::make_unique<RequestManager>();
dataMan = std::make_unique<DataManager>(dryMode); dataMan = std::make_unique<DataManager>(dryMode);
this->dryMode = dryMode; this->dryMode = dryMode;
connect(reqMan.get(), &RequestManager::error, this, &SyncManager::error); connect(reqMan.get(), &RequestManager::error, this, &SyncManager::error);
connect(dataMan.get(), &DataManager::error, this, &SyncManager::error); connect(dataMan.get(), &DataManager::error, this, &SyncManager::error);
} }
void SyncManager::loadDataFromColnod() void SyncManager::loadDataFromColnod()
{ {
loadTokensFromColnod(); loadTokensFromColnod();
loadUpdatedDataFromColnod(); loadUpdatedDataFromColnod();
loadDeletedDataFromColnod(); loadDeletedDataFromColnod();
} }
// download all tokens form colnod for comparing with tokens to update from DB // download all tokens form colnod for comparing with tokens to update from DB
void SyncManager::loadTokensFromColnod() void SyncManager::loadTokensFromColnod()
{ {
Response* resp = reqMan->getTokens(); Response* resp = reqMan->getTokens();
connect(resp, &Response::ready, [=](){ connect(resp, &Response::ready, [=](){
dataMan->fillFullTokensColnod(resp->getJson()); dataMan->fillFullTokensColnod(resp->getJson());
areChangedDataReady(); areChangedDataReady();
resp->deleteLater(); resp->deleteLater();
}); });
} }
// fill tokens/subjects to update in data manager // fill tokens/subjects to update in data manager
void SyncManager::loadUpdatedDataFromColnod() void SyncManager::loadUpdatedDataFromColnod()
{ {
uint64_t lastUpdate = dataMan->getLastSync(); uint64_t lastUpdate = dataMan->getLastSync();
Response* resp0 = reqMan->getSubjectsUpdated(lastUpdate); Response* resp0 = reqMan->getSubjectsUpdated(lastUpdate);
connect(resp0, &Response::ready, [=](){ connect(resp0, &Response::ready, [=](){
dataMan->fillSubjectsToUpdateColnod(resp0->getJson()); dataMan->fillSubjectsToUpdateColnod(resp0->getJson());
areChangedDataReady(); areChangedDataReady();
resp0->deleteLater(); resp0->deleteLater();
}); });
Response* resp1 = reqMan->getTokensUpdated(lastUpdate); Response* resp1 = reqMan->getTokensUpdated(lastUpdate);
connect(resp1, &Response::ready, [=](){ connect(resp1, &Response::ready, [=](){
dataMan->fillTokensToUpdateColnod(resp1->getJson()); dataMan->fillTokensToUpdateColnod(resp1->getJson());
areChangedDataReady(); areChangedDataReady();
resp1->deleteLater(); resp1->deleteLater();
}); });
} }
// fill tokens/subjects to delete in data manager // fill tokens/subjects to delete in data manager
void SyncManager::loadDeletedDataFromColnod() void SyncManager::loadDeletedDataFromColnod()
{ {
uint64_t lastUpdate = dataMan->getLastSync(); uint64_t lastUpdate = dataMan->getLastSync();
Response* resp2 = reqMan->getSubjectsDeleted(lastUpdate); Response* resp2 = reqMan->getSubjectsDeleted(lastUpdate);
connect(resp2, &Response::ready, [=](){ connect(resp2, &Response::ready, [=](){
dataMan->fillSubjectsToDeleteColnod(resp2->getJson()); dataMan->fillSubjectsToDeleteColnod(resp2->getJson());
areChangedDataReady(); areChangedDataReady();
resp2->deleteLater(); resp2->deleteLater();
}); });
Response* resp3 = reqMan->getTokensDeleted(lastUpdate); Response* resp3 = reqMan->getTokensDeleted(lastUpdate);
connect(resp3, &Response::ready, [=](){ connect(resp3, &Response::ready, [=](){
dataMan->fillTokensToDeleteColnod(resp3->getJson()); dataMan->fillTokensToDeleteColnod(resp3->getJson());
areChangedDataReady(); areChangedDataReady();
resp3->deleteLater(); resp3->deleteLater();
}); });
} }
// fill structures in data manager (tokens to updata/to delte) // fill structures in data manager (tokens to updata/to delte)
void SyncManager::loadDataFromDB() void SyncManager::loadDataFromDB()
{ {
dataMan->fillTokensToChangeDB(); dataMan->fillTokensToChangeDB();
} }
void SyncManager::syncDataFromColnodToDB() void SyncManager::syncDataFromColnodToDB()
{ {
syncUpdatedDataFromColnodToDB(); syncUpdatedDataFromColnodToDB();
if (dataMan->getLastSync() != 0) if (dataMan->getLastSync() != 0)
syncDeletedDataFromColnodToDB(); syncDeletedDataFromColnodToDB();
} }
// push data from colnod to DB // push data from colnod to DB
void SyncManager::syncUpdatedDataFromColnodToDB() void SyncManager::syncUpdatedDataFromColnodToDB()
{ {
dataMan->pushSubjectsToDB(); dataMan->pushSubjectsToDB();
dataMan->pushTokensToDB(); dataMan->pushTokensToDB();
} }
// set deleted tokens from Colnod, delete subject // set deleted tokens from Colnod, delete subject
void SyncManager::syncDeletedDataFromColnodToDB() void SyncManager::syncDeletedDataFromColnodToDB()
{ {
dataMan->deleteSubjectsFromDB(); dataMan->deleteSubjectsFromDB();
dataMan->setDeletedToTokensFromDB(); dataMan->setDeletedToTokensFromDB();
} }
// push changes form DB to Colnod // push changes form DB to Colnod
void SyncManager::syncDataFromDBToColnod() void SyncManager::syncDataFromDBToColnod()
{ {
connect(this, &SyncManager::dataUpdatedToColnod, dataMan.get(), &DataManager::clear); connect(this, &SyncManager::dataUpdatedToColnod, dataMan.get(), &DataManager::clear);
//connect(this, &SyncManager::dataUpdatedToColnod, dataMan.get(), &DataManager::setLastSync); //connect(this, &SyncManager::dataUpdatedToColnod, dataMan.get(), &DataManager::setLastSync);
if (!dryMode) if (!dryMode)
connect(this, &SyncManager::dataUpdatedToColnod, [=](){ connect(this, &SyncManager::dataUpdatedToColnod, [=](){
auto resp = reqMan->getTokensUpdated(dataMan->getCurrentSync()); auto resp = reqMan->getTokensUpdated(dataMan->getCurrentSync());
connect(resp, &Response::ready, [=](){ connect(resp, &Response::ready, [=](){
dataMan->fillTokensToUpdateColnod(resp->getJson()); dataMan->fillTokensToUpdateColnod(resp->getJson());
dataMan->setLastUpdate(); dataMan->setLastUpdate();
dataMan->clear(); dataMan->clear();
dataMan->updateLastSync(); dataMan->updateLastSync();
emit syncFinished(); emit syncFinished();
resp->deleteLater(); resp->deleteLater();
}); });
}); });
else else
connect(this, &SyncManager::dataUpdatedToColnod, [=](){ connect(this, &SyncManager::dataUpdatedToColnod, [=](){
dataMan->updateLastSync(); dataMan->updateLastSync();
emit syncFinished(); emit syncFinished();
}); });
if (!dataMan->getTokensToUpdateFromDB().contains("empty")){ if (!dataMan->getTokensToUpdateFromDB().isEmpty()){
syncUpdatedDataFromDBToColnod(); syncUpdatedDataFromDBToColnod();
} }
else else
updateFinished = true; updateFinished = true;
if (!dataMan->getTokensToDeleteDB().contains("empty")){ if (!dataMan->getTokensToDeleteDB().isEmpty()){
syncDeletedDataFromDBToColnod(); syncDeletedDataFromDBToColnod();
} }
else else
deleteFinished = true; deleteFinished = true;
} }
// add or update tokens to Colnod // add or update tokens to Colnod
void SyncManager::syncUpdatedDataFromDBToColnod() void SyncManager::syncUpdatedDataFromDBToColnod()
{ {
dataMan->filterTokensDB(); dataMan->filterTokensDB();
auto tokensToUpdate = dataMan->getTokensToUpdateFromDB(); auto tokensToUpdate = dataMan->getTokensToUpdateFromDB();
if (dryMode){ if (dryMode){
for (const auto &token : tokensToUpdate) for (const auto &token : tokensToUpdate)
qInfo() << "Updating token:" << token->idToStringWithoutBraces() << "to Colnod"; qInfo() << "Updating token:" << token->idToStringWithoutBraces() << "to Colnod";
updateFinished = true; updateFinished = true;
areDataUpdatedToColnod(); areDataUpdatedToColnod();
} }
else { else {
Response* resp0 = reqMan->setTokens(tokensToUpdate); Response* resp0 = reqMan->setTokens(tokensToUpdate);
connect(resp0, &Response::ready, [=](){ connect(resp0, &Response::ready, [=](){
qInfo() << "Colnod:" << tokensToUpdate.size() << "tokens updated"; qInfo() << "Colnod:" << tokensToUpdate.size() << "tokens updated";
for(const auto &token : tokensToUpdate) for(const auto &token : tokensToUpdate)
Logger::logToDb(Logger::makeTokenMsg(token->idToStringWithoutBraces(), "updated", "Colnod")); Logger::logToDb(Logger::makeTokenMsg(token->idToStringWithoutBraces(), "updated", "Colnod"));
updateFinished = true; updateFinished = true;
areDataUpdatedToColnod(); areDataUpdatedToColnod();
resp0->deleteLater(); resp0->deleteLater();
}); });
} }
} }
// delete tokens in Colnod // delete tokens in Colnod
void SyncManager::syncDeletedDataFromDBToColnod() void SyncManager::syncDeletedDataFromDBToColnod()
{ {
auto tokensToDelete = dataMan->getTokensToDeleteDB(); auto tokensToDelete = dataMan->getTokensToDeleteDB();
if (dryMode){ if (dryMode){
for (const auto &token : tokensToDelete) for (const auto &token : tokensToDelete)
qInfo() << "Deleting token:" << token << "from Colnod"; qInfo() << "Deleting token:" << token << "from Colnod";
deleteFinished = true; deleteFinished = true;
areDataUpdatedToColnod(); areDataUpdatedToColnod();
} }
else { else {
Response* resp1 = reqMan->deleteTokens(tokensToDelete); Response* resp1 = reqMan->deleteTokens(tokensToDelete);
connect(resp1, &Response::ready, [=](){ connect(resp1, &Response::ready, [=](){
qInfo() << "Colnod:" << tokensToDelete.size() << "tokens deleted"; qInfo() << "Colnod:" << tokensToDelete.size() << "tokens deleted";
for (const auto &id : tokensToDelete){ for (const auto &id : tokensToDelete){
dataMan->setLastUpdate(id); dataMan->setLastUpdate(id);
Logger::logToDb(Logger::makeTokenMsg(id, "deleted", "Colnod")); Logger::logToDb(Logger::makeTokenMsg(id, "deleted", "Colnod"));
} }
deleteFinished = true; deleteFinished = true;
areDataUpdatedToColnod(); areDataUpdatedToColnod();
resp1->deleteLater(); resp1->deleteLater();
}); });
} }
} }
// For full sync // For full sync
void SyncManager::prepareDatabase() void SyncManager::prepareDatabase()
{ {
dataMan->emptyDatabase(); dataMan->emptyDatabase();
} }
// emit signal when all data is downloaded from Colnod // emit signal when all data is downloaded from Colnod
void SyncManager::areChangedDataReady() void SyncManager::areChangedDataReady()
{ {
if (++dataCounter == 5) if (++dataCounter == 5)
emit dataDownloaded(); emit dataDownloaded();
} }
// emit signal when writing to Colnod is finised // emit signal when writing to Colnod is finised
void SyncManager::areDataUpdatedToColnod() void SyncManager::areDataUpdatedToColnod()
{ {
if (deleteFinished && updateFinished) if (deleteFinished && updateFinished)
{ {
emit dataUpdatedToColnod(); emit dataUpdatedToColnod();
} }
} }