forked from ondra/colnod-connector
add dry mode, compare '>' for tokens doesnt work correctly
This commit is contained in:
parent
e0e0d5be7e
commit
921fc2cb77
@ -18,6 +18,7 @@ Acces Management System of Colsys: [Product info](http://produkty.colsys.cz/coln
|
|||||||
- To DB
|
- To DB
|
||||||
- Number of subjects added/deleted/updated
|
- Number of subjects added/deleted/updated
|
||||||
- Number of tokens added/deleted/updated
|
- Number of tokens added/deleted/updated
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- QPSQL driver must be installed (PostgreSQL)
|
- QPSQL driver must be installed (PostgreSQL)
|
||||||
|
|||||||
@ -2,11 +2,19 @@
|
|||||||
|
|
||||||
#include "datamanager.h"
|
#include "datamanager.h"
|
||||||
#include "colnodapi.h"
|
#include "colnodapi.h"
|
||||||
|
#include <QCommandLineParser>
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QCoreApplication a(argc, argv);
|
QCoreApplication app(argc, argv);
|
||||||
auto *api = new ColnodAPI();
|
QCoreApplication::setApplicationName("colnod-connector");
|
||||||
|
QCoreApplication::setApplicationVersion("1.0");
|
||||||
|
QCommandLineParser parser;
|
||||||
|
parser.setApplicationDescription("Dry mode");
|
||||||
|
QCommandLineOption dryModeOption("dryMode", "ColnodAPI", "Read-only mode, prints changes which normally be doing");
|
||||||
|
parser.addOption(dryModeOption);
|
||||||
|
parser.process(app);
|
||||||
|
auto *api = new ColnodAPI(true); // parser.isSet(dryModeOption));
|
||||||
api->loadDataFromDB();
|
api->loadDataFromDB();
|
||||||
api->loadDataFromColnod();
|
api->loadDataFromColnod();
|
||||||
QObject::connect(api, &ColnodAPI::dataDownloaded, [=](){
|
QObject::connect(api, &ColnodAPI::dataDownloaded, [=](){
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
#include "colnodapi.h"
|
#include "colnodapi.h"
|
||||||
|
|
||||||
ColnodAPI::ColnodAPI(bool debug)
|
ColnodAPI::ColnodAPI(bool dryMode)
|
||||||
{
|
{
|
||||||
reqMan = new RequestManager();
|
reqMan = new RequestManager();
|
||||||
dataMan = new DataManager();
|
dataMan = new DataManager(dryMode);
|
||||||
debugMode = debug;
|
this->dryMode = dryMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColnodAPI::loadDataFromColnod()
|
void ColnodAPI::loadDataFromColnod()
|
||||||
@ -67,12 +67,11 @@ void ColnodAPI::loadDeletedDataFromColnod()
|
|||||||
// fill structures in data manager (tokens to updata/to delte)
|
// fill structures in data manager (tokens to updata/to delte)
|
||||||
void ColnodAPI::loadDataFromDB()
|
void ColnodAPI::loadDataFromDB()
|
||||||
{
|
{
|
||||||
dataMan->fillTokensToUpdateDB();
|
dataMan->fillTokensToChangeDB();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColnodAPI::syncDataFromColnodToDB()
|
void ColnodAPI::syncDataFromColnodToDB()
|
||||||
{
|
{
|
||||||
dataMan->filterTokensColnod();
|
|
||||||
syncUpdatedDataFromColnodToDB();
|
syncUpdatedDataFromColnodToDB();
|
||||||
if (dataMan->getLastSync() != 0)
|
if (dataMan->getLastSync() != 0)
|
||||||
syncDeletedDataFromColnodToDB();
|
syncDeletedDataFromColnodToDB();
|
||||||
@ -95,13 +94,17 @@ void ColnodAPI::syncDeletedDataFromColnodToDB()
|
|||||||
// push changes form DB to Colnod
|
// push changes form DB to Colnod
|
||||||
void ColnodAPI::syncDataFromDBToColnod()
|
void ColnodAPI::syncDataFromDBToColnod()
|
||||||
{
|
{
|
||||||
dataMan->filterTokensDB();
|
|
||||||
if (!dataMan->getTokensToUpdateDB().contains("empty")){
|
if (!dataMan->getTokensToUpdateDB().contains("empty")){
|
||||||
syncDeletedDataFromDBToColnod();
|
syncDeletedDataFromDBToColnod();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
deleteFinished = true;
|
||||||
if (!dataMan->getTokensToDeleteDB().contains("empty")){
|
if (!dataMan->getTokensToDeleteDB().contains("empty")){
|
||||||
syncUpdatedDataFromDBToColnod();
|
syncUpdatedDataFromDBToColnod();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
updateFinished = true;
|
||||||
connect(this, &ColnodAPI::dataUpdatedToColnod, dataMan, &DataManager::clear);
|
connect(this, &ColnodAPI::dataUpdatedToColnod, dataMan, &DataManager::clear);
|
||||||
connect(this, &ColnodAPI::dataUpdatedToColnod, dataMan, &DataManager::setLastSync);
|
connect(this, &ColnodAPI::dataUpdatedToColnod, dataMan, &DataManager::setLastSync);
|
||||||
connect(this, &ColnodAPI::dataUpdatedToColnod, [=](){
|
connect(this, &ColnodAPI::dataUpdatedToColnod, [=](){
|
||||||
@ -121,17 +124,25 @@ void ColnodAPI::syncDataFromDBToColnod()
|
|||||||
void ColnodAPI::syncUpdatedDataFromDBToColnod()
|
void ColnodAPI::syncUpdatedDataFromDBToColnod()
|
||||||
{
|
{
|
||||||
auto tokensToUpdate = dataMan->getTokensToUpdateDB();
|
auto tokensToUpdate = dataMan->getTokensToUpdateDB();
|
||||||
|
if (dryMode){
|
||||||
|
for (const auto &token : tokensToUpdate)
|
||||||
|
qInfo() << "Updating token: " << token->idToStringWithoutBraces() << "to Colnod";
|
||||||
|
}
|
||||||
|
else {
|
||||||
Response* resp0 = reqMan->setTokens(tokensToUpdate);
|
Response* resp0 = reqMan->setTokens(tokensToUpdate);
|
||||||
connect(resp0, &Response::ready, [=](){
|
connect(resp0, &Response::ready, [=](){
|
||||||
updateFinished = true;
|
updateFinished = true;
|
||||||
areDataUpdatedToColnod();
|
areDataUpdatedToColnod();
|
||||||
resp0->deleteLater();
|
resp0->deleteLater();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete tokens in Colnod
|
// delete tokens in Colnod
|
||||||
void ColnodAPI::syncDeletedDataFromDBToColnod()
|
void ColnodAPI::syncDeletedDataFromDBToColnod()
|
||||||
{
|
{
|
||||||
|
dataMan->filterTokensDB();
|
||||||
auto tokensToDelete = dataMan->getTokensToDeleteDB();
|
auto tokensToDelete = dataMan->getTokensToDeleteDB();
|
||||||
Response* resp1 = reqMan->deleteTokens(tokensToDelete);
|
Response* resp1 = reqMan->deleteTokens(tokensToDelete);
|
||||||
connect(resp1, &Response::ready, [=](){
|
connect(resp1, &Response::ready, [=](){
|
||||||
|
|||||||
@ -9,7 +9,7 @@ class ColnodAPI : public QObject
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ColnodAPI(bool debugMode = false);
|
ColnodAPI(bool dryMode = false);
|
||||||
|
|
||||||
void syncDataFromColnodToDB();
|
void syncDataFromColnodToDB();
|
||||||
void syncDataFromDBToColnod();
|
void syncDataFromDBToColnod();
|
||||||
@ -47,7 +47,7 @@ private:
|
|||||||
private:
|
private:
|
||||||
RequestManager* reqMan = nullptr;
|
RequestManager* reqMan = nullptr;
|
||||||
DataManager* dataMan = nullptr;
|
DataManager* dataMan = nullptr;
|
||||||
bool debugMode = false;
|
bool dryMode = false;
|
||||||
bool updateFinished = false;
|
bool updateFinished = false;
|
||||||
bool deleteFinished = false;
|
bool deleteFinished = false;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,27 +1,22 @@
|
|||||||
#include "databasemanager.h"
|
#include "databasemanager.h"
|
||||||
|
|
||||||
DatabaseManager::DatabaseManager(const QString& host, const QString& dbName, const QString& user, const QString& password)
|
DatabaseManager::DatabaseManager(const QString& host, const QString& dbName, const QString& user, const QString& password, const bool &dryMode)
|
||||||
{
|
{
|
||||||
|
|
||||||
db = QSqlDatabase::addDatabase("QPSQL");
|
db = QSqlDatabase::addDatabase("QPSQL");
|
||||||
|
|
||||||
db.setDatabaseName(dbName);
|
db.setDatabaseName(dbName);
|
||||||
db.setHostName(host);
|
db.setHostName(host);
|
||||||
db.setUserName(user);
|
db.setUserName(user); // home-office stuff -->> db.setPort(80);
|
||||||
// home-office stuff
|
|
||||||
//db.setPort(80);
|
|
||||||
//
|
|
||||||
db.setPassword(password);
|
db.setPassword(password);
|
||||||
|
|
||||||
if (!db.open())
|
if (!db.open())
|
||||||
{
|
{
|
||||||
qDebug() << "Opening error" + db.lastError().text();
|
qDebug() << "Opening error" + db.lastError().text();
|
||||||
}
|
}
|
||||||
query = QSqlQuery("query", db);
|
query = QSqlQuery("query", db);
|
||||||
|
this->dryMode = dryMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
// add or update subject to db
|
// add or update subject to db
|
||||||
void DatabaseManager::saveSubject(Subject* subject, const QString& table)
|
int DatabaseManager::saveSubject(Subject* subject, const QString& table)
|
||||||
{
|
{
|
||||||
QString id = subject->idToStringWithoutBraces();
|
QString id = subject->idToStringWithoutBraces();
|
||||||
if (checkIfExists(id, table))
|
if (checkIfExists(id, table))
|
||||||
@ -34,6 +29,7 @@ void DatabaseManager::saveSubject(Subject* subject, const QString& table)
|
|||||||
query.bindValue(":last_update", QDateTime::fromMSecsSinceEpoch(subject->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz"));
|
query.bindValue(":last_update", QDateTime::fromMSecsSinceEpoch(subject->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz"));
|
||||||
query.bindValue(":pin", subject->getPin());
|
query.bindValue(":pin", subject->getPin());
|
||||||
executeQuery(query);
|
executeQuery(query);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -45,11 +41,12 @@ void DatabaseManager::saveSubject(Subject* subject, const QString& table)
|
|||||||
query.bindValue(":name", subject->getName());
|
query.bindValue(":name", subject->getName());
|
||||||
query.bindValue(":pin", subject->getPin());
|
query.bindValue(":pin", subject->getPin());
|
||||||
executeQuery(query);
|
executeQuery(query);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// add or update token to DB
|
// add or update token to DB
|
||||||
void DatabaseManager::saveToken(Token* token, const QString& table)
|
int DatabaseManager::saveToken(Token* token, const QString& table)
|
||||||
{
|
{
|
||||||
QString id = token->idToStringWithoutBraces();
|
QString id = token->idToStringWithoutBraces();
|
||||||
if (checkIfExists(id, table))
|
if (checkIfExists(id, table))
|
||||||
@ -70,6 +67,7 @@ void DatabaseManager::saveToken(Token* token, const QString& table)
|
|||||||
query.bindValue(":last_modified", QDateTime::fromMSecsSinceEpoch(token->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz"));
|
query.bindValue(":last_modified", QDateTime::fromMSecsSinceEpoch(token->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz"));
|
||||||
query.bindValue(":deleted", token->getDeleted());
|
query.bindValue(":deleted", token->getDeleted());
|
||||||
executeQuery(query);
|
executeQuery(query);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -90,6 +88,7 @@ void DatabaseManager::saveToken(Token* token, const QString& table)
|
|||||||
query.bindValue(":last_modified", QDateTime::fromMSecsSinceEpoch(token->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz"));
|
query.bindValue(":last_modified", QDateTime::fromMSecsSinceEpoch(token->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz"));
|
||||||
query.bindValue(":deleted", token->getDeleted());
|
query.bindValue(":deleted", token->getDeleted());
|
||||||
executeQuery(query);
|
executeQuery(query);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,29 +139,60 @@ bool DatabaseManager::checkIfExists(const QString& id, const QString& table)
|
|||||||
return query.value(0).toBool();
|
return query.value(0).toBool();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString DatabaseManager::getLastQuery(const QSqlQuery& query) const
|
||||||
|
{
|
||||||
|
QString str = query.lastQuery();
|
||||||
|
QMapIterator<QString, QVariant> it(query.boundValues());
|
||||||
|
while (it.hasNext())
|
||||||
|
{
|
||||||
|
it.next();
|
||||||
|
str.replace(it.key(),it.value().toString());
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatabaseManager::executeNonPreperedQuery(const QString &statement, QSqlQuery &query) const
|
||||||
|
{
|
||||||
|
if (dryMode){
|
||||||
|
if (statement.contains("SELECT"))
|
||||||
|
query.exec(statement);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
query.exec(statement);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
bool DatabaseManager::executeQuery(QSqlQuery &query) const
|
bool DatabaseManager::executeQuery(QSqlQuery &query) const
|
||||||
{
|
{
|
||||||
|
if (dryMode){
|
||||||
|
QString sqlStatement = getLastQuery(query);
|
||||||
|
qDebug() << sqlStatement;
|
||||||
|
if (sqlStatement.contains("SELECT"))
|
||||||
|
query.exec();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else{
|
||||||
bool res = query.exec();
|
bool res = query.exec();
|
||||||
return res;
|
return res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatabaseManager::dropTables()
|
void DatabaseManager::dropTables()
|
||||||
{
|
{
|
||||||
query.exec("DROP TABLE IF EXISTS colnod_token, colnod_subject, colnod_subject_attribute");
|
executeNonPreperedQuery("DROP TABLE IF EXISTS colnod_token, colnod_subject, colnod_subject_attribute", query);
|
||||||
}
|
}
|
||||||
|
|
||||||
// create table after deleting, it is used for full sync
|
// create table after deleting, it is used for full sync
|
||||||
void DatabaseManager::createTables()
|
void DatabaseManager::createTables()
|
||||||
{
|
{
|
||||||
query.exec("CREATE TABLE colnod_subject ("
|
executeNonPreperedQuery("CREATE TABLE colnod_subject ("
|
||||||
"id character(36) primary key NOT NULL,"
|
"id character(36) primary key NOT NULL,"
|
||||||
"description character varying(255),"
|
"description character varying(255),"
|
||||||
"last_update timestamp NOT NULL,"
|
"last_update timestamp NOT NULL,"
|
||||||
"name character varying(255),"
|
"name character varying(255),"
|
||||||
"pin character varying(255))");
|
"pin character varying(255))", query);
|
||||||
|
executeNonPreperedQuery("CREATE TABLE colnod_token ("
|
||||||
query.exec("CREATE TABLE colnod_token ("
|
|
||||||
"id CHAR(36) primary key NOT NULL,"
|
"id CHAR(36) primary key NOT NULL,"
|
||||||
"auth_errors INTEGER NOT NULL,"
|
"auth_errors INTEGER NOT NULL,"
|
||||||
"description VARCHAR(255),"
|
"description VARCHAR(255),"
|
||||||
@ -176,19 +206,18 @@ void DatabaseManager::createTables()
|
|||||||
"token_type VARCHAR(255),"
|
"token_type VARCHAR(255),"
|
||||||
"subject_id CHAR(36),"
|
"subject_id CHAR(36),"
|
||||||
"last_modified timestamp,"
|
"last_modified timestamp,"
|
||||||
"deleted BOOLEAN)");
|
"deleted BOOLEAN)", query);
|
||||||
|
executeNonPreperedQuery("CREATE TABLE colnod_subject_attribute ("
|
||||||
query.exec("CREATE TABLE colnod_subject_attribute ("
|
|
||||||
"id VARCHAR(255) primary key,"
|
"id VARCHAR(255) primary key,"
|
||||||
"attribute_key VARCHAR(255),"
|
"attribute_key VARCHAR(255),"
|
||||||
"attribute_value VARCHAR(255),"
|
"attribute_value VARCHAR(255),"
|
||||||
"subject_id CHAR(36))");
|
"subject_id CHAR(36))", query);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return last_sync time
|
// return last_sync time
|
||||||
quint64 DatabaseManager::getLastSync()
|
quint64 DatabaseManager::getLastSync()
|
||||||
{
|
{
|
||||||
query.exec("SELECT last_sync FROM config");
|
executeNonPreperedQuery("SELECT last_sync FROM config", query);
|
||||||
query.next();
|
query.next();
|
||||||
quint64 temp = query.value(0).toULongLong();
|
quint64 temp = query.value(0).toULongLong();
|
||||||
return temp;
|
return temp;
|
||||||
@ -207,18 +236,18 @@ void DatabaseManager::updateLastSync(quint64 lastSync)
|
|||||||
QSqlQuery* DatabaseManager::getUpdatedTokens()
|
QSqlQuery* DatabaseManager::getUpdatedTokens()
|
||||||
{
|
{
|
||||||
QSqlQuery* qry = new QSqlQuery;
|
QSqlQuery* qry = new QSqlQuery;
|
||||||
qry->exec("SELECT id, auth_errors, description, enabled, last_update, name, no_validity, time_to_live, token_bits, token_data, token_type, subject_id, last_modified, deleted "
|
executeNonPreperedQuery("SELECT id, auth_errors, description, enabled, last_update, name, no_validity, time_to_live, token_bits, token_data, token_type, subject_id, last_modified, deleted "
|
||||||
"FROM colnod_token WHERE EXTRACT(EPOCH FROM last_modified) * 1000 > EXTRACT(EPOCH FROM last_update) * 1000");
|
"FROM colnod_token WHERE EXTRACT(EPOCH FROM last_modified) * 1000 > EXTRACT(EPOCH FROM last_update) * 1000", *qry);
|
||||||
return qry;
|
return qry;
|
||||||
}
|
}
|
||||||
|
|
||||||
QSqlQuery* DatabaseManager::getToken(const QString& id)
|
QSqlQuery* DatabaseManager::getToken(const QString& id)
|
||||||
{
|
{
|
||||||
QSqlQuery* qry = new QSqlQuery;
|
QSqlQuery* qry = new QSqlQuery;
|
||||||
qry->prepare("SELECT SELECT id, auth_errors, description, enabled, last_update, name, no_validity, time_to_live, token_bits, token_data, token_type, subject_id, last_modified, deleted "
|
qry->prepare("SELECT id, auth_errors, description, enabled, last_update, name, no_validity, time_to_live, token_bits, token_data, token_type, subject_id, last_modified, deleted "
|
||||||
"FROM colnod_token WHERE id = :id");
|
"FROM colnod_token WHERE id = :id");
|
||||||
qry->bindValue(":id", id);
|
qry->bindValue(":id", id);
|
||||||
qry->exec();
|
executeQuery(*qry);
|
||||||
if (qry->next()){
|
if (qry->next()){
|
||||||
return qry;
|
return qry;
|
||||||
}
|
}
|
||||||
@ -227,7 +256,7 @@ QSqlQuery* DatabaseManager::getToken(const QString& id)
|
|||||||
|
|
||||||
quint64 DatabaseManager::getNow()
|
quint64 DatabaseManager::getNow()
|
||||||
{
|
{
|
||||||
query.exec("SELECT EXTRACT(EPOCH FROM NOW())*1000");
|
executeNonPreperedQuery("SELECT EXTRACT(EPOCH FROM NOW())*1000", query);
|
||||||
query.next();
|
query.next();
|
||||||
return query.value(0).toULongLong();
|
return query.value(0).toULongLong();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,10 +16,10 @@ class DatabaseManager : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
DatabaseManager(const QString& host, const QString& dbName, const QString& user, const QString& password);
|
DatabaseManager(const QString& host, const QString& dbName, const QString& user, const QString& password, const bool& dryMode = false);
|
||||||
|
|
||||||
void saveSubject(Subject* subject, const QString& table);
|
int saveSubject(Subject* subject, const QString& table);
|
||||||
void saveToken(Token* token, const QString& table);
|
int saveToken(Token* token, const QString& table);
|
||||||
void saveSubjectAttributes(Subject* subject, const QString& table);
|
void saveSubjectAttributes(Subject* subject, const QString& table);
|
||||||
void setDeleted(const QString& id, const QString& table);
|
void setDeleted(const QString& id, const QString& table);
|
||||||
|
|
||||||
@ -38,8 +38,11 @@ public:
|
|||||||
private:
|
private:
|
||||||
bool checkIfExists(const QString& id, const QString& table);
|
bool checkIfExists(const QString& id, const QString& table);
|
||||||
bool executeQuery(QSqlQuery &query) const;
|
bool executeQuery(QSqlQuery &query) const;
|
||||||
|
QString getLastQuery(const QSqlQuery &query) const;
|
||||||
|
void executeNonPreperedQuery(const QString &statement, QSqlQuery& query) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QSqlDatabase db;
|
QSqlDatabase db;
|
||||||
QSqlQuery query;
|
QSqlQuery query;
|
||||||
|
bool dryMode = false;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
#include "datamanager.h"
|
#include "datamanager.h"
|
||||||
|
|
||||||
DataManager::DataManager()
|
DataManager::DataManager(const bool &dryMode)
|
||||||
{
|
{
|
||||||
db = new DatabaseManager("192.168.1.94", "deloitte", "postgres", "34rjkciea12");
|
db = new DatabaseManager("192.168.1.94", "deloitte", "postgres", "34rjkciea12", dryMode);
|
||||||
nextLastSync = db->getNow();
|
nextLastSync = db->getNow();
|
||||||
lastSync = db->getLastSync();
|
lastSync = db->getLastSync();
|
||||||
qDebug() << lastSync;
|
this->dryMode = dryMode;
|
||||||
//db = new DatabaseManager("localhost", "deloitte", "postgres", "34rjkciea12");
|
//db = new DatabaseManager("localhost", "deloitte", "postgres", "34rjkciea12");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -25,6 +25,7 @@ void DataManager::fillFullTokensColnod(const QString& response)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
qCritical() << "Colnod is Empty";
|
||||||
auto token = new Token("empty");
|
auto token = new Token("empty");
|
||||||
allTokensFromColnod.insert(token->idToStringWithoutBraces(), token);
|
allTokensFromColnod.insert(token->idToStringWithoutBraces(), token);
|
||||||
}
|
}
|
||||||
@ -44,11 +45,13 @@ void DataManager::fillTokensToUpdateColnod(const QString& response)
|
|||||||
token->setDeleted(false);
|
token->setDeleted(false);
|
||||||
tokensToUpdateFromColnodToDB.insert(token->idToStringWithoutBraces(), token);
|
tokensToUpdateFromColnodToDB.insert(token->idToStringWithoutBraces(), token);
|
||||||
}
|
}
|
||||||
|
qInfo() << tokensToUpdateFromColnodToDB.size() << " tokens to update from Colnod";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
qInfo() << "0 tokens to update from Colnod";
|
||||||
auto token = new Token("empty");
|
auto token = new Token("empty");
|
||||||
tokensToUpdateFromColnodToDB.insert(token->idToStringWithoutBraces(), token);
|
tokensToUpdateFromColnodToDB.insert(token->getName(), token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,16 +68,18 @@ void DataManager::fillSubjectsToUpdateColnod(const QString& response)
|
|||||||
subject->fromJSON(item.toObject());
|
subject->fromJSON(item.toObject());
|
||||||
subjectsToUpdateFromColnodToDB.insert(subject->idToStringWithoutBraces(), subject);
|
subjectsToUpdateFromColnodToDB.insert(subject->idToStringWithoutBraces(), subject);
|
||||||
}
|
}
|
||||||
|
qInfo() << subjectsToUpdateFromColnodToDB.size() << " subjects to update from Colnod";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
qInfo() << "0 subjects to update from Colnod";
|
||||||
Subject* subject = new Subject("empty");
|
Subject* subject = new Subject("empty");
|
||||||
subjectsToUpdateFromColnodToDB.insert(subject->idToStringWithoutBraces(), subject);
|
subjectsToUpdateFromColnodToDB.insert(subject->getName(), subject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// load working sets with updated/deleted tokens from DB
|
// load working sets with updated/deleted tokens from DB
|
||||||
void DataManager::fillTokensToUpdateDB()
|
void DataManager::fillTokensToChangeDB()
|
||||||
{
|
{
|
||||||
QSqlQuery* query = db->getUpdatedTokens();
|
QSqlQuery* query = db->getUpdatedTokens();
|
||||||
while (query->next())
|
while (query->next())
|
||||||
@ -88,8 +93,8 @@ void DataManager::fillTokensToUpdateDB()
|
|||||||
tokensToUpdateFromDBToColnod.insert(token->idToStringWithoutBraces(), token);
|
tokensToUpdateFromDBToColnod.insert(token->idToStringWithoutBraces(), token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qDebug() << "Number of tokens to update from DB: "<< tokensToUpdateFromDBToColnod.size();
|
qDebug() << tokensToUpdateFromDBToColnod.size() << " tokens to update from DB";
|
||||||
qDebug() << "Number of tokens to delete from DB: "<< tokensFromDBToDeleteFromColnod.size();
|
qDebug() << tokensFromDBToDeleteFromColnod.size() << " tokens to delete from DB";
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataManager::fillSubjectsToUpdateDB()
|
void DataManager::fillSubjectsToUpdateDB()
|
||||||
@ -107,13 +112,15 @@ void DataManager::fillSubjectsToDeleteColnod(const QString& json)
|
|||||||
for (QJsonValueRef item : items) {
|
for (QJsonValueRef item : items) {
|
||||||
subjectsFromColnodToDeleteFromDB.append(item.toString());
|
subjectsFromColnodToDeleteFromDB.append(item.toString());
|
||||||
}
|
}
|
||||||
|
qInfo() << subjectsFromColnodToDeleteFromDB.size() << " subjects deleted in Colnod";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
qInfo() << "0 subjects deleted in Colnod";
|
||||||
subjectsFromColnodToDeleteFromDB.append("empty");
|
subjectsFromColnodToDeleteFromDB.append("empty");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// load working set with tokenst to delete from colnod
|
// load working set with tokens to delete from colnod
|
||||||
void DataManager::fillTokensToDeleteColnod(const QString& json)
|
void DataManager::fillTokensToDeleteColnod(const QString& json)
|
||||||
{
|
{
|
||||||
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());
|
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());
|
||||||
@ -123,8 +130,10 @@ void DataManager::fillTokensToDeleteColnod(const QString& json)
|
|||||||
for (QJsonValueRef item : items) {
|
for (QJsonValueRef item : items) {
|
||||||
tokensFromColnodToDeleteFromDB.append(item.toString());
|
tokensFromColnodToDeleteFromDB.append(item.toString());
|
||||||
}
|
}
|
||||||
|
qInfo() << tokensFromColnodToDeleteFromDB.size() << " tokens deleted in Colnod";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
qInfo() << "0 tokens deleted in Colnod";
|
||||||
tokensFromColnodToDeleteFromDB.append("empty");
|
tokensFromColnodToDeleteFromDB.append("empty");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -138,52 +147,54 @@ void DataManager::fillSubjectsToDeleteDB()
|
|||||||
void DataManager::pushSubjectsToDB()
|
void DataManager::pushSubjectsToDB()
|
||||||
{
|
{
|
||||||
if (subjectsToUpdateFromColnodToDB.contains("empty")) {
|
if (subjectsToUpdateFromColnodToDB.contains("empty")) {
|
||||||
qDebug() << "All subjects are up to date";
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//QSqlDatabase::database().transaction();
|
int updated = 0, added = 0;
|
||||||
qDebug() << "Subjects in progress...";
|
qInfo() << "Subjects in progress...";
|
||||||
for (const auto& subject : subjectsToUpdateFromColnodToDB)
|
for (const auto& subject : subjectsToUpdateFromColnodToDB)
|
||||||
{
|
{
|
||||||
db->saveSubject(subject, "colnod_subject");
|
if (db->saveSubject(subject, "colnod_subject") > 0)
|
||||||
|
added++;
|
||||||
|
else
|
||||||
|
updated++;
|
||||||
db->saveSubjectAttributes(subject, "colnod_subject_attribute");
|
db->saveSubjectAttributes(subject, "colnod_subject_attribute");
|
||||||
}
|
}
|
||||||
//QSqlDatabase::database().commit();
|
qInfo() << added << " subjects added to DB";
|
||||||
qDebug() << subjectsToUpdateFromColnodToDB.size() << " subjects has been updated";
|
qInfo() << updated << " subjects updated to DB";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// update tokens from colnod to DB
|
// update tokens from colnod to DB
|
||||||
void DataManager::pushTokensToDB()
|
void DataManager::pushTokensToDB()
|
||||||
{
|
{
|
||||||
if (tokensToUpdateFromColnodToDB.contains("empty"))
|
if (tokensToUpdateFromColnodToDB.contains("empty")){
|
||||||
{
|
|
||||||
qDebug() << "All tokens are up to date";
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//QSqlDatabase::database().transaction();
|
filterTokensColnod();
|
||||||
qDebug() << "Tokens in progress...";
|
int updated = 0, added = 0;
|
||||||
|
qInfo() << "Tokens in progress...";
|
||||||
for (const auto& token : tokensToUpdateFromColnodToDB)
|
for (const auto& token : tokensToUpdateFromColnodToDB)
|
||||||
{
|
{
|
||||||
db->saveToken(token, "colnod_token");
|
if (db->saveToken(token, "colnod_token") > 0)
|
||||||
|
added++;
|
||||||
|
else
|
||||||
|
updated++;
|
||||||
}
|
}
|
||||||
//QSqlDatabase::database().commit();
|
qInfo() << added << " tokens added to DB";
|
||||||
qDebug() << tokensToUpdateFromColnodToDB.size() << " tokens has been updated";
|
qInfo() << updated << " tokens updated to DB";
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataManager::deleteSubjectsFromDB()
|
void DataManager::deleteSubjectsFromDB()
|
||||||
{
|
{
|
||||||
if (subjectsFromColnodToDeleteFromDB[0] == "empty")
|
if (subjectsFromColnodToDeleteFromDB[0] == "empty")
|
||||||
{
|
{
|
||||||
qDebug() << "No subjects to be deleted";
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qDebug() << "Deleted subjects in progress...";
|
qInfo() << "Deleting subjects in progress...";
|
||||||
for (const auto& subjectId : subjectsFromColnodToDeleteFromDB)
|
for (const auto& subjectId : subjectsFromColnodToDeleteFromDB)
|
||||||
{
|
{
|
||||||
db->setDeleted(subjectId, "colnod_subject");
|
db->setDeleted(subjectId, "colnod_subject");
|
||||||
}
|
}
|
||||||
qDebug() << subjectsFromColnodToDeleteFromDB.size() << "subject has beed deleted";
|
qInfo() << subjectsFromColnodToDeleteFromDB.size() << " subject deleted from DB";
|
||||||
}
|
}
|
||||||
|
|
||||||
// "delete" (set deleted true) tokens in DB depends on Colnod
|
// "delete" (set deleted true) tokens in DB depends on Colnod
|
||||||
@ -191,7 +202,7 @@ void DataManager::setDeletedToTokensFromDB()
|
|||||||
{
|
{
|
||||||
if (tokensFromColnodToDeleteFromDB[0] == "empty")
|
if (tokensFromColnodToDeleteFromDB[0] == "empty")
|
||||||
{
|
{
|
||||||
qDebug() << "No tokens to be deleted";
|
qDebug() << "0 tokens to be deleted";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qDebug() << "Deleted tokens in progress...";
|
qDebug() << "Deleted tokens in progress...";
|
||||||
@ -199,7 +210,7 @@ void DataManager::setDeletedToTokensFromDB()
|
|||||||
{
|
{
|
||||||
db->setDeleted(tokenId, "colnod_token");
|
db->setDeleted(tokenId, "colnod_token");
|
||||||
}
|
}
|
||||||
qDebug() << tokensFromColnodToDeleteFromDB.size() << "tokens has beed deleted";
|
qDebug() << tokensFromColnodToDeleteFromDB.size() << "tokens deleted from DB";
|
||||||
}
|
}
|
||||||
|
|
||||||
// do I have loaded all data
|
// do I have loaded all data
|
||||||
@ -262,6 +273,7 @@ void DataManager::filterTokensColnod()
|
|||||||
auto tokenDB = new Token;
|
auto tokenDB = new Token;
|
||||||
tokenDB->fromSQLRecord(record);
|
tokenDB->fromSQLRecord(record);
|
||||||
Q_ASSERT(tokenDB != token);
|
Q_ASSERT(tokenDB != token);
|
||||||
|
qDebug() << tokenDB->getLastModified() << " > " << token->getLastUpdate();
|
||||||
if (tokenDB > token)
|
if (tokenDB > token)
|
||||||
tokensToUpdateFromColnodToDB.remove(id);
|
tokensToUpdateFromColnodToDB.remove(id);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,7 +14,7 @@ class DataManager : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DataManager();
|
DataManager(const bool& dryMode = false);
|
||||||
|
|
||||||
void fillFullTokensColnod(const QString& jsonResponse);
|
void fillFullTokensColnod(const QString& jsonResponse);
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ public:
|
|||||||
void fillSubjectsToDeleteColnod(const QString& jsonResponse);
|
void fillSubjectsToDeleteColnod(const QString& jsonResponse);
|
||||||
void fillTokensToDeleteColnod(const QString& jsonResponse);
|
void fillTokensToDeleteColnod(const QString& jsonResponse);
|
||||||
|
|
||||||
void fillTokensToUpdateDB();
|
void fillTokensToChangeDB();
|
||||||
void fillSubjectsToUpdateDB();
|
void fillSubjectsToUpdateDB();
|
||||||
void fillSubjectsToDeleteDB();
|
void fillSubjectsToDeleteDB();
|
||||||
|
|
||||||
@ -71,4 +71,6 @@ private:
|
|||||||
QList<QString> subjectsToDeleteDB;
|
QList<QString> subjectsToDeleteDB;
|
||||||
QList<QString> tokensFromDBToDeleteFromColnod;
|
QList<QString> tokensFromDBToDeleteFromColnod;
|
||||||
|
|
||||||
|
bool dryMode = false;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@ -60,7 +60,7 @@ QNetworkReply* RequestManager::postRequest(const QString& endpoint, const QByteA
|
|||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qDebug() << "Authorized successfully, response ready.";
|
//qDebug() << "Authorized successfully, response ready.";
|
||||||
emit responseReady();
|
emit responseReady();
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -67,14 +67,16 @@ void Token::fromSQLRecord(QSqlQuery *query)
|
|||||||
if (query->value(3).toBool())
|
if (query->value(3).toBool())
|
||||||
flags.insert("Enabled");
|
flags.insert("Enabled");
|
||||||
this->flags = flags;
|
this->flags = flags;
|
||||||
setLastUpdate(query->value(4).toUInt());
|
QDateTime date = query->value(4).toDateTime();
|
||||||
|
setLastUpdate(date.toMSecsSinceEpoch());
|
||||||
setName(query->value(5).toString());
|
setName(query->value(5).toString());
|
||||||
timeToLive = query->value(7).toInt();
|
timeToLive = query->value(7).toInt();
|
||||||
tokenBits = query->value(8).toInt();
|
tokenBits = query->value(8).toInt();
|
||||||
tokenData = query->value(9).toString();
|
tokenData = query->value(9).toString();
|
||||||
tokenType = query->value(10).toString();
|
tokenType = query->value(10).toString();
|
||||||
subjectId = query->value(11).toUuid();
|
subjectId = query->value(11).toUuid();
|
||||||
lastModified = query->value(12).toUInt();
|
date = query->value(12).toDateTime();
|
||||||
|
lastModified = date.toMSecsSinceEpoch();
|
||||||
deleted = query->value(13).toBool();
|
deleted = query->value(13).toBool();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,8 @@
|
|||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <qsqlquery.h>
|
#include <qsqlquery.h>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDateTime>
|
||||||
|
|
||||||
class Token : public Entity {
|
class Token : public Entity {
|
||||||
public:
|
public:
|
||||||
@ -13,10 +15,10 @@ public:
|
|||||||
Token(const QString& name, QString tokenData, const QString& decription = "mobile");
|
Token(const QString& name, QString tokenData, const QString& decription = "mobile");
|
||||||
Token(const QString& name);
|
Token(const QString& name);
|
||||||
|
|
||||||
friend bool operator<(const Token &rToken, const Token &lToken){
|
friend bool operator<(const Token &lToken, const Token &rToken){
|
||||||
return rToken.getLastModified() < lToken.getLastUpdate();
|
return lToken.getLastModified() < rToken.getLastUpdate();
|
||||||
}
|
}
|
||||||
friend bool operator>(const Token &rToken, const Token &lToken){
|
friend bool operator>(const Token &lToken, const Token &rToken){
|
||||||
return rToken.getLastModified() > lToken.getLastUpdate();
|
return rToken.getLastModified() > lToken.getLastUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ void ComplexTest::initTestCase()
|
|||||||
deleteTokensRespSpy.wait(timeout);
|
deleteTokensRespSpy.wait(timeout);
|
||||||
QTest::qWait(2500);
|
QTest::qWait(2500);
|
||||||
start = QDateTime::currentMSecsSinceEpoch()-2000;
|
start = QDateTime::currentMSecsSinceEpoch()-2000;
|
||||||
api = new ColnodAPI;
|
api = new ColnodAPI(true);
|
||||||
qDebug() << start;
|
qDebug() << start;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,8 +117,13 @@ void ComplexTest::fullSync()
|
|||||||
api->loadDataFromColnod();
|
api->loadDataFromColnod();
|
||||||
QSignalSpy spy(api, &ColnodAPI::dataDownloaded);
|
QSignalSpy spy(api, &ColnodAPI::dataDownloaded);
|
||||||
spy.wait(timeout);
|
spy.wait(timeout);
|
||||||
|
api->loadDataFromDB();
|
||||||
api->syncDataFromColnodToDB();
|
api->syncDataFromColnodToDB();
|
||||||
// api->syncDataToColnod();
|
api->syncDataFromDBToColnod();
|
||||||
|
QSignalSpy processSpy(api, &ColnodAPI::dataUpdatedToColnod);
|
||||||
|
processSpy.wait(timeout);
|
||||||
|
QSignalSpy finish(api, &ColnodAPI::syncFinished);
|
||||||
|
finish.wait(timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ComplexTest::syncLastUpdated()
|
void ComplexTest::syncLastUpdated()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user