fix IP address of DB

This commit is contained in:
Ondřej Fischer 2019-11-08 09:00:43 +00:00
parent 25b1a0ee0c
commit 9354726740

View File

@ -1,350 +1,350 @@
#include "datamanager.h" #include "datamanager.h"
DataManager::DataManager(const bool &dryMode) DataManager::DataManager(const bool &dryMode)
:dryMode(dryMode) :dryMode(dryMode)
{ {
db = std::make_shared<DatabaseManager>("192.168.1.4", "deloitte", "postgres", "34rjkciea12", dryMode); db = std::make_shared<DatabaseManager>("192.168.1.94", "deloitte", "postgres", "34rjkciea12", dryMode);
//db = std::make_shared<DatabaseManager>("localhost", "deloitte", "postgres", "34rjkciea12"); //db = std::make_shared<DatabaseManager>("localhost", "deloitte", "postgres", "34rjkciea12");
if (db->isOpen()){ if (db->isOpen()){
Logger::setDBMan(db); Logger::setDBMan(db);
nextLastSync = db->getNow(); nextLastSync = db->getNow();
lastSync = db->getLastSync(); lastSync = db->getLastSync();
} }
connect(db.get(), &DatabaseManager::error, this, &DataManager::error, Qt::QueuedConnection); connect(db.get(), &DatabaseManager::error, this, &DataManager::error, Qt::QueuedConnection);
} }
// load all tokens from colnod to comparing with working set from DB // load all tokens from colnod to comparing with working set from DB
void DataManager::fillFullTokensColnod(const QString& response) void DataManager::fillFullTokensColnod(const QString& response)
{ {
QJsonDocument doc = QJsonDocument::fromJson(response.toUtf8()); QJsonDocument doc = QJsonDocument::fromJson(response.toUtf8());
QJsonArray items = doc.object()["items"].toArray(); QJsonArray items = doc.object()["items"].toArray();
if (!items.empty()) if (!items.empty())
{ {
for (QJsonValueRef item : items){ for (QJsonValueRef item : items){
auto token = std::make_shared<Token>(); auto token = std::make_shared<Token>();
token->fromJSON(item.toObject()); token->fromJSON(item.toObject());
allTokensFromColnodById.insert(token->idToStringWithoutBraces(), token); allTokensFromColnodById.insert(token->idToStringWithoutBraces(), token);
allTokensFromColnodByName.insert(token->getName(), token); allTokensFromColnodByName.insert(token->getName(), token);
} }
} }
else{ else{
qCritical() << "Colnod is Empty"; qCritical() << "Colnod is Empty";
} }
} }
// load working set with updated tokens from Colnod // load working set with updated tokens from Colnod
void DataManager::fillTokensToUpdateColnod(const QString& response) void DataManager::fillTokensToUpdateColnod(const QString& response)
{ {
QJsonDocument doc = QJsonDocument::fromJson(response.toUtf8()); QJsonDocument doc = QJsonDocument::fromJson(response.toUtf8());
QJsonArray items = doc.object()["items"].toArray(); QJsonArray items = doc.object()["items"].toArray();
if (!items.empty()) if (!items.empty())
{ {
for (QJsonValueRef item : items) for (QJsonValueRef item : items)
{ {
auto token = std::make_shared<Token>(); auto token = std::make_shared<Token>();
token->fromJSON(item.toObject()); token->fromJSON(item.toObject());
token->setDeleted(false); token->setDeleted(false);
tokensToUpdateFromColnodToDB.insert(token->idToStringWithoutBraces(), token); tokensToUpdateFromColnodToDB.insert(token->idToStringWithoutBraces(), token);
} }
qInfo() << "Colnod:" << tokensToUpdateFromColnodToDB.size() << "tokens to update"; qInfo() << "Colnod:" << tokensToUpdateFromColnodToDB.size() << "tokens to update";
} }
else else
{ {
qInfo() << "Colnod: 0 tokens to update"; qInfo() << "Colnod: 0 tokens to update";
} }
} }
// load working set with updated subjects from Colnod // load working set with updated subjects from Colnod
void DataManager::fillSubjectsToUpdateColnod(const QString& response) void DataManager::fillSubjectsToUpdateColnod(const QString& response)
{ {
QJsonDocument doc = QJsonDocument::fromJson(response.toUtf8()); QJsonDocument doc = QJsonDocument::fromJson(response.toUtf8());
QJsonArray items = doc.object()["items"].toArray(); QJsonArray items = doc.object()["items"].toArray();
if (!items.empty()) if (!items.empty())
{ {
for (QJsonValueRef item : items) for (QJsonValueRef item : items)
{ {
auto subject = std::make_shared<Subject>(); auto subject = std::make_shared<Subject>();
subject->fromJSON(item.toObject()); subject->fromJSON(item.toObject());
subject->setDeleted(false); subject->setDeleted(false);
subjectsToUpdateFromColnodToDB.insert(subject->idToStringWithoutBraces(), subject); subjectsToUpdateFromColnodToDB.insert(subject->idToStringWithoutBraces(), subject);
} }
qInfo() << "Colnod:" << subjectsToUpdateFromColnodToDB.size() << "subjects to update"; qInfo() << "Colnod:" << subjectsToUpdateFromColnodToDB.size() << "subjects to update";
} }
else else
{ {
qInfo() << "Colnod:" << "0 subjects to update"; qInfo() << "Colnod:" << "0 subjects to update";
} }
} }
// load working sets with updated/deleted tokens from DB // load working sets with updated/deleted tokens from DB
void DataManager::fillTokensToChangeDB() void DataManager::fillTokensToChangeDB()
{ {
if (db->isOpen()){ if (db->isOpen()){
QSqlQuery query = db->getUpdatedTokens(); QSqlQuery query = db->getUpdatedTokens();
while (query.next()) while (query.next())
{ {
auto token = std::make_shared<Token>(); auto token = std::make_shared<Token>();
token->fromSQLRecord(query); token->fromSQLRecord(query);
if (token->getDeleted()){ // sort to delete / to update if (token->getDeleted()){ // sort to delete / to update
tokensFromDBToDeleteFromColnod.append(token->idToStringWithoutBraces()); tokensFromDBToDeleteFromColnod.append(token->idToStringWithoutBraces());
} }
else{ else{
tokensToUpdateFromDBToColnod.insert(token->idToStringWithoutBraces(), token); tokensToUpdateFromDBToColnod.insert(token->idToStringWithoutBraces(), token);
} }
} }
qDebug() << "DB:" << tokensToUpdateFromDBToColnod.size() << "tokens to update"; qDebug() << "DB:" << tokensToUpdateFromDBToColnod.size() << "tokens to update";
qDebug() << "DB:" << tokensFromDBToDeleteFromColnod.size() << "tokens to delete"; qDebug() << "DB:" << tokensFromDBToDeleteFromColnod.size() << "tokens to delete";
} }
else else
emit error(); emit error();
} }
void DataManager::fillSubjectsToUpdateDB() void DataManager::fillSubjectsToUpdateDB()
{ {
// Not needed yet // Not needed yet
} }
// load working set with subjest to delete from Colnod // load working set with subjest to delete from Colnod
void DataManager::fillSubjectsToDeleteColnod(const QString& json) void DataManager::fillSubjectsToDeleteColnod(const QString& json)
{ {
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());
QJsonArray items = doc.object()["items"].toArray(); QJsonArray items = doc.object()["items"].toArray();
if (!items.empty()) if (!items.empty())
{ {
for (QJsonValueRef item : items) { for (QJsonValueRef item : items) {
subjectsFromColnodToDeleteFromDB.append(item.toString()); subjectsFromColnodToDeleteFromDB.append(item.toString());
} }
qInfo() << "Colnod:" << subjectsFromColnodToDeleteFromDB.size() << "subjects to delete"; qInfo() << "Colnod:" << subjectsFromColnodToDeleteFromDB.size() << "subjects to delete";
} }
else { else {
qInfo() << "Colnod: 0 subjects to delete"; qInfo() << "Colnod: 0 subjects to delete";
} }
} }
// load working set with tokens to delete from DB // load working set with tokens to delete from DB
void DataManager::fillTokensToDeleteColnod(const QString& json) void DataManager::fillTokensToDeleteColnod(const QString& json)
{ {
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());
QJsonArray items = doc.object()["items"].toArray(); QJsonArray items = doc.object()["items"].toArray();
if (!items.empty()) if (!items.empty())
{ {
for (QJsonValueRef item : items) { for (QJsonValueRef item : items) {
tokensFromColnodToDeleteFromDB.append(item.toString()); tokensFromColnodToDeleteFromDB.append(item.toString());
} }
qInfo() << "Colnod:" << tokensFromColnodToDeleteFromDB.size() << "tokens to delete"; qInfo() << "Colnod:" << tokensFromColnodToDeleteFromDB.size() << "tokens to delete";
} }
else { else {
qInfo() << "Colnod: 0 tokens to delete"; qInfo() << "Colnod: 0 tokens to delete";
} }
} }
void DataManager::fillSubjectsToDeleteDB() void DataManager::fillSubjectsToDeleteDB()
{ {
// Not needed yet // Not needed yet
} }
// update subjects from colnod to DB // update subjects from colnod to DB
void DataManager::pushSubjectsToDB() void DataManager::pushSubjectsToDB()
{ {
if (subjectsToUpdateFromColnodToDB.isEmpty()) { if (subjectsToUpdateFromColnodToDB.isEmpty()) {
qInfo() << "DB: 0 subjects added"; qInfo() << "DB: 0 subjects added";
qInfo() << "DB: 0 subjects updated"; qInfo() << "DB: 0 subjects updated";
return; return;
} }
int updated = 0; int updated = 0;
int added = 0; int added = 0;
for (const auto& subject : subjectsToUpdateFromColnodToDB) for (const auto& subject : subjectsToUpdateFromColnodToDB)
{ {
if (db->saveSubject(subject, "colnod_subject") > 0){ if (db->saveSubject(subject, "colnod_subject") > 0){
added++; added++;
if (dryMode) if (dryMode)
qInfo() << "Adding subject:" << subject->idToStringWithoutBraces() << "to DB"; qInfo() << "Adding subject:" << subject->idToStringWithoutBraces() << "to DB";
else else
Logger::logToDb(Logger::makeSubjectMsg( subject->idToStringWithoutBraces(),"added", "DB")); Logger::logToDb(Logger::makeSubjectMsg( subject->idToStringWithoutBraces(),"added", "DB"));
} }
else{ else{
updated++; updated++;
if (dryMode) if (dryMode)
qInfo() << "Updating subject:" << subject->idToStringWithoutBraces() << "to DB"; qInfo() << "Updating subject:" << subject->idToStringWithoutBraces() << "to DB";
else else
Logger::logToDb(Logger::makeSubjectMsg( subject->idToStringWithoutBraces(),"updated", "DB")); Logger::logToDb(Logger::makeSubjectMsg( subject->idToStringWithoutBraces(),"updated", "DB"));
} }
db->saveSubjectAttributes(subject, "colnod_subject_attribute"); db->saveSubjectAttributes(subject, "colnod_subject_attribute");
} }
qInfo() << "DB:" << added << "subjects added"; qInfo() << "DB:" << added << "subjects added";
qInfo() << "DB:" << updated << "subjects updated"; qInfo() << "DB:" << updated << "subjects updated";
} }
// update tokens from colnod to DB // update tokens from colnod to DB
void DataManager::pushTokensToDB() void DataManager::pushTokensToDB()
{ {
if (tokensToUpdateFromColnodToDB.isEmpty()){ if (tokensToUpdateFromColnodToDB.isEmpty()){
qInfo() << "DB: 0 tokens added"; qInfo() << "DB: 0 tokens added";
qInfo() << "DB: 0 tokens updated"; qInfo() << "DB: 0 tokens updated";
return; return;
} }
filterTokensColnod(); filterTokensColnod();
int updated = 0; int updated = 0;
int added = 0; int added = 0;
for (const auto& token : tokensToUpdateFromColnodToDB) for (const auto& token : tokensToUpdateFromColnodToDB)
{ {
QString text; QString text;
// 1 = adding token // 1 = adding token
// -1 = updating token // -1 = updating token
if (db->saveToken(token, "colnod_token") == 1){ if (db->saveToken(token, "colnod_token") == 1){
added++; added++;
text = "Added"; text = "Added";
} }
else { else {
updated++; updated++;
text = "Updating"; text = "Updating";
} }
if (dryMode) if (dryMode)
qInfo() << text << "token:" << token->idToStringWithoutBraces() << "to DB"; qInfo() << text << "token:" << token->idToStringWithoutBraces() << "to DB";
else else
Logger::logToDb(Logger::makeTokenMsg(token->idToStringWithoutBraces(), text, "DB")); Logger::logToDb(Logger::makeTokenMsg(token->idToStringWithoutBraces(), text, "DB"));
} }
qInfo() << "DB:" << added << "tokens added/edited"; qInfo() << "DB:" << added << "tokens added/edited";
qInfo() << "DB:" << updated << "tokens updated"; qInfo() << "DB:" << updated << "tokens updated";
} }
void DataManager::deleteSubjectsFromDB() void DataManager::deleteSubjectsFromDB()
{ {
if (subjectsFromColnodToDeleteFromDB.isEmpty()) if (subjectsFromColnodToDeleteFromDB.isEmpty())
{ {
qInfo() << "DB: 0 subjects deleted"; qInfo() << "DB: 0 subjects deleted";
return; return;
} }
for (const auto& subjectId : subjectsFromColnodToDeleteFromDB) for (const auto& subjectId : subjectsFromColnodToDeleteFromDB)
{ {
db->setDeleted(subjectId, "colnod_subject", nextLastSync); db->setDeleted(subjectId, "colnod_subject", nextLastSync);
if (dryMode) if (dryMode)
qInfo() << "Deleting subject:" << subjectId << "from DB"; qInfo() << "Deleting subject:" << subjectId << "from DB";
else else
Logger::logToDb(Logger::makeSubjectMsg(subjectId, "deleted", "DB")); Logger::logToDb(Logger::makeSubjectMsg(subjectId, "deleted", "DB"));
} }
qInfo() << "DB:" << subjectsFromColnodToDeleteFromDB.size() << " subject deleted"; qInfo() << "DB:" << subjectsFromColnodToDeleteFromDB.size() << " subject deleted";
} }
// "delete" (set deleted true) tokens in DB depends on Colnod // "delete" (set deleted true) tokens in DB depends on Colnod
void DataManager::setDeletedToTokensFromDB() void DataManager::setDeletedToTokensFromDB()
{ {
if (tokensFromColnodToDeleteFromDB.isEmpty()) if (tokensFromColnodToDeleteFromDB.isEmpty())
{ {
qDebug() << "DB: 0 tokens deleted"; qDebug() << "DB: 0 tokens deleted";
return; return;
} }
int alreadyDeleted = 0; int alreadyDeleted = 0;
for (const auto& tokenId : tokensFromColnodToDeleteFromDB) for (const auto& tokenId : tokensFromColnodToDeleteFromDB)
{ {
if (!db->checkDeletedToken(tokenId)){ if (!db->checkDeletedToken(tokenId)){
db->setDeleted(tokenId, "colnod_token", nextLastSync); db->setDeleted(tokenId, "colnod_token", nextLastSync);
if (dryMode) if (dryMode)
qInfo() << "Deleting token:" << tokenId << "from DB"; qInfo() << "Deleting token:" << tokenId << "from DB";
else else
Logger::logToDb(Logger::makeTokenMsg(tokenId, "deleted", "DB")); Logger::logToDb(Logger::makeTokenMsg(tokenId, "deleted", "DB"));
} }
else else
alreadyDeleted++; alreadyDeleted++;
} }
qDebug() << "DB:" << tokensFromColnodToDeleteFromDB.size() - alreadyDeleted << "tokens deleted"; qDebug() << "DB:" << tokensFromColnodToDeleteFromDB.size() - alreadyDeleted << "tokens deleted";
} }
// recreate working tables // recreate working tables
void DataManager::emptyDatabase() void DataManager::emptyDatabase()
{ {
db->dropTables(); db->dropTables();
db->createTables(); db->createTables();
} }
quint64 DataManager::getLastModifiedOfToken(const QString &id) quint64 DataManager::getLastModifiedOfToken(const QString &id)
{ {
auto record = db->getToken(id); auto record = db->getToken(id);
auto token = std::make_shared<Token>(); auto token = std::make_shared<Token>();
token->fromSQLRecord(record); token->fromSQLRecord(record);
return token->getLastModified(); return token->getLastModified();
} }
//clear all structures //clear all structures
void DataManager::clear() void DataManager::clear()
{ {
subjectsToUpdateFromColnodToDB.clear(); subjectsToUpdateFromColnodToDB.clear();
subjectsFromColnodToDeleteFromDB.clear(); subjectsFromColnodToDeleteFromDB.clear();
tokensToUpdateFromColnodToDB.clear(); tokensToUpdateFromColnodToDB.clear();
tokensFromColnodToDeleteFromDB.clear(); tokensFromColnodToDeleteFromDB.clear();
//subjectsDB.clear(); // not need yet //subjectsDB.clear(); // not need yet
// subjectsToDeleteDB.clear(); // not need yet // subjectsToDeleteDB.clear(); // not need yet
tokensToUpdateFromDBToColnod.clear(); tokensToUpdateFromDBToColnod.clear();
tokensFromDBToDeleteFromColnod.clear(); tokensFromDBToDeleteFromColnod.clear();
allTokensFromColnodById.clear(); allTokensFromColnodById.clear();
} }
// on the very end of sync update last sync time to begin time of this sync // on the very end of sync update last sync time to begin time of this sync
void DataManager::updateLastSync() void DataManager::updateLastSync()
{ {
if (db->isOpen()) if (db->isOpen())
db->updateLastSync(nextLastSync); db->updateLastSync(nextLastSync);
} }
// these to filter functions solve colision tokens -> remove when change on this token is earlier then change on the same token on the other side (Colnod/DB) // these to filter functions solve colision tokens -> remove when change on this token is earlier then change on the same token on the other side (Colnod/DB)
void DataManager::filterTokensDB() void DataManager::filterTokensDB()
{ {
QList<QString> idsToDelete; QList<QString> idsToDelete;
for (const auto& token : tokensToUpdateFromDBToColnod) for (const auto& token : tokensToUpdateFromDBToColnod)
{ {
QString id = token->idToStringWithoutBraces(); QString id = token->idToStringWithoutBraces();
Q_ASSERT(token != allTokensFromColnodById.value(id)); // if working sets are loading correctly equels should never happend Q_ASSERT(token != allTokensFromColnodById.value(id)); // if working sets are loading correctly equels should never happend
if (allTokensFromColnodById.contains(id) && *token < *allTokensFromColnodById.value(id)) if (allTokensFromColnodById.contains(id) && *token < *allTokensFromColnodById.value(id))
idsToDelete.append(id); idsToDelete.append(id);
if (allTokensFromColnodById.contains(id) && token->getLastModified() == allTokensFromColnodById.value(id)->getLastUpdate()){ if (allTokensFromColnodById.contains(id) && token->getLastModified() == allTokensFromColnodById.value(id)->getLastUpdate()){
idsToDelete.append(id); idsToDelete.append(id);
qWarning() << "Same token has been edited in colnod and db in same time. Change from Colnod has been used"; qWarning() << "Same token has been edited in colnod and db in same time. Change from Colnod has been used";
} }
if (allTokensFromColnodByName.contains(token->getName())){ if (allTokensFromColnodByName.contains(token->getName())){
qWarning() << "Token:" << token->idToStringWithoutBraces() << "won't be added to Colnod, because token with the same name already exists, please change it manually"; qWarning() << "Token:" << token->idToStringWithoutBraces() << "won't be added to Colnod, because token with the same name already exists, please change it manually";
if (!dryMode){ if (!dryMode){
QString message = QString("Error: Token: %1 won't be added to Colnod, because token with the same name already exists, please change it manually").arg(token->idToStringWithoutBraces()); QString message = QString("Error: Token: %1 won't be added to Colnod, because token with the same name already exists, please change it manually").arg(token->idToStringWithoutBraces());
Logger::logToDb(Logger::makeErrorMsg("Db", message)); Logger::logToDb(Logger::makeErrorMsg("Db", message));
} }
} }
} }
for (const auto &id : idsToDelete) for (const auto &id : idsToDelete)
tokensToUpdateFromDBToColnod.remove(id); tokensToUpdateFromDBToColnod.remove(id);
} }
void DataManager::filterTokensColnod() void DataManager::filterTokensColnod()
{ {
QList<QString> idsToDelete; QList<QString> idsToDelete;
for (const auto &token : tokensToUpdateFromColnodToDB) for (const auto &token : tokensToUpdateFromColnodToDB)
{ {
QString id = token->idToStringWithoutBraces(); QString id = token->idToStringWithoutBraces();
auto record = db->getToken(id); auto record = db->getToken(id);
if (!record.isValid()) if (!record.isValid())
continue; continue;
auto tokenDB = std::make_shared<Token>(); auto tokenDB = std::make_shared<Token>();
tokenDB->fromSQLRecord(record); tokenDB->fromSQLRecord(record);
if (*tokenDB == *token || *tokenDB > *token){ if (*tokenDB == *token || *tokenDB > *token){
idsToDelete.append(id); idsToDelete.append(id);
} }
} }
for (const auto &id : idsToDelete) for (const auto &id : idsToDelete)
tokensToUpdateFromColnodToDB.remove(id); tokensToUpdateFromColnodToDB.remove(id);
} }
// sync last update from colnod to DB // sync last update from colnod to DB
void DataManager::setLastUpdate() void DataManager::setLastUpdate()
{ {
if (!tokensToUpdateFromColnodToDB.isEmpty()) if (!tokensToUpdateFromColnodToDB.isEmpty())
for (const auto &token : tokensToUpdateFromColnodToDB) for (const auto &token : tokensToUpdateFromColnodToDB)
db->setLastUpdate(token->idToStringWithoutBraces(), token->getLastUpdate()); db->setLastUpdate(token->idToStringWithoutBraces(), token->getLastUpdate());
} }
void DataManager::setLastUpdate(const QString &id) void DataManager::setLastUpdate(const QString &id)
{ {
db->setLastUpdate(id, nextLastSync); db->setLastUpdate(id, nextLastSync);
} }