From f1f14bfd3e76c4918196f61d2780e9fc884d424f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Wed, 27 Nov 2019 08:46:47 +0100 Subject: [PATCH] WIP: error handling --- src/colnod/colnodapi.cpp | 10 +++++++- src/colnod/databaseapi.cpp | 50 +++++++++++++++++++++++++++----------- src/colnod/databaseapi.h | 17 +++++++------ src/colnod/syncmanager.cpp | 18 ++++++++++---- src/colnod/syncmanager.h | 15 +++++++----- 5 files changed, 76 insertions(+), 34 deletions(-) diff --git a/src/colnod/colnodapi.cpp b/src/colnod/colnodapi.cpp index 5cd1f28..eadb3b9 100644 --- a/src/colnod/colnodapi.cpp +++ b/src/colnod/colnodapi.cpp @@ -39,7 +39,15 @@ void ColnodAPI::downloadData() void ColnodAPI::processData(const std::shared_ptr &data) { - + for (const auto &token : data->updatedTokens) { + qInfo(colnod).noquote() << Message::massageTemplate("Updating", "token", "colnod", token->name()); + } + for (const auto &id : data->deletedTokens) { + qInfo(colnod).noquote() << Message::massageTemplate("Deleting", "token", "colnod", id); + } + if (!data->updatedTokens.isEmpty() || !data->deletedTokens.isEmpty()) { + qInfo(colnod) << dash; + } 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"; diff --git a/src/colnod/databaseapi.cpp b/src/colnod/databaseapi.cpp index 9e146c0..d4a00b1 100644 --- a/src/colnod/databaseapi.cpp +++ b/src/colnod/databaseapi.cpp @@ -34,26 +34,35 @@ bool DatabaseAPI::executeQuery(QSqlQuery &query, const QString &statement) return true; } -void DatabaseAPI::downloadData() +bool DatabaseAPI::downloadData() { + bool res = true; auto updatedQuery = mDbMan->createQuery(); auto deletedQuery = mDbMan->createQuery(); if (!executeQuery(updatedQuery, "SELECT * FROM colnod_token WHERE last_modified > last_update AND deleted = false")) { qWarning(database) << "ERROR during geting new/updated tokens from db."; + res = false; } if (!executeQuery(deletedQuery, "SELECT id FROM colnod_token WHERE last_modified > last_update AND deleted = true")) { qWarning(database) << "ERROR during geting marked tokens for deletion from db."; + res = false; } emit downloadDataFinished(composeData(updatedQuery, deletedQuery)); + return res; } -void DatabaseAPI::processData(const std::shared_ptr &data) +bool DatabaseAPI::processData(const std::shared_ptr &data) { uploadTokens(data->updatedTokens); uploadSubjects(data->updatedSubjects); deleteItems(data->deletedTokens, "colnod_token"); deleteItems(data->deletedSubjects, "colnod_subject"); - + if ( !data->updatedTokens.isEmpty() || + !data->updatedSubjects.isEmpty() || + !data->deletedTokens.isEmpty() || + !data->deletedSubjects.isEmpty()) { + qInfo(database) << dash; + } qInfo(database) << tab << "-> DATA PROCESSED TO DATABASE:"; qInfo(database) << tab << tab << data->updatedTokens.size() << "TOKENS ADDED/UPDATED"; qInfo(database) << tab << tab << data->deletedTokens.size() << "TOKENS DELETED"; @@ -147,6 +156,8 @@ qint64 DatabaseAPI::getNow() emit error(); } query.next(); + qDebug() << "Database time:" << QDateTime::fromMSecsSinceEpoch(query.value(0).toLongLong()).toString("yyyy-MM-dd hh:mm:ss.zzz"); + qDebug() << "Current time:" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"); return query.value(0).toLongLong(); } @@ -170,7 +181,7 @@ void DatabaseAPI::initNewTokens() uploadTokens(tokensToInit); } -void DatabaseAPI::uploadTokens(const QHash> &tokens) +bool DatabaseAPI::uploadTokens(const QHash> &tokens) { auto query = mDbMan->createQuery(); for (const auto &token : tokens) { @@ -185,11 +196,13 @@ void DatabaseAPI::uploadTokens(const QHash> &tok if (!query.isActive()) { mValid = false; qWarning(database) << "ERROR durning inserting/updating of token:" << token->name(); + return false; } } + return true; } -void DatabaseAPI::uploadSubjects(const QHash> &subjects) +bool DatabaseAPI::uploadSubjects(const QHash> &subjects) { auto query = mDbMan->createQuery(); for (const auto &subject : subjects) { @@ -217,11 +230,13 @@ void DatabaseAPI::uploadSubjects(const QHash> if (!query.isActive()) { mValid = false; qWarning(database) << "ERROR durning inserting/updating of subject attribute:" << subject->name(); + return false; } } + return true; } -void DatabaseAPI::deleteItems(const QList &ids, const QString &tableName) +bool DatabaseAPI::deleteItems(const QList &ids, const QString &tableName) { auto query = mDbMan->createQuery(); QString nowString = QDateTime::fromMSecsSinceEpoch(getLastSync()).toString("yyyy-MM-dd hh:mm:ss.zzz"); @@ -233,18 +248,22 @@ void DatabaseAPI::deleteItems(const QList &ids, const QString &tableNam query.bindValue(":now", nowString); if (!executeQuery(query)) { qWarning(database) << "ERROR during marking token as deleted:" << id; + return false; } } + return true; } -std::shared_ptr DatabaseAPI::getToken(const QString &id) +std::shared_ptr DatabaseAPI::getToken(QString &id) { auto query = mDbMan->createQuery(); - query.prepare("SELECT * FROM colnod_token WHERE id = :id"); + query.prepare("SELECT * FROM colnod_token WHERE d = :id"); query.bindValue(":id", id); if (!executeQuery(query)) { - qCritical(database) << "ERROR during accessing existing tokens"; + qCritical(database) << "ERROR during accessing existing tokens. EXIT"; emit error(); + id = QString(); + return nullptr; } auto list = utils->tableFromQuery(query); if (list.isEmpty()) @@ -252,10 +271,13 @@ std::shared_ptr DatabaseAPI::getToken(const QString &id) return list.at(0); } -bool DatabaseAPI::isAlreadyDeleted(const QString &id) +bool DatabaseAPI::isAlreadyDeleted(QString &id) { auto token = getToken(id); if (!token) { + if (id.isEmpty()) { + + } qWarning(database) << "Token deleted in colnod doesn't exists in db, will be noted as already deleted in stats"; return true; } @@ -270,14 +292,14 @@ bool DatabaseAPI::isValid() return mValid; } -bool DatabaseAPI::exists(const QString &id, const QString &tableName) +int DatabaseAPI::exists(const QString &id, const QString &tableName) { auto query = mDbMan->createQuery(); query.prepare(QString("SELECT 1 FROM %1 WHERE id = :id").arg(tableName)); query.bindValue(":id", id); if (!executeQuery(query)) { qCritical(database) << "ERROR during accessing existing tokens. EXIT(1)"; - emit error(); + return -1; } return query.next(); } @@ -289,7 +311,7 @@ qint16 DatabaseAPI::getNumOfTokensOfSubject(const QString &id) query.bindValue(":id", id); if (!executeQuery(query)) { qCritical(database) << "ERROR during accessing existing tokens. EXIT(1)"; - emit error(); + return -1; } return static_cast(query.size()); } @@ -301,7 +323,7 @@ QString DatabaseAPI::getSubjectNameByTokenId(const QString &tokenId) query.bindValue(":tokenId", tokenId); if (!executeQuery(query)) { qCritical(database) << "ERROR during accessing existing subject. EXIT(1)"; - emit error(); + return "error"; } if (query.next()) return query.value(0).toString(); diff --git a/src/colnod/databaseapi.h b/src/colnod/databaseapi.h index 2990cec..0db6dfc 100644 --- a/src/colnod/databaseapi.h +++ b/src/colnod/databaseapi.h @@ -8,6 +8,7 @@ #include "serversdk/databasetable.h" #include "serversdk/databaseutils.h" #include "serversdk/logger.h" +#include Q_DECLARE_LOGGING_CATEGORY(database) @@ -21,8 +22,8 @@ public: bool executeQuery(QSqlQuery &query, const QString &statement = QString()); - void downloadData(); - void processData(const std::shared_ptr &data); + bool downloadData(); + bool processData(const std::shared_ptr &data); qint64 getLastSync(); void setLastSync(qint64 timestamp); void setLastUpdate(const QHash > &tokens); @@ -32,18 +33,18 @@ public: void initNewTokens(); // process data - void uploadTokens(const QHash > &tokens); - void uploadSubjects(const QHash > &subjects); - void deleteItems(const QList &ids, const QString &tableName); + bool uploadTokens(const QHash > &tokens); + bool uploadSubjects(const QHash > &subjects); + bool deleteItems(const QList &ids, const QString &tableName); - std::shared_ptr getToken(const QString &id); + std::shared_ptr getToken(QString &id); - bool isAlreadyDeleted(const QString &id); + bool isAlreadyDeleted(QString &id); bool isValid(); private: - bool exists(const QString &id, const QString &tableName); + int exists(const QString &id, const QString &tableName); QSqlQuery getUpdatedTokens(); std::shared_ptr composeData(const QSqlQuery &updatedQuery, QSqlQuery &deletedQuery); diff --git a/src/colnod/syncmanager.cpp b/src/colnod/syncmanager.cpp index 59d30f5..9d64097 100644 --- a/src/colnod/syncmanager.cpp +++ b/src/colnod/syncmanager.cpp @@ -37,7 +37,7 @@ bool SyncManager::init() } -void SyncManager::run() +bool SyncManager::run() { qint64 syncBegin = database->getNow(); @@ -79,8 +79,9 @@ void SyncManager::run() }); } -void SyncManager::downloadData() +bool SyncManager::downloadData() { + bool res = true; qInfo(syncmanager) << equals; qInfo(syncmanager) << "DOWNLOADING DATA -> BEGIN"; qInfo(syncmanager) << dash; @@ -89,12 +90,17 @@ void SyncManager::downloadData() connect(colnod.get(), &ColnodAPI::downloadDataFinished, this, &SyncManager::saveColnodData); connect(database.get(), &DatabaseAPI::downloadDataFinished, this, &SyncManager::saveDatabaseData); - database->downloadData(); + if (!database->downloadData()) { + res = false; + } + colnod->downloadData(); + + return true; } // finds conflicts -> changes on both sides (colnod and DB), apply newer change -void SyncManager::prepareData() +bool SyncManager::prepareData() { qInfo(syncmanager) << equals; qInfo(syncmanager) << "PREPARING DATA -> BEGIN"; @@ -176,9 +182,10 @@ void SyncManager::prepareData() qInfo(syncmanager) << "PREPARING DATA -> FINISHED"; qInfo(syncmanager) << equals; + return true; } -void SyncManager::processData() +bool SyncManager::processData() { qInfo(syncmanager) << equals; qInfo(syncmanager) << "PROCESSING DATA -> BEGIN"; @@ -189,6 +196,7 @@ void SyncManager::processData() database->processData(colnodDataToProcess); connect(colnod.get(), &ColnodAPI::dataProcessFinished, this, &SyncManager::dataProcessFinished); colnod->processData(databaseDataToProcess); + return true; } void SyncManager::updateLastUpdate(qint64 syncBegin) diff --git a/src/colnod/syncmanager.h b/src/colnod/syncmanager.h index 55f095b..7533986 100644 --- a/src/colnod/syncmanager.h +++ b/src/colnod/syncmanager.h @@ -8,17 +8,16 @@ Q_DECLARE_LOGGING_CATEGORY(syncmanager) class SyncManager : public QObject { Q_OBJECT - public: - explicit SyncManager(bool dryMode); + explicit SyncManager(bool dryMode, const std::function &onError = nullptr); bool init(); - void run(); + bool run(); private: - void downloadData(); - void prepareData(); - void processData(); + bool downloadData(); + bool prepareData(); + bool processData(); void updateLastUpdate(qint64 syncBegin); @@ -32,6 +31,8 @@ signals: void dataProcessFinished(); void syncFinished(); + void error(); + private: std::shared_ptr colnod; std::shared_ptr database; @@ -47,4 +48,6 @@ private: int dataAmount = 0; bool mDryMode; + + std::function onError = nullptr; };