add checks and fix bugs

This commit is contained in:
Ondřej Fischer 2019-11-25 09:23:18 +01:00
parent 44310bfd9d
commit e52c293a41
3 changed files with 52 additions and 10 deletions

View File

@ -96,6 +96,18 @@ void DatabaseAPI::setLastUpdate(const QHash<QString, std::shared_ptr<Token>> &to
qInfo(database) << equals; qInfo(database) << equals;
} }
void DatabaseAPI::setLastUpdate(const QList<QString> ids)
{
auto query = mDbMan->createQuery();
for (const auto &id : ids){
query.prepare("UPDATE colnod_token SET last_update = :last_update WHERE id = :id");
query.bindValue(":last_update", QDateTime::fromMSecsSinceEpoch(getNow()).toString("yyyy-MM-dd hh:mm:ss.zzz"));
query.bindValue(":id", id);
mDbMan->executeQuery(query);
}
}
qint64 DatabaseAPI::getNow() qint64 DatabaseAPI::getNow()
{ {
auto query = mDbMan->execPlainSql("SELECT EXTRACT(EPOCH FROM NOW())*1000"); auto query = mDbMan->execPlainSql("SELECT EXTRACT(EPOCH FROM NOW())*1000");
@ -105,15 +117,14 @@ qint64 DatabaseAPI::getNow()
void DatabaseAPI::initNewTokens() void DatabaseAPI::initNewTokens()
{ {
auto query = mDbMan->execPlainSql("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 " auto query = mDbMan->execPlainSql("SELECT * FROM colnod_token WHERE name IS NULL");
"FROM colnod_token WHERE name IS NULL");
QHash<QString, std::shared_ptr<Token>> tokensToInit; QHash<QString, std::shared_ptr<Token>> tokensToInit;
while (query.next()){ auto list = utils->tableFromQuery<Token>(query);
auto token = std::make_shared<Token>(); for (const auto &token : list) {
token->fromSQLRecord(query);
qint16 num = getNumOfTokensOfSubject(token->subjectId()); qint16 num = getNumOfTokensOfSubject(token->subjectId());
token->setName(getSubjectNameByTokenId(token->id()) + "_mobile_" + QString::number(num + 1)); token->setName(getSubjectNameByTokenId(token->id()) + "_mobile_" + QString::number(num + 1));
token->setDescription("mobile"); token->setDescription("mobile");
token->setTokenData(token->tokenData().toUpper());
tokensToInit.insert(token->id(), token); tokensToInit.insert(token->id(), token);
} }
uploadTokens(tokensToInit); uploadTokens(tokensToInit);
@ -166,7 +177,7 @@ void DatabaseAPI::deleteItems(const QList<QString> &ids, const QString &tableNam
} }
} }
std::shared_ptr<Token> DatabaseAPI::getLastUpdate(const QString &id) std::shared_ptr<Token> DatabaseAPI::getToken(const QString &id)
{ {
auto query = mDbMan->createQuery(); auto query = mDbMan->createQuery();
query.prepare("SELECT * FROM colnod_token WHERE id = :id"); query.prepare("SELECT * FROM colnod_token WHERE id = :id");
@ -178,6 +189,15 @@ std::shared_ptr<Token> DatabaseAPI::getLastUpdate(const QString &id)
return list.at(0); return list.at(0);
} }
bool DatabaseAPI::isAlreadyDeleted(const QString &id)
{
auto token = getToken(id);
if (token->lastUpdate() >= token->lastModified())
return true;
return false;
}
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();

View File

@ -24,6 +24,7 @@ public:
qint64 getLastSync(); qint64 getLastSync();
void setLastSync(qint64 timestamp); void setLastSync(qint64 timestamp);
void setLastUpdate(const QHash<QString, std::shared_ptr<Token> > &tokens); void setLastUpdate(const QHash<QString, std::shared_ptr<Token> > &tokens);
void setLastUpdate(const QList<QString> ids);
qint64 getNow(); qint64 getNow();
void initNewTokens(); void initNewTokens();
@ -33,7 +34,9 @@ public:
void uploadSubjects(const QHash<QString, std::shared_ptr<Subject> > &subjects); void uploadSubjects(const QHash<QString, std::shared_ptr<Subject> > &subjects);
void deleteItems(const QList<QString> &ids, const QString &tableName); void deleteItems(const QList<QString> &ids, const QString &tableName);
std::shared_ptr<Token> getLastUpdate(const QString &id); std::shared_ptr<Token> getToken(const QString &id);
bool isAlreadyDeleted(const QString &id);
private: private:
bool exists(const QString &id, const QString &tableName); bool exists(const QString &id, const QString &tableName);

View File

@ -95,23 +95,39 @@ void SyncManager::prepareData()
QList<QString> conflicts; QList<QString> conflicts;
QList<QString> alreadySynced; QList<QString> alreadySynced;
// check modifed tokens from colnod, dont want update token, if it was edited in db after or has been already synced
for (const auto &colnodToken : colnodDataToProcess->updatedTokens) { for (const auto &colnodToken : colnodDataToProcess->updatedTokens) {
if (databaseDataToProcess->updatedTokens.contains(colnodToken->id())) { if (databaseDataToProcess->updatedTokens.contains(colnodToken->id())) {
// updated in db later
if (databaseDataToProcess->updatedTokens.value(colnodToken->id()) > colnodToken) { if (databaseDataToProcess->updatedTokens.value(colnodToken->id()) > colnodToken) {
conflicts.append(colnodToken->id()); conflicts.append(colnodToken->id());
} }
continue; continue;
} }
auto token = database->getLastUpdate(colnodToken->id()); auto token = database->getToken(colnodToken->id());
if ( token ) if ( token )
// alredy synced ( tokens are same )
if (token == colnodToken) if (token == colnodToken)
alreadySynced.append(colnodToken->id()); alreadySynced.append(colnodToken->id());
} }
// remove tokens which should be not updated
for (const auto &id : conflicts) for (const auto &id : conflicts)
colnodDataToProcess->updatedTokens.remove(id); colnodDataToProcess->updatedTokens.remove(id);
for (const auto &id : alreadySynced) for (const auto &id : alreadySynced)
colnodDataToProcess->updatedTokens.remove(id); colnodDataToProcess->updatedTokens.remove(id);
conflicts.clear();
// chech for already deleted ( in previous synced tokens were deleted from colnod, so it come to this sync but we dont want to sync it again
for (const auto &id : colnodDataToProcess->deletedTokens) {
if (database->isAlreadyDeleted(id)) {
conflicts.append(id);
}
}
for (const auto &id : conflicts) {
colnodDataToProcess->deletedTokens.removeOne(id);
}
qInfo(syncmanager) << tab << "-> COLNOD DATA - CHANGES:"; qInfo(syncmanager) << tab << "-> COLNOD DATA - CHANGES:";
qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE MODIFIED IN DATABASE"; qInfo(syncmanager) << tab << tab << conflicts.size() << "TOKENS WERE MODIFIED IN DATABASE";
qInfo(syncmanager) << tab << tab << alreadySynced.size() << "TOKENS WERE ALREADY SYNCED"; qInfo(syncmanager) << tab << tab << alreadySynced.size() << "TOKENS WERE ALREADY SYNCED";
@ -119,14 +135,16 @@ void SyncManager::prepareData()
conflicts.clear(); conflicts.clear();
for (const auto &databaseToken : databaseData->updatedTokens) { // chech modified from db, remove token if it was edited in colnod later
for (const auto &databaseToken : databaseDataToProcess->updatedTokens) {
if (colnodDataToProcess->updatedTokens.contains(databaseToken->id())) { if (colnodDataToProcess->updatedTokens.contains(databaseToken->id())) {
if (databaseToken < colnodDataToProcess->updatedTokens.value(databaseToken->id())) if (databaseToken < colnodDataToProcess->updatedTokens.value(databaseToken->id()))
conflicts.append(databaseToken->id()); conflicts.append(databaseToken->id());
} }
else { else {
// restriction cauesed by colnod rest api
if (databaseToken->description() != "mobile") { if (databaseToken->description() != "mobile") {
qWarning(syncmanager) << "Token:" << databaseToken->id() << "doesn't have 'mobile' in description and won't be pushed to Colnod"; qCritical(syncmanager) << "Token:" << databaseToken->id() << "doesn't have 'mobile' in description, can't be ";
conflicts.append(databaseToken->id()); conflicts.append(databaseToken->id());
} }
} }
@ -160,6 +178,7 @@ void SyncManager::updateLastUpdate(qint64 syncBegin)
Timestamp time; Timestamp time;
time.set_timestamp(syncBegin); time.set_timestamp(syncBegin);
colnod->getTokensUpdated(time); colnod->getTokensUpdated(time);
database->setLastUpdate(databaseDataToProcess->deletedTokens);
connect(colnod.get(), &ColnodAPI::partOfDataReady, [=](const std::shared_ptr<Data> &data){ connect(colnod.get(), &ColnodAPI::partOfDataReady, [=](const std::shared_ptr<Data> &data){
database->setLastUpdate(data->updatedTokens); database->setLastUpdate(data->updatedTokens);
emit syncFinished(); emit syncFinished();