forked from ondra/colnod-connector
WIP: different approach
This commit is contained in:
parent
a9852b88c1
commit
9f1d0dbc55
@ -12,9 +12,12 @@
|
|||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
// App setup
|
||||||
QCoreApplication app(argc, argv);
|
QCoreApplication app(argc, argv);
|
||||||
QCoreApplication::setApplicationName("colnod-connector");
|
QCoreApplication::setApplicationName("colnod-connector");
|
||||||
QCoreApplication::setApplicationVersion("1.0");
|
QCoreApplication::setApplicationVersion("1.0");
|
||||||
|
|
||||||
|
// Command line parsing
|
||||||
QCommandLineParser parser;
|
QCommandLineParser parser;
|
||||||
parser.setApplicationDescription("Colnod sync");
|
parser.setApplicationDescription("Colnod sync");
|
||||||
QCommandLineOption dryModeOption("dryMode", "ColnodAPI", "Read-only mode, prints changes which would normally be made");
|
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);
|
parser.process(app);
|
||||||
|
|
||||||
|
|
||||||
// ======== LOGGER ==============
|
// Logger initializiaton
|
||||||
serversdk::initAppLogger(); // <-- then Logger::outputMessage will handle all messages
|
serversdk::initAppLogger(); // <-- then Logger::outputMessage will handle all messages
|
||||||
|
|
||||||
// Log messge Filtering
|
// Log messge Filtering
|
||||||
QStringList filters;
|
QStringList filters;
|
||||||
filters << "qt.*=false";
|
filters << "qt.*=false";
|
||||||
@ -35,16 +39,21 @@ int main(int argc, char *argv[])
|
|||||||
//filters << "*=false";
|
//filters << "*=false";
|
||||||
QLoggingCategory::setFilterRules(filters.join(QStringLiteral("\n")));
|
QLoggingCategory::setFilterRules(filters.join(QStringLiteral("\n")));
|
||||||
|
|
||||||
SyncManager api(parser.isSet(dryModeOption));
|
|
||||||
|
|
||||||
// TODO: handle error in init
|
|
||||||
if (api.init()) {
|
SyncManager syncManager(parser.isSet(dryModeOption));
|
||||||
api.run();
|
|
||||||
} else {
|
// Initialize database and colnod API
|
||||||
//error
|
if (!syncManager.databaseInitialization()) {
|
||||||
|
qCritical("Not possible to initialize sync application");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Synchronizaiton
|
||||||
|
if (!syncManager.startSynchronization()) {
|
||||||
|
qCritical("Not possible to start synchronization");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return QCoreApplication::exec();
|
return QCoreApplication::exec();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,9 +19,10 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Data
|
class Data
|
||||||
{
|
{
|
||||||
|
friend class ColnodAPI;
|
||||||
|
friend class DatabaseAPI;
|
||||||
public:
|
public:
|
||||||
Data() = default;
|
Data() = default;
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
Q_LOGGING_CATEGORY(database, "database.api");
|
Q_LOGGING_CATEGORY(database, "database.api");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DatabaseAPI::DatabaseAPI(serversdk::DatabaseManager *dbMan, bool dryMode)
|
DatabaseAPI::DatabaseAPI(serversdk::DatabaseManager *dbMan, bool dryMode)
|
||||||
: mDryMode(dryMode),
|
: mDryMode(dryMode),
|
||||||
mDbMan(dbMan),
|
mDbMan(dbMan),
|
||||||
@ -34,17 +36,23 @@ bool DatabaseAPI::executeQuery(QSqlQuery &query, const QString &statement)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatabaseAPI::downloadData()
|
std::shared_ptr<Data> DatabaseAPI::downloadData()
|
||||||
{
|
{
|
||||||
auto updatedQuery = mDbMan->createQuery();
|
auto updatedQuery = mDbMan->createQuery();
|
||||||
auto deletedQuery = mDbMan->createQuery();
|
auto deletedQuery = mDbMan->createQuery();
|
||||||
if (!executeQuery(updatedQuery, "SELECT * FROM colnod_token WHERE last_modified > last_update AND deleted = false")) {
|
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.";
|
qWarning(database) << "ERROR during geting new/updated tokens from db.";
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
if (!executeQuery(deletedQuery, "SELECT id FROM colnod_token WHERE last_modified > last_update AND deleted = true")) {
|
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.";
|
qWarning(database) << "ERROR during geting marked tokens for deletion from db.";
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
emit downloadDataFinished(composeData(updatedQuery, deletedQuery));
|
|
||||||
|
return composeData(updatedQuery, deletedQuery);
|
||||||
|
// TODO: why emiting signal??
|
||||||
|
// this can return Strucutre
|
||||||
|
//emit downloadDataFinished(composeData(updatedQuery, deletedQuery));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatabaseAPI::processData(const std::shared_ptr<Data> &data)
|
void DatabaseAPI::processData(const std::shared_ptr<Data> &data)
|
||||||
@ -144,6 +152,7 @@ qint64 DatabaseAPI::getNow()
|
|||||||
auto query = mDbMan->createQuery();
|
auto query = mDbMan->createQuery();
|
||||||
if (!executeQuery(query, "SELECT EXTRACT(EPOCH FROM NOW())*1000")) {
|
if (!executeQuery(query, "SELECT EXTRACT(EPOCH FROM NOW())*1000")) {
|
||||||
qCritical(database) << "ERROR during getting acctual time from db";
|
qCritical(database) << "ERROR during getting acctual time from db";
|
||||||
|
return -1;
|
||||||
emit error();
|
emit error();
|
||||||
}
|
}
|
||||||
query.next();
|
query.next();
|
||||||
@ -172,13 +181,29 @@ void DatabaseAPI::initNewTokens()
|
|||||||
|
|
||||||
void DatabaseAPI::uploadTokens(const QHash<QString, std::shared_ptr<Token>> &tokens)
|
void DatabaseAPI::uploadTokens(const QHash<QString, std::shared_ptr<Token>> &tokens)
|
||||||
{
|
{
|
||||||
|
// TODO: first check if OK, then message
|
||||||
|
// OK -> token was updated
|
||||||
|
// ERROR -> not possible to update
|
||||||
auto query = mDbMan->createQuery();
|
auto query = mDbMan->createQuery();
|
||||||
for (const auto &token : tokens) {
|
for (const auto &token : tokens) {
|
||||||
|
// Get token
|
||||||
|
|
||||||
|
QSqlQuery query;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (exists(token->id(), "colnod_token")) {
|
if (exists(token->id(), "colnod_token")) {
|
||||||
query = utils->updateTable(token.get(), "colnod_token");
|
query = utils->updateTable(token.get(), "colnod_token");
|
||||||
qInfo(database).noquote() << Message::massageTemplate("Updating", "token", "database", token->name());
|
qInfo(database).noquote() << Message::massageTemplate("Updating", "token", "database", token->name());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// TODO: first check if OK, then message
|
||||||
|
// OK -> token was updated
|
||||||
|
// ERROR -> not possible to update
|
||||||
query = utils->insertIntoTable(token.get(), "colnod_token");
|
query = utils->insertIntoTable(token.get(), "colnod_token");
|
||||||
qInfo(database).noquote() << Message::massageTemplate("Adding", "token", "database", token->name());
|
qInfo(database).noquote() << Message::massageTemplate("Adding", "token", "database", token->name());
|
||||||
}
|
}
|
||||||
@ -270,6 +295,7 @@ bool DatabaseAPI::isValid()
|
|||||||
return mValid;
|
return mValid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DatabaseAPI::exists(const QString &id, const QString &tableName)
|
bool DatabaseAPI::exists(const QString &id, const QString &tableName)
|
||||||
{
|
{
|
||||||
auto query = mDbMan->createQuery();
|
auto query = mDbMan->createQuery();
|
||||||
|
|||||||
@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
Q_DECLARE_LOGGING_CATEGORY(database)
|
Q_DECLARE_LOGGING_CATEGORY(database)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class DatabaseAPI : public QObject
|
class DatabaseAPI : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -21,7 +23,7 @@ public:
|
|||||||
|
|
||||||
bool executeQuery(QSqlQuery &query, const QString &statement = QString());
|
bool executeQuery(QSqlQuery &query, const QString &statement = QString());
|
||||||
|
|
||||||
void downloadData();
|
std::shared_ptr<Data> downloadData();
|
||||||
void processData(const std::shared_ptr<Data> &data);
|
void processData(const std::shared_ptr<Data> &data);
|
||||||
qint64 getLastSync();
|
qint64 getLastSync();
|
||||||
void setLastSync(qint64 timestamp);
|
void setLastSync(qint64 timestamp);
|
||||||
|
|||||||
@ -10,43 +10,78 @@ SyncManager::SyncManager(bool dryMode)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SyncManager::init()
|
bool SyncManager::databaseInitialization()
|
||||||
{
|
{
|
||||||
database = std::make_shared<DatabaseAPI>(&dbMan, mDryMode);
|
database = std::make_shared<DatabaseAPI>(&dbMan, mDryMode);
|
||||||
connect(database.get(), &DatabaseAPI::error, [=](){
|
// connect(database.get(), &DatabaseAPI::error, [=](){
|
||||||
QCoreApplication::exit(1);
|
// QCoreApplication::exit(1);
|
||||||
});
|
// });
|
||||||
|
|
||||||
if (database->open()){
|
// Open database
|
||||||
mlastSync.set_timestamp(database->getLastSync());
|
if (!database->open()) {
|
||||||
|
qCritical(syncmanager) << "Not possible to open database:" << dbMan.database().hostName();
|
||||||
colnod = std::make_shared<ColnodAPI>(&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";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
qCritical(syncmanager) << "Opening database wasn't successful";
|
|
||||||
return false;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
void SyncManager::run()
|
// here -> nothing can fail
|
||||||
|
mlastSync.set_timestamp(database->getLastSync());
|
||||||
|
colnod = std::make_shared<ColnodAPI>(&reqMan, mlastSync.timestamp(), mDryMode);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SyncManager::startSynchronization()
|
||||||
{
|
{
|
||||||
|
// I have to current time from database
|
||||||
qint64 syncBegin = database->getNow();
|
qint64 syncBegin = database->getNow();
|
||||||
|
if (syncBegin == -1) {
|
||||||
|
qCritical(syncmanager) << "Not possible to get last sync date";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
qInfo(syncmanager) << equals;
|
qInfo(syncmanager) << equals;
|
||||||
qInfo(syncmanager) << "SYNCHRONIZATION BEGIN";
|
qInfo(syncmanager) << "SYNCHRONIZATION BEGIN";
|
||||||
|
|
||||||
|
// TODO: check error
|
||||||
database->initNewTokens();
|
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> 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> data) {
|
||||||
|
qDebug() << "Now I can check that I have all data I need";
|
||||||
|
};
|
||||||
|
|
||||||
|
//connect(this, &SyncManager::dataReady, processDownloadedData);
|
||||||
|
|
||||||
|
|
||||||
connect(this, &SyncManager::dataReady, [=](){
|
connect(this, &SyncManager::dataReady, [=](){
|
||||||
prepareData();
|
prepareData();
|
||||||
|
|
||||||
@ -77,6 +112,7 @@ void SyncManager::run()
|
|||||||
|
|
||||||
processData();
|
processData();
|
||||||
});
|
});
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyncManager::downloadData()
|
void SyncManager::downloadData()
|
||||||
@ -88,8 +124,8 @@ void SyncManager::downloadData()
|
|||||||
qInfo(syncmanager) << dash;
|
qInfo(syncmanager) << dash;
|
||||||
|
|
||||||
connect(colnod.get(), &ColnodAPI::downloadDataFinished, this, &SyncManager::saveColnodData);
|
connect(colnod.get(), &ColnodAPI::downloadDataFinished, this, &SyncManager::saveColnodData);
|
||||||
connect(database.get(), &DatabaseAPI::downloadDataFinished, this, &SyncManager::saveDatabaseData);
|
//connect(database.get(), &DatabaseAPI::downloadDataFinished, this, &SyncManager::saveDatabaseData);
|
||||||
database->downloadData();
|
//database->downloadData();
|
||||||
colnod->downloadData();
|
colnod->downloadData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,6 +139,11 @@ void SyncManager::prepareData()
|
|||||||
qInfo(syncmanager) << dash;
|
qInfo(syncmanager) << dash;
|
||||||
|
|
||||||
|
|
||||||
|
Q_ASSERT(colnodData);
|
||||||
|
Q_ASSERT(databaseData);
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: why copy data?
|
||||||
colnodDataToProcess = std::make_shared<Data>(*colnodData);
|
colnodDataToProcess = std::make_shared<Data>(*colnodData);
|
||||||
databaseDataToProcess = std::make_shared<Data>(*databaseData);
|
databaseDataToProcess = std::make_shared<Data>(*databaseData);
|
||||||
|
|
||||||
@ -205,7 +246,7 @@ void SyncManager::updateLastUpdate(qint64 syncBegin)
|
|||||||
|
|
||||||
void SyncManager::areDataReady()
|
void SyncManager::areDataReady()
|
||||||
{
|
{
|
||||||
if (++dataAmount == 2) {
|
if (++dataAmount == 1) {
|
||||||
|
|
||||||
qInfo(syncmanager) << "DOWNLOADING DATA -> FINISHED";
|
qInfo(syncmanager) << "DOWNLOADING DATA -> FINISHED";
|
||||||
qInfo(syncmanager) << equals;
|
qInfo(syncmanager) << equals;
|
||||||
|
|||||||
@ -12,8 +12,8 @@ class SyncManager : public QObject
|
|||||||
public:
|
public:
|
||||||
explicit SyncManager(bool dryMode);
|
explicit SyncManager(bool dryMode);
|
||||||
|
|
||||||
bool init();
|
bool databaseInitialization();
|
||||||
void run();
|
bool startSynchronization();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void downloadData();
|
void downloadData();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user