mirror of
https://gitlab.com/spaceti-app/integrations/acs/colnod-connector.git
synced 2026-07-12 17:00:39 +02:00
Merge branch 'suggest/different-approach' into 'transform-app-using-serversdk'
different approach See merge request spaceti-app/integrations/acs/colnod-connector!22
This commit is contained in:
commit
020adda943
@ -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();
|
||||
}
|
||||
|
||||
@ -19,9 +19,10 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class Data
|
||||
{
|
||||
friend class ColnodAPI;
|
||||
friend class DatabaseAPI;
|
||||
public:
|
||||
Data() = default;
|
||||
|
||||
|
||||
@ -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<Data> 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> &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<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();
|
||||
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());
|
||||
}
|
||||
|
||||
@ -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<Data> downloadData();
|
||||
bool processData(const std::shared_ptr<Data> &data);
|
||||
qint64 getLastSync();
|
||||
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);
|
||||
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<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";
|
||||
// Open database
|
||||
if (!database->open()) {
|
||||
qCritical(syncmanager) << "Not possible to open database:" << dbMan.database().hostName();
|
||||
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<ColnodAPI>(&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> 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, [=](){
|
||||
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<Data>(*colnodData);
|
||||
databaseDataToProcess = std::make_shared<Data>(*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;
|
||||
|
||||
@ -11,8 +11,8 @@ class SyncManager : public QObject
|
||||
public:
|
||||
explicit SyncManager(bool dryMode);
|
||||
|
||||
bool init();
|
||||
bool run();
|
||||
bool databaseInitialization();
|
||||
bool startSynchronization();
|
||||
|
||||
private:
|
||||
bool downloadData();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user