diff --git a/src/app/main.cpp b/src/app/main.cpp index bbb40c9..34b50bf 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -12,9 +12,12 @@ int main(int argc, char *argv[]) { + // App setup QCoreApplication app(argc, argv); QCoreApplication::setApplicationName("colnod-connector"); QCoreApplication::setApplicationVersion("1.0"); + + // Command line parsing QCommandLineParser parser; parser.setApplicationDescription("Colnod sync"); QCommandLineOption dryModeOption("dryMode", "ColnodAPI", "Read-only mode, prints changes which would normally be made"); @@ -26,8 +29,9 @@ int main(int argc, char *argv[]) parser.process(app); - // ======== LOGGER ============== + // Logger initializiaton serversdk::initAppLogger(); // <-- then Logger::outputMessage will handle all messages + // Log messge Filtering QStringList filters; filters << "qt.*=false"; @@ -35,16 +39,21 @@ int main(int argc, char *argv[]) //filters << "*=false"; QLoggingCategory::setFilterRules(filters.join(QStringLiteral("\n"))); - SyncManager api(parser.isSet(dryModeOption)); - // TODO: handle error in init - if (api.init()) { - api.run(); - } else { - //error + + SyncManager syncManager(parser.isSet(dryModeOption)); + + // Initialize database and colnod API + if (!syncManager.databaseInitialization()) { + qCritical("Not possible to initialize sync application"); return -1; } + // Synchronizaiton + if (!syncManager.startSynchronization()) { + qCritical("Not possible to start synchronization"); + return -1; + } return QCoreApplication::exec(); } diff --git a/src/colnod/data.h b/src/colnod/data.h index 7beed66..340c9eb 100644 --- a/src/colnod/data.h +++ b/src/colnod/data.h @@ -19,9 +19,10 @@ public: } }; - class Data { + friend class ColnodAPI; + friend class DatabaseAPI; public: Data() = default; diff --git a/src/colnod/databaseapi.cpp b/src/colnod/databaseapi.cpp index b1d605b..3e1e67e 100644 --- a/src/colnod/databaseapi.cpp +++ b/src/colnod/databaseapi.cpp @@ -2,6 +2,8 @@ Q_LOGGING_CATEGORY(database, "database.api"); + + DatabaseAPI::DatabaseAPI(serversdk::DatabaseManager *dbMan, bool dryMode) : mDryMode(dryMode), mDbMan(dbMan), @@ -34,21 +36,23 @@ bool DatabaseAPI::executeQuery(QSqlQuery &query, const QString &statement) return true; } -bool DatabaseAPI::downloadData() +std::shared_ptr 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; + return nullptr; } 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; + return nullptr; } - emit downloadDataFinished(composeData(updatedQuery, deletedQuery)); - return res; + + return composeData(updatedQuery, deletedQuery); + // TODO: why emiting signal?? + // this can return Strucutre + //emit downloadDataFinished(composeData(updatedQuery, deletedQuery)); } bool DatabaseAPI::processData(const std::shared_ptr &data) @@ -153,7 +157,7 @@ qint64 DatabaseAPI::getNow() auto query = mDbMan->createQuery(); if (!executeQuery(query, "SELECT EXTRACT(EPOCH FROM NOW())*1000")) { qCritical(database) << "ERROR during getting acctual time from db"; - emit error(); + return -1; } query.next(); qDebug() << "Database time:" << QDateTime::fromMSecsSinceEpoch(query.value(0).toLongLong()).toString("yyyy-MM-dd hh:mm:ss.zzz"); @@ -183,13 +187,29 @@ void DatabaseAPI::initNewTokens() bool DatabaseAPI::uploadTokens(const QHash> &tokens) { + // TODO: first check if OK, then message + // OK -> token was updated + // ERROR -> not possible to update auto query = mDbMan->createQuery(); for (const auto &token : tokens) { + // Get token + + QSqlQuery query; + + + + + + + if (exists(token->id(), "colnod_token")) { query = utils->updateTable(token.get(), "colnod_token"); qInfo(database).noquote() << Message::massageTemplate("Updating", "token", "database", token->name()); } else { + // TODO: first check if OK, then message + // OK -> token was updated + // ERROR -> not possible to update query = utils->insertIntoTable(token.get(), "colnod_token"); qInfo(database).noquote() << Message::massageTemplate("Adding", "token", "database", token->name()); } diff --git a/src/colnod/databaseapi.h b/src/colnod/databaseapi.h index 023c240..ef71c1e 100644 --- a/src/colnod/databaseapi.h +++ b/src/colnod/databaseapi.h @@ -12,6 +12,8 @@ Q_DECLARE_LOGGING_CATEGORY(database) + + class DatabaseAPI : public QObject { Q_OBJECT @@ -22,7 +24,7 @@ public: bool executeQuery(QSqlQuery &query, const QString &statement = QString()); - bool downloadData(); + std::shared_ptr downloadData(); bool processData(const std::shared_ptr &data); qint64 getLastSync(); void setLastSync(qint64 timestamp); diff --git a/src/colnod/syncmanager.cpp b/src/colnod/syncmanager.cpp index 9d64097..5f39e5c 100644 --- a/src/colnod/syncmanager.cpp +++ b/src/colnod/syncmanager.cpp @@ -10,43 +10,78 @@ SyncManager::SyncManager(bool dryMode) } -bool SyncManager::init() +bool SyncManager::databaseInitialization() { database = std::make_shared(&dbMan, mDryMode); - connect(database.get(), &DatabaseAPI::error, [=](){ - QCoreApplication::exit(1); - }); +// connect(database.get(), &DatabaseAPI::error, [=](){ +// QCoreApplication::exit(1); +// }); - if (database->open()){ - mlastSync.set_timestamp(database->getLastSync()); - - colnod = std::make_shared(&reqMan, mlastSync.timestamp(), mDryMode); - connect(colnod.get(), &ColnodAPI::error, [=](){ - QCoreApplication::exit(1); - }); - - // -1 --> some error with getting data from DB - if (mlastSync.timestamp() >= 0){ - return true; - } - qCritical(syncmanager) << "Couldn't get time of last synchronization"; + // Open database + if (!database->open()) { + qCritical(syncmanager) << "Not possible to open database:" << dbMan.database().hostName(); + return false; } - else - qCritical(syncmanager) << "Opening database wasn't successful"; - return false; + + // Get last synchronizaiton date + qint64 lastsync_in_ms = database->getLastSync(); + if (lastsync_in_ms == -1) { + qCritical(syncmanager) << "Not possible to get last synchronization date"; + return false; + } + + // here -> nothing can fail + mlastSync.set_timestamp(database->getLastSync()); + colnod = std::make_shared(&reqMan, mlastSync.timestamp(), mDryMode); + return true; } -bool SyncManager::run() +bool SyncManager::startSynchronization() { + // I have to current time from database qint64 syncBegin = database->getNow(); + if (syncBegin == -1) { + qCritical(syncmanager) << "Not possible to get last sync date"; + return false; + } qInfo(syncmanager) << equals; qInfo(syncmanager) << "SYNCHRONIZATION BEGIN"; + // TODO: check error database->initNewTokens(); - downloadData(); + + // GETTING DATA FROM DATABASE + auto databaseData = database->downloadData(); + if (!databaseData) { + qCritical(syncmanager) << "not possible to get data from database"; + return false; + } + // NOW I HAVE DATA FROM DATABASE + + + + colnod->downloadData(); + connect(colnod.get(), &ColnodAPI::downloadDataFinished, [=](std::shared_ptr data) { + // NOW I HAVE DATA FROM COLNOD + + // I can process data + qDebug(syncmanager) << "I have colnod and database data"; + qDebug(syncmanager) << "updated token count" << data->updatedTokens.count(); + }); + + return true; + //downloadData(); + + auto colnodDataFinished = [=](std::shared_ptr data) { + qDebug() << "Now I can check that I have all data I need"; + }; + + //connect(this, &SyncManager::dataReady, processDownloadedData); + + connect(this, &SyncManager::dataReady, [=](){ prepareData(); @@ -77,6 +112,7 @@ bool SyncManager::run() processData(); }); + return true; } bool SyncManager::downloadData() @@ -89,14 +125,11 @@ bool SyncManager::downloadData() qInfo(syncmanager) << dash; connect(colnod.get(), &ColnodAPI::downloadDataFinished, this, &SyncManager::saveColnodData); - connect(database.get(), &DatabaseAPI::downloadDataFinished, this, &SyncManager::saveDatabaseData); - if (!database->downloadData()) { - res = false; - } - + //connect(database.get(), &DatabaseAPI::downloadDataFinished, this, &SyncManager::saveDatabaseData); + //database->downloadData(); colnod->downloadData(); - return true; + return res; } // finds conflicts -> changes on both sides (colnod and DB), apply newer change @@ -109,6 +142,11 @@ bool SyncManager::prepareData() qInfo(syncmanager) << dash; + Q_ASSERT(colnodData); + Q_ASSERT(databaseData); + + + // TODO: why copy data? colnodDataToProcess = std::make_shared(*colnodData); databaseDataToProcess = std::make_shared(*databaseData); @@ -213,7 +251,7 @@ void SyncManager::updateLastUpdate(qint64 syncBegin) void SyncManager::areDataReady() { - if (++dataAmount == 2) { + if (++dataAmount == 1) { qInfo(syncmanager) << "DOWNLOADING DATA -> FINISHED"; qInfo(syncmanager) << equals; diff --git a/src/colnod/syncmanager.h b/src/colnod/syncmanager.h index 932c298..07c92e0 100644 --- a/src/colnod/syncmanager.h +++ b/src/colnod/syncmanager.h @@ -11,8 +11,8 @@ class SyncManager : public QObject public: explicit SyncManager(bool dryMode); - bool init(); - bool run(); + bool databaseInitialization(); + bool startSynchronization(); private: bool downloadData();