This commit is contained in:
Ondřej Fischer 2019-11-21 15:33:22 +01:00
parent e5fa284f03
commit 4fe612d11d
7 changed files with 60 additions and 51 deletions

View File

@ -31,7 +31,7 @@ int main(int argc, char *argv[])
// Log messge Filtering
QStringList filters;
filters << "qt.*=false";
filters << "sdk.core.*=true";
filters << "sdk*=false";
//filters << "*=false";
QLoggingCategory::setFilterRules(filters.join(QStringLiteral("\n")));

View File

@ -7,7 +7,7 @@ ColnodAPI::ColnodAPI(serversdk::RequestManager* reqMan, const qint64 &lastSync,
:mReqMan(reqMan), mUserName(userName), mPassword(password), mDryMode(dryMode)
{
mLastSync.set_timestamp(lastSync);
data = std::make_shared<Data>();
mData = std::make_shared<Data>();
// -----------------------------------
mReqMan->setIgnoreSsl(true);
@ -35,6 +35,13 @@ void ColnodAPI::downloadData()
void ColnodAPI::processData(const std::shared_ptr<Data> &data)
{
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";
qInfo(colnod) << dash;
connect(this, &ColnodAPI::partOfDataProcessFinished, this, &ColnodAPI::isDataProcessFinished);
if ( !data->updatedTokens.isEmpty() && !mDryMode) {
setTokens(data->updatedTokens);
@ -76,7 +83,7 @@ void ColnodAPI::getTokensUpdated(const Timestamp &time)
mReqMan->processRequest(request);
connect(request.get(), &serversdk::Request::finished, [=](){
saveUpdatedTokens(request->responseData());
emit partOfDataReady(data);
emit partOfDataReady(mData);
});
}
@ -188,13 +195,13 @@ void ColnodAPI::areDataReady()
if (++amountData == 4) {
qInfo(colnod) << tab << "-> COLNOD DATA:";
qInfo(colnod) << tab << tab << data->updatedTokens.size() << "TOKENS WERE MODIFIED";
qInfo(colnod) << tab << tab << data->deletedTokens.size() << "TOKENS MARKED FOR DELETION";
qInfo(colnod) << tab << tab << data->updatedSubjects.size() << "SUBJECTS WERE MODIFIED";
qInfo(colnod) << tab << tab << data->deletedSubjects.size() << "SUBJECTS MARKED FOR DELETION";
qInfo(colnod) << tab << tab << mData->updatedTokens.size() << "TOKENS WERE MODIFIED";
qInfo(colnod) << tab << tab << mData->deletedTokens.size() << "TOKENS MARKED FOR DELETION";
qInfo(colnod) << tab << tab << mData->updatedSubjects.size() << "SUBJECTS WERE MODIFIED";
qInfo(colnod) << tab << tab << mData->deletedSubjects.size() << "SUBJECTS MARKED FOR DELETION";
qInfo(colnod) << dash;
emit downloadDataFinished(data);
emit downloadDataFinished(mData);
newData();
}
}
@ -202,18 +209,13 @@ void ColnodAPI::areDataReady()
void ColnodAPI::isDataProcessFinished()
{
if (++amountProccessesFinished == 2) {
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";
qInfo(colnod) << dash;
emit dataProcessFinished();
}
}
void ColnodAPI::saveUpdatedTokens(const QByteArray &responseData)
{
data->loadTokensFromJson(responseData);
mData->loadTokensFromJson(responseData);
}
void ColnodAPI::saveDeletedTokens(const QByteArray &responseData)
@ -221,13 +223,13 @@ void ColnodAPI::saveDeletedTokens(const QByteArray &responseData)
QJsonDocument doc = QJsonDocument::fromJson(responseData);
QJsonArray items = doc.object()["items"].toArray();
for (QJsonValueRef item : items) {
data->deletedTokens.append(item.toString());
mData->deletedTokens.append(item.toString());
}
}
void ColnodAPI::saveUpdatedSubjects(const QByteArray &responseData)
{
data->loadSubjectsFormJson(responseData);
mData->loadSubjectsFormJson(responseData);
}
void ColnodAPI::saveDeletedSubjects(const QByteArray &responseData)
@ -235,13 +237,13 @@ void ColnodAPI::saveDeletedSubjects(const QByteArray &responseData)
QJsonDocument doc = QJsonDocument::fromJson(responseData);
QJsonArray items = doc.object()["items"].toArray();
for (QJsonValueRef item : items) {
data->deletedSubjects.append(item.toString());
mData->deletedSubjects.append(item.toString());
}
}
void ColnodAPI::newData()
{
data = std::make_shared<Data>();
mData = std::make_shared<Data>();
}
bool ColnodAPI::checkResponse(const QByteArray &responseData)

View File

@ -91,7 +91,7 @@ private:
Timestamp mLastSync;
bool mDryMode = false;
std::shared_ptr<Data> data;
std::shared_ptr<Data> mData;
QString authToken;
qint16 amountData = 0;

View File

@ -1,6 +1,6 @@
#include "databaseapi.h"
Q_LOGGING_CATEGORY(database, "db.api");
Q_LOGGING_CATEGORY(database, "database.api");
DatabaseAPI::DatabaseAPI(serversdk::DatabaseManager *dbMan, bool dryMode)
: mDryMode(dryMode),
@ -129,7 +129,6 @@ void DatabaseAPI::uploadTokens(const QHash<QString, std::shared_ptr<Token>> &tok
else {
query = utils->insertIntoTable(token.get(), "colnod_token");
}
query = mDbMan->executeQuery(query);
}
}
@ -144,7 +143,6 @@ void DatabaseAPI::uploadSubjects(const QHash<QString, std::shared_ptr<Subject>>
else {
query = utils->insertIntoTable(attribute.get(), "colnod_subject_attribute");
}
query = mDbMan->executeQuery(query);
}
// NOTE: about actions
if (exists(subject->id(), "colnod_subject")) {
@ -153,7 +151,6 @@ void DatabaseAPI::uploadSubjects(const QHash<QString, std::shared_ptr<Subject>>
else {
query = utils->insertIntoTable(subject.get(), "colnod_subject");
}
query = mDbMan->executeQuery(query);
}
}
@ -172,13 +169,13 @@ void DatabaseAPI::deleteItems(const QList<QString> &ids, const QString &tableNam
std::shared_ptr<Token> DatabaseAPI::getLastUpdate(const QString &id)
{
auto query = mDbMan->createQuery();
query.prepare("SELECT last_update FROM colnod_token WHERE id = :id");
query.prepare("SELECT * FROM colnod_token WHERE id = :id");
query.bindValue(":id", id);
mDbMan->executeQuery(query);
if (query.next()) {
return utils->tableFromQuery<Token>(query).at(0);
}
auto list = utils->tableFromQuery<Token>(query);
if (list.isEmpty())
return nullptr;
return list.at(0);
}
bool DatabaseAPI::exists(const QString &id, const QString &tableName)

View File

@ -21,6 +21,9 @@ bool Subject::fromJson(const QByteArray &data)
attributes.append(newAtr);
}
QVariantMap variant = qvariant_cast<QVariantMap>(doc.toVariant());
auto lastUpdate = variant["lastUpdate"].toLongLong();
variant["lastUpdate"] = QDateTime::fromMSecsSinceEpoch(lastUpdate);
variant.insert("lastModified", QDateTime::fromMSecsSinceEpoch(lastUpdate));
// Populate this object data
bool res = fromVariantMap(variant);

View File

@ -42,6 +42,10 @@ void SyncManager::run()
prepareData();
connect(this, &SyncManager::dataProcessFinished, [=](){
qInfo(syncmanager) << "PROCESSING DATA -> FINISHED";
qInfo(syncmanager) << equals;
updateLastUpdate(syncBegin);
connect(this, &SyncManager::syncFinished, [=](){
database->setLastSync(syncBegin);
@ -99,7 +103,7 @@ void SyncManager::prepareData()
continue;
}
auto token = database->getLastUpdate(colnodToken->id());
if ( !token )
if ( token )
if (token == colnodToken)
alreadySynced.append(colnodToken->id());
}
@ -120,6 +124,12 @@ void SyncManager::prepareData()
if (databaseToken > colnodDataToProcess->updatedTokens.value(databaseToken->id()))
conflicts.append(databaseToken->id());
}
else {
if (databaseToken->description() != "mobile") {
qWarning(syncmanager) << "Token:" << databaseToken->id() << "doesn't have 'mobile' in description and won't be pushed to Colnod";
conflicts.append(databaseToken->id());
}
}
}
for (const auto &id : conflicts)
colnodDataToProcess->updatedTokens.remove(id);
@ -137,15 +147,12 @@ void SyncManager::processData()
qInfo(syncmanager) << equals;
qInfo(syncmanager) << "PROCESSING DATA -> BEGIN";
qInfo(syncmanager) << dash;
qInfo(syncmanager) << "Push changes to both Colnod ad Database:";
qInfo(syncmanager) << "Push changes to both Colnod and Database:";
qInfo(syncmanager) << dash;
database->processData(colnodDataToProcess);
connect(colnod.get(), &ColnodAPI::dataProcessFinished, this, &SyncManager::dataProcessFinished);
colnod->processData(databaseDataToProcess);
qInfo(syncmanager) << "PROCESSING DATA -> FINISHED";
qInfo(syncmanager) << equals;
}
void SyncManager::updateLastUpdate(qint64 syncBegin)

View File

@ -43,26 +43,26 @@ public:
QByteArray jsonData(const QSet<QString> &filters = {}) const override;
bool fromJson(const QByteArray &data) override;
friend bool operator<(const Token &lToken, const Token &rToken){
return lToken.lastModified() < rToken.lastUpdate();
friend bool operator<(const std::shared_ptr<Token> &lToken, const std::shared_ptr<Token> &rToken){
return lToken->lastModified() < rToken->lastUpdate();
}
friend bool operator>(const Token &lToken, const Token &rToken){
return lToken.lastModified() > rToken.lastUpdate();
friend bool operator>(const std::shared_ptr<Token> &lToken, const std::shared_ptr<Token> &rToken){
return lToken->lastModified() > rToken->lastUpdate();
}
friend bool operator==(const Token &lToken, const Token &rToken){
return lToken.id() == rToken.id() &&
lToken.name() == rToken.name() &&
lToken.description() == rToken.description() &&
lToken.lastUpdate() == rToken.lastUpdate() &&
lToken.tokenType() == rToken.tokenType() &&
lToken.tokenBits() == rToken.tokenBits() &&
lToken.tokenData() == rToken.tokenData() &&
lToken.timeToLive() == rToken.timeToLive() &&
lToken.authErrors() == rToken.authErrors() &&
lToken.noValidity() == rToken.noValidity() &&
lToken.enabled() == rToken.enabled() &&
lToken.subjectId() == rToken.subjectId();
friend bool operator==(const std::shared_ptr<Token> &lToken, const std::shared_ptr<Token> &rToken)
{
return lToken->id() == rToken->id() &&
lToken->name() == rToken->name() &&
lToken->description() == rToken->description() &&
lToken->lastUpdate() == rToken->lastUpdate() &&
lToken->tokenType() == rToken->tokenType() &&
lToken->tokenBits() == rToken->tokenBits() &&
lToken->tokenData() == rToken->tokenData() &&
lToken->timeToLive() == rToken->timeToLive() &&
lToken->authErrors() == rToken->authErrors() &&
lToken->noValidity() == rToken->noValidity() &&
lToken->enabled() == rToken->enabled() &&
lToken->subjectId() == rToken->subjectId();
}
void fromSQLRecord(const QSqlQuery& query);