Add logger class

This commit is contained in:
Ondřej Fischer 2019-10-29 15:59:21 +01:00
parent 921fc2cb77
commit a55a6f6b93
16 changed files with 159 additions and 97 deletions

View File

@ -10,8 +10,9 @@ int main(int argc, char *argv[])
QCoreApplication::setApplicationName("colnod-connector");
QCoreApplication::setApplicationVersion("1.0");
QCommandLineParser parser;
Logger *logger = Logger::getLogger();
parser.setApplicationDescription("Dry mode");
QCommandLineOption dryModeOption("dryMode", "ColnodAPI", "Read-only mode, prints changes which normally be doing");
QCommandLineOption dryModeOption("dryMode", "ColnodAPI", "Read-only mode, prints changes which would normally be made");
parser.addOption(dryModeOption);
parser.process(app);
auto *api = new ColnodAPI(true); // parser.isSet(dryModeOption));

View File

@ -6,6 +6,7 @@ SOURCES += \
$$PWD/databasemanager.cpp \
$$PWD/datamanager.cpp \
$$PWD/entity.cpp \
$$PWD/logger.cpp \
$$PWD/requestmanager.cpp \
$$PWD/response.cpp \
$$PWD/subject.cpp \
@ -16,6 +17,7 @@ HEADERS += \
$$PWD/databasemanager.h \
$$PWD/datamanager.h \
$$PWD/entity.h \
$$PWD/logger.h \
$$PWD/requestmanager.h \
$$PWD/response.h \
$$PWD/subject.h \

View File

@ -2,6 +2,7 @@
#include "requestmanager.h"
#include "datamanager.h"
#include "logger.h"
class ColnodAPI : public QObject
{

View File

@ -31,8 +31,8 @@ int DatabaseManager::saveSubject(Subject* subject, const QString& table)
executeQuery(query);
return -1;
}
else
{
query.prepare(QString("INSERT INTO %1 (id, description, last_update, name, pin) "
"VALUES (:id, :description, :last_update, :name, :pin)").arg(table));
query.bindValue(":id", id);
@ -42,7 +42,7 @@ int DatabaseManager::saveSubject(Subject* subject, const QString& table)
query.bindValue(":pin", subject->getPin());
executeQuery(query);
return 1;
}
}
// add or update token to DB
@ -69,8 +69,8 @@ int DatabaseManager::saveToken(Token* token, const QString& table)
executeQuery(query);
return -1;
}
else
{
query.prepare(QString("INSERT INTO %1 (id, auth_errors, description, enabled, last_update, name, no_validity, time_to_live, token_bits, token_data, token_type, subject_id, last_modified, deleted) "
"VALUES (:id, :auth_errors, :description, :enabled, :last_update, :name, :no_validity, :time_to_live, :token_bits, :token_data, :token_type, :subject_id, :last_modified, :deleted)").arg(table));
query.bindValue(":id", id);
@ -89,7 +89,7 @@ int DatabaseManager::saveToken(Token* token, const QString& table)
query.bindValue(":deleted", token->getDeleted());
executeQuery(query);
return 1;
}
}
// add of update subject attributes
@ -172,10 +172,10 @@ bool DatabaseManager::executeQuery(QSqlQuery &query) const
query.exec();
return true;
}
else{
bool res = query.exec();
return res;
}
}
void DatabaseManager::dropTables()
@ -270,3 +270,11 @@ void DatabaseManager::setLastUpdate(const QString& id, quint64 lastUpdate)
executeQuery(query);
}
void DatabaseManager::log(QString msg)
{
query.prepare("INSERT INTO logs (msg) VALUES (:msg)");
query.bindValue(":msg", msg);
query.exec();
//executeQuery(query);
}

View File

@ -10,6 +10,7 @@
#include "subject.h"
#include "token.h"
#include <QDateTime>
//#include "logger.h"
class DatabaseManager : public QObject
@ -35,6 +36,8 @@ public:
void setLastUpdate(const QString& id, quint64 lastUpdate);
void log(QString msg);
private:
bool checkIfExists(const QString& id, const QString& table);
bool executeQuery(QSqlQuery &query) const;

View File

@ -3,10 +3,11 @@
DataManager::DataManager(const bool &dryMode)
{
db = new DatabaseManager("192.168.1.94", "deloitte", "postgres", "34rjkciea12", dryMode);
//db = new DatabaseManager("localhost", "deloitte", "postgres", "34rjkciea12");
Logger::setDBMan(db);
nextLastSync = db->getNow();
lastSync = db->getLastSync();
this->dryMode = dryMode;
//db = new DatabaseManager("localhost", "deloitte", "postgres", "34rjkciea12");
}
// load all tokens from colnod to comparing with working set from DB
@ -105,6 +106,8 @@ void DataManager::fillSubjectsToUpdateDB()
// load working set with subjest to delete from Colnod
void DataManager::fillSubjectsToDeleteColnod(const QString& json)
{
Logger::log("hello from dataManager :)");
Logger::logToDb("testing");
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());
QJsonArray items = doc.object()["items"].toArray();
if (!items.empty())
@ -120,7 +123,7 @@ void DataManager::fillSubjectsToDeleteColnod(const QString& json)
}
}
// load working set with tokens to delete from colnod
// load working set with tokens to delete from DB
void DataManager::fillTokensToDeleteColnod(const QString& json)
{
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());
@ -149,7 +152,8 @@ void DataManager::pushSubjectsToDB()
if (subjectsToUpdateFromColnodToDB.contains("empty")) {
return;
}
int updated = 0, added = 0;
int updated = 0;
int added = 0;
qInfo() << "Subjects in progress...";
for (const auto& subject : subjectsToUpdateFromColnodToDB)
{
@ -170,7 +174,8 @@ void DataManager::pushTokensToDB()
return;
}
filterTokensColnod();
int updated = 0, added = 0;
int updated = 0;
int added = 0;
qInfo() << "Tokens in progress...";
for (const auto& token : tokensToUpdateFromColnodToDB)
{
@ -181,6 +186,7 @@ void DataManager::pushTokensToDB()
}
qInfo() << added << " tokens added to DB";
qInfo() << updated << " tokens updated to DB";
}
void DataManager::deleteSubjectsFromDB()
@ -253,11 +259,11 @@ void DataManager::updateLastSync()
// these to filter functions solve colision tokens -> remove when change on this token is earlier then change on the same token on the other side (Colnod/DB)
void DataManager::filterTokensDB()
{
for (auto token : tokensToUpdateFromDBToColnod)
for (const auto& token : tokensToUpdateFromDBToColnod)
{
QString id = token->idToStringWithoutBraces();
Q_ASSERT(token = allTokensFromColnod.value(id)); // if working sets are loading correctly equels should never happend
if (allTokensFromColnod.contains(id) && token < allTokensFromColnod.value(id))
Q_ASSERT(token != allTokensFromColnod.value(id)); // if working sets are loading correctly equels should never happend
if (allTokensFromColnod.contains(id) && *token < *allTokensFromColnod.value(id))
tokensToUpdateFromDBToColnod.remove(id);
}
}
@ -273,8 +279,7 @@ void DataManager::filterTokensColnod()
auto tokenDB = new Token;
tokenDB->fromSQLRecord(record);
Q_ASSERT(tokenDB != token);
qDebug() << tokenDB->getLastModified() << " > " << token->getLastUpdate();
if (tokenDB > token)
if (*tokenDB > *token)
tokensToUpdateFromColnodToDB.remove(id);
}
}

View File

@ -6,6 +6,7 @@
#include "databasemanager.h"
#include <QJsonDocument>
#include <qjsonarray.h>
#include <logger.h>
class DataManager : public QObject

View File

@ -40,19 +40,19 @@ QString Entity::idToStringWithoutBraces() const
}
void Entity::fromJSON(const QJsonObject &json) {
id = json.value("id").toString();
name = json.value("name").toString();
description = json.value("description").toString();
lastUpdate = json.value("lastUpdate").toDouble();
id = json["id"].toString();
name = json["name"].toString();
description = json["description"].toString();
lastUpdate = json["lastUpdate"].toDouble();
}
QJsonObject Entity::toJSON() const {
QJsonObject json;
json.value("id") = this->idToStringWithoutBraces();
json.value("name") = name;
json.value("description") = description;
json.value("lastUpdate") = lastUpdate;
json["id"] = this->idToStringWithoutBraces();
json["name"] = name;
json["description"] = description;
json["lastUpdate"] = lastUpdate;
return json;
}

33
src/colnod/logger.cpp Normal file
View File

@ -0,0 +1,33 @@
#include "logger.h"
Logger::Logger()
{
dbMan = nullptr;
}
Logger *Logger::getLogger()
{
if (!logger)
logger = new Logger;
return logger;
}
void Logger::log(const QString& msg)
{
qDebug() << msg;
}
void Logger::logToDb(const QString &msg)
{
dbMan->log(msg);
}
void Logger::setDBMan(DatabaseManager *dbMan)
{
Logger::dbMan = dbMan;
}
Logger *Logger::logger = nullptr;
DatabaseManager *Logger::dbMan = nullptr;

28
src/colnod/logger.h Normal file
View File

@ -0,0 +1,28 @@
#pragma once
#include <QString>
#include <QDebug>
#include <QSqlDatabase>
#include "databasemanager.h"
class Logger
{
static Logger *logger;
Logger();
static DatabaseManager *dbMan;
public:
static Logger *getLogger();
static void log(const QString& msg);
static void logToDb(const QString& msg);
static void setDBMan(DatabaseManager* dbMan);
private:
};

View File

@ -24,6 +24,7 @@
#include "token.h"
#include "response.h"
#include "logger.h"
class RequestManager : public QObject
{

View File

@ -16,21 +16,21 @@ QString Subject::getEmail() const {
void Subject::fromJSON(const QJsonObject &json) {
Entity::fromJSON(json);
attributes = json.value("attributes").toObject().value("items").toObject();
attributes = json["attributes"].toObject()["items"].toObject();
for (const auto & attributeType : attributeTypes)
{
if (!attributes[attributeType].toString().isEmpty()){
atr.append(qMakePair(attributeType, attributes[attributeType].toString()));
}
}
const auto &tokenFlagsArray = json.value("tokenFlags").toArray();
const auto &tokenFlagsArray = json["tokenFlags"].toArray();
for(const auto &flag : tokenFlagsArray){
tokenFlags.insert(flag.toString());
}
pin = json.value("pin").toString();
pin = json["pin"].toString();
const auto &pinFlagsArray = json.value("pinFlags").toArray();
const auto &pinFlagsArray = json["pinFlags"].toArray();
for(const auto &flag : pinFlagsArray){
pinFlags.insert(flag.toString());
}
@ -41,10 +41,10 @@ QJsonObject Subject::toJSON() const {
QJsonObject json = Entity::toJSON();
QJsonObject items({{"items", attributes}});
json.value("atributes") = items;
json.value("tokenFlags") = QJsonArray::fromStringList(tokenFlags.toList());
json.value("pin") = pin;
json.value("pinFlags") = QJsonArray::fromStringList(pinFlags.toList());
json["atributes"] = items;
json["tokenFlags"] = QJsonArray::fromStringList(tokenFlags.toList());
json["pin"] = pin;
json["pinFlags"] = QJsonArray::fromStringList(pinFlags.toList());
return json;
}

View File

@ -26,32 +26,29 @@ Token::Token(const QString &name)
void Token::fromJSON(const QJsonObject &json) {
Entity::fromJSON(json);
tokenType = json.value("tokenType").toString();
tokenBits = json.value("tokenBits").toInt();
tokenData = json.value("tokenData").toString();
validFrom = json.value("validFrom").toDouble();
validTo = json.value("validTo").toDouble();
timeToLive = json.value("timeToLive").toInt();
tokenType = json["tokenType"].toString();
tokenBits = json["tokenBits"].toInt();
tokenData = json["tokenData"].toString();
timeToLive = json["timeToLive"].toInt();
authErrors = json["authErrors"].toInt();
const auto &flagsArray = json["flags"].toArray();
for(const auto &flag : flagsArray){
flags.insert(flag.toString());
}
subjectId = json.value("subjectId").toString();
subjectId = json["subjectId"].toString();
}
QJsonObject Token::toJSON() const {
QJsonObject json = Entity::toJSON();
json.value("tokenType") = tokenType;
json.value("tokenBits") = tokenBits;
json.value("tokenData") = tokenData;
json.value("validFrom") = validFrom;
json.value("validTo") = validTo;
json.value("timeToLive") = timeToLive;
json.value("authErrors") = authErrors;
json.value("flags") = QJsonArray::fromStringList(flags.toList());
json.value("subjectId") = subjectId.toString().mid(1,36);
json.insert("tokenType", tokenType);
json["tokenBits"] = tokenBits;
json["tokenType"] = tokenType;
json["tokenBits"] = tokenBits;
json["tokenData"] = tokenData;
json["timeToLive"] = timeToLive;
json["authErrors"] = authErrors;
json["flags"] = QJsonArray::fromStringList(flags.toList());
json["subjectId"] = subjectId.toString().mid(1,36);
return json;
}
@ -104,22 +101,6 @@ void Token::setTokenData(const QString &tokenData) {
Token::tokenData = tokenData;
}
quint64 Token::getValidFrom() const {
return validFrom;
}
void Token::setValidFrom(quint64 validFrom) {
Token::validFrom = validFrom;
}
quint64 Token::getValidTo() const {
return validTo;
}
void Token::setValidTo(quint64 validTo) {
Token::validTo = validTo;
}
int Token::getTimeToLive() const {
return timeToLive;
}

View File

@ -19,7 +19,7 @@ public:
return lToken.getLastModified() < rToken.getLastUpdate();
}
friend bool operator>(const Token &lToken, const Token &rToken){
return rToken.getLastModified() > lToken.getLastUpdate();
return lToken.getLastModified() > rToken.getLastUpdate();
}
const QString &getTokenType() const;
@ -28,10 +28,6 @@ public:
void setTokenBits(int tokenBits);
const QString &getTokenData() const;
void setTokenData(const QString &tokenData);
quint64 getValidFrom() const;
void setValidFrom(quint64 validFrom);
quint64 getValidTo() const;
void setValidTo(quint64 validTo);
int getTimeToLive() const;
void setTimeToLive(int timeToLive);
int getAuthErrors() const;
@ -55,8 +51,6 @@ private:
QString tokenType;
int tokenBits{};
QString tokenData;
qint64 validFrom{};
qint64 validTo{};
int timeToLive{};
int authErrors{};
QSet<QString> flags;

View File

@ -2,32 +2,33 @@
void ComplexTest::initTestCase()
{
auto reqMan1 = new RequestManager;
QList<QString> ids;
ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
ids.append("3ff23b41-3da3-4b33-82ce-d8e2d8c9a546");
Response* deleteTokensResp = reqMan1->deleteTokens(ids);
QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready);
QCOMPARE(deleteTokensRespSpy.count(), 0);
deleteTokensRespSpy.wait(timeout);
QTest::qWait(2500);
// auto reqMan1 = new RequestManager;
// QList<QString> ids;
// ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
// ids.append("3ff23b41-3da3-4b33-82ce-d8e2d8c9a546");
// Response* deleteTokensResp = reqMan1->deleteTokens(ids);
// QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready);
// QCOMPARE(deleteTokensRespSpy.count(), 0);
// deleteTokensRespSpy.wait(timeout);
// QTest::qWait(2500);
start = QDateTime::currentMSecsSinceEpoch()-2000;
api = new ColnodAPI(true);
api = new ColnodAPI();
qDebug() << start;
}
void ComplexTest::cleanupTestCase()
{
QList<QString> ids;
ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
ids.append("3ff23b41-3da3-4b33-82ce-d8e2d8c9a546");
auto reqMan = new RequestManager;
Response* deleteTokensResp = reqMan->deleteTokens(ids);
QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready);
QCOMPARE(deleteTokensRespSpy.count(), 0);
deleteTokensRespSpy.wait(timeout);
QCOMPARE(deleteTokensRespSpy.count(), 1);
// QList<QString> ids;
// ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
// ids.append("3ff23b41-3da3-4b33-82ce-d8e2d8c9a546");
// auto reqMan = new RequestManager;
// Response* deleteTokensResp = reqMan->deleteTokens(ids);
// QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready);
// QCOMPARE(deleteTokensRespSpy.count(), 0);
// deleteTokensRespSpy.wait(timeout);
// QCOMPARE(deleteTokensRespSpy.count(), 1);
}
void ComplexTest::complexTest()
@ -82,7 +83,7 @@ void ComplexTest::complexTest()
// DELETE_TOKENS_CHECK_BEGIN
QList<QString> ids;
ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
ids.append("062c93f6-ba3e-46af-a3a6-7a2988d1f0e9");
Response* deleteTokensResp = reqMan->deleteTokens(ids);
QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready);
QCOMPARE(deleteTokensRespSpy.count(), 0);
@ -101,7 +102,7 @@ void ComplexTest::complexTest()
QCOMPARE(getTokensDeletedRespSpy.count(), 1);
auto doc2 = getJsonDoc(getTokensDeletedResp->getJson());
QCOMPARE(doc2.object()["items"].toArray().size(), 1);
QVERIFY(doc2.object()["items"].toArray().contains("582c982d-6fd7-4856-8548-7ce542791c7a"));
QVERIFY(doc2.object()["items"].toArray().contains("062c93f6-ba3e-46af-a3a6-7a2988d1f0e9"));
// CHECK_DELETED_TOKENS_END
// LAST_TESTS (for sure)
@ -128,6 +129,8 @@ void ComplexTest::fullSync()
void ComplexTest::syncLastUpdated()
{
Logger *logger = Logger::getLogger();
Logger::log("ahoj");
api->loadDataFromColnod();
QSignalSpy spy(api, &ColnodAPI::dataDownloaded);
spy.wait(timeout);
@ -175,7 +178,7 @@ QJsonDocument ComplexTest::getJsonDoc(const QString &json)
QPointer<Token> ComplexTest::getTestToken()
{
QJsonObject jsonToken;
jsonToken.insert("id", "582c982d-6fd7-4856-8548-7ce542791c7a");
jsonToken.insert("id", "062c93f6-ba3e-46af-a3a6-7a2988d1f0e9");
jsonToken.insert("name", "test");
jsonToken.insert("description", "mobile");
jsonToken.insert("tokenType", "Token");

View File

@ -6,6 +6,7 @@
#include "response.h"
#include "requestmanager.h"
#include "colnodapi.h"
#include "logger.h"
class ComplexTest : public QObject
{