From 861c4ae22102732c1e6fe0cf0df431285412f96b Mon Sep 17 00:00:00 2001 From: Asmae Kaouissi Date: Wed, 19 Feb 2025 17:17:17 +0100 Subject: [PATCH 1/3] vl_databaselogger: create rpcs to generate report files in Json Format Signed-off-by: Asmae Kaouissi --- lib/vl_abstractloggerdb.h | 4 +++ lib/vl_databaselogger.cpp | 35 ++++++++++++++++++++++ lib/vl_databaselogger.h | 2 ++ lib/vl_sqlitedb.cpp | 62 +++++++++++++++++++++++++++++++++++++++ lib/vl_sqlitedb.h | 4 ++- testlib/testloggerdb.cpp | 15 ++++++++++ testlib/testloggerdb.h | 3 ++ 7 files changed, 124 insertions(+), 1 deletion(-) diff --git a/lib/vl_abstractloggerdb.h b/lib/vl_abstractloggerdb.h index 0b95ec2..b60aa15 100644 --- a/lib/vl_abstractloggerdb.h +++ b/lib/vl_abstractloggerdb.h @@ -37,6 +37,8 @@ public slots: virtual QVariant readSessionComponent(const QString &dbSessionName, const QString &entityName, const QString &componentName) = 0; virtual QJsonObject displaySessionsInfos(const QString &sessionName) = 0; virtual bool deleteTransaction(const QString &transactionName) = 0; + virtual QString createAllSessionsJson(QString loggerDbPath) = 0; + virtual QString createTransationsJson(QString session, QString loggerDbPath) = 0; virtual bool addStartTime(int t_transactionId, QDateTime t_time) = 0; virtual bool addStopTime(int t_transactionId, QDateTime t_time) = 0; @@ -45,6 +47,8 @@ public slots: virtual void addLoggedValue(const QString &dbSessionName, QVector t_transactionIds, VeinLogger::DatabaseCommandInterface::ComponentInfo component) = 0; virtual void runBatchedExecution() = 0; // Another implementation detail which must go + virtual QStringList getSessionsName() = 0; + }; /// @b factory function alias to create database diff --git a/lib/vl_databaselogger.cpp b/lib/vl_databaselogger.cpp index 04b9f0f..cf7c130 100644 --- a/lib/vl_databaselogger.cpp +++ b/lib/vl_databaselogger.cpp @@ -506,6 +506,23 @@ QVariant DatabaseLogger::RPC_deleteTransaction(QVariantMap parameters) return m_database->deleteTransaction(transactionName); } +QVariant DatabaseLogger::RPC_CreateAllSessionsJson(QVariantMap parameters) +{ + QVariant retval; + m_database->createAllSessionsJson(m_databaseFilePath); + return retval; +} + +QVariant DatabaseLogger::RPC_CreateTransactionsJson(QVariantMap parameters) +{ + QVariant retval; + QString session = parameters["p_session"].toString(); + if(session == "") + return retval; + m_database->createTransationsJson(session, m_databaseFilePath); + return retval; +} + void DatabaseLogger::initOnce() { Q_ASSERT(m_initDone == false); @@ -579,6 +596,24 @@ void DatabaseLogger::initOnce() &QObject::deleteLater); m_rpcList[tmpval->rpcName()]=tmpval; + tmpval= VfCpp::cVeinModuleRpc::Ptr(new VfCpp::cVeinModuleRpc( + m_entityId, + this, + this, + "RPC_CreateAllSessionsJson", + VfCpp::cVeinModuleRpc::Param({})), + &QObject::deleteLater); + m_rpcList[tmpval->rpcName()]=tmpval; + + tmpval= VfCpp::cVeinModuleRpc::Ptr(new VfCpp::cVeinModuleRpc( + m_entityId, + this, + this, + "RPC_CreateTransactionsJson", + VfCpp::cVeinModuleRpc::Param({{"p_session", "QString"}})), + &QObject::deleteLater); + m_rpcList[tmpval->rpcName()]=tmpval; + m_initDone = true; } } diff --git a/lib/vl_databaselogger.h b/lib/vl_databaselogger.h index 302d837..fc257dd 100644 --- a/lib/vl_databaselogger.h +++ b/lib/vl_databaselogger.h @@ -36,6 +36,8 @@ public slots: QVariant RPC_deleteSession(QVariantMap parameters); QVariant RPC_displaySessionsInfos(QVariantMap parameters); QVariant RPC_deleteTransaction(QVariantMap parameters); + QVariant RPC_CreateAllSessionsJson(QVariantMap parameters); + QVariant RPC_CreateTransactionsJson(QVariantMap parameters); private slots: void initOnce(); diff --git a/lib/vl_sqlitedb.cpp b/lib/vl_sqlitedb.cpp index 914a407..9c1f349 100644 --- a/lib/vl_sqlitedb.cpp +++ b/lib/vl_sqlitedb.cpp @@ -612,6 +612,63 @@ bool SQLiteDB::deleteTransaction(const QString &transactionName) return false; } +QString SQLiteDB::createAllSessionsJson(QString loggerDb) +{ + QJsonArray jsonArray; + QSqlQuery sessionQuery("SELECT * FROM sessions WHERE session_name NOT LIKE '_DELETED_%';", m_dPtr->m_logDB); + while (sessionQuery.next()) { + QJsonObject sessionsJson; + sessionsJson["id"] = sessionQuery.value(0).toString(); + sessionsJson["sessionName"] = sessionQuery.value(1).toString(); + jsonArray.append(sessionsJson); + } + sessionQuery.finish(); + + QJsonDocument jsonDoc(jsonArray); + QDir dir = QFileInfo(loggerDb).dir(); + QString LoggerPath = dir.absolutePath() + "/AllSessions.json"; + QFile file(LoggerPath); + if (!file.open(QIODevice::WriteOnly)) { + //return error; + } + file.write(jsonDoc.toJson()); + file.close(); + return ""; +} + +QString SQLiteDB::createTransationsJson(QString session, QString loggerDb) +{ + QJsonArray jsonArr; + QSqlQuery transactionQuery(m_dPtr->m_logDB); + transactionQuery.prepare("SELECT transactions.transaction_name, transactions.contentset_names, transactions.start_time" + " FROM sessions INNER JOIN" + " transactions ON sessions.id = transactions.sessionid" + " WHERE session_name= :sessionName AND transactions.transaction_name NOT LIKE '_DELETED_%';"); + transactionQuery.bindValue(":sessionName", session); + transactionQuery.exec(); + while(transactionQuery.next()){ + QString transactionName = transactionQuery.value("transaction_name").toString(); + QString contentset = transactionQuery.value("contentset_names").toString(); + QString startTime = transactionQuery.value("start_time").toString(); + QJsonObject dataJson; + dataJson["transactionName"] = transactionName; + dataJson["contentset"] = contentset; + dataJson["startTime"] = startTime; + jsonArr.append(dataJson); + } + QJsonDocument jsonDoc(jsonArr); + + QDir dir = QFileInfo(loggerDb).dir(); + QString LoggerPath = dir.absolutePath() + "/" + session + ".json"; + QFile file(LoggerPath); + if (!file.open(QIODevice::WriteOnly)) { + //return error; + } + file.write(jsonDoc.toJson()); + file.close(); + return ""; +} + void SQLiteDB::onOpen(const QString &dbPath) { QFileInfo fInfo(dbPath); @@ -866,6 +923,11 @@ void SQLiteDB::runBatchedExecution() } } +QStringList SQLiteDB::getSessionsName() +{ + return m_dPtr->m_sessionIds.keys(); +} + void SQLiteDB::writeStaticData(QVector p_batchData) { if(m_dPtr->m_logDB.isOpen()) { diff --git a/lib/vl_sqlitedb.h b/lib/vl_sqlitedb.h index f557577..60d1909 100644 --- a/lib/vl_sqlitedb.h +++ b/lib/vl_sqlitedb.h @@ -48,11 +48,14 @@ public slots: QVariant readSessionComponent(const QString &session, const QString &enity, const QString &component) override; QJsonObject displaySessionsInfos(const QString &sessionName) override; bool deleteTransaction(const QString &transactionName) override; + QString createAllSessionsJson(QString loggerDb) override; + QString createTransationsJson(QString session, QString loggerDb) override; void onOpen(const QString &dbPath) override; bool isDbStillWitable(const QString &dbPath); void runBatchedExecution() override; + QStringList getSessionsName() override; protected: virtual void addComponent(const QString &componentName); @@ -66,7 +69,6 @@ public slots: void writeStaticData(QVector p_batchData); void setValidTransactions(); - DBPrivate *m_dPtr = nullptr; }; diff --git a/testlib/testloggerdb.cpp b/testlib/testloggerdb.cpp index a918dc5..695b3d9 100644 --- a/testlib/testloggerdb.cpp +++ b/testlib/testloggerdb.cpp @@ -197,6 +197,16 @@ bool TestLoggerDB::deleteSession(const QString &session) } +QString TestLoggerDB::createAllSessionsJson(QString loggerDb) +{ + +} + +QString TestLoggerDB::createTransationsJson(QString session, QString loggerDb) +{ + +} + void TestLoggerDB::addLoggedValue(const QString &sessionName, QVector transactionIds, VeinLogger::DatabaseCommandInterface::ComponentInfo component) { if(!transactionIds.contains(testTransactionId)) @@ -243,3 +253,8 @@ void TestLoggerDB::runBatchedExecution() // Surprise: This is a poor mimic of what SQLite implementation does addStopTime(testTransactionId, QDateTime()); } + +QStringList TestLoggerDB::getSessionsName() +{ + +} diff --git a/testlib/testloggerdb.h b/testlib/testloggerdb.h index 853f42f..ed90322 100644 --- a/testlib/testloggerdb.h +++ b/testlib/testloggerdb.h @@ -32,6 +32,8 @@ class TestLoggerDB : public VeinLogger::AbstractLoggerDB bool deleteTransaction(const QString &transactionName) override; int addSession(const QString &sessionName, QList componentsStoredOncePerSession) override; bool deleteSession(const QString &session) override; + QString createAllSessionsJson(QString loggerDb) override; + QString createTransationsJson(QString session, QString loggerDb) override; void addLoggedValue(const QString &sessionName, QVector transactionIds, VeinLogger::DatabaseCommandInterface::ComponentInfo component) override; void setNextValueWriteCount(int newValueWriteCount); @@ -41,6 +43,7 @@ class TestLoggerDB : public VeinLogger::AbstractLoggerDB void onOpen(const QString &dbPath) override; void runBatchedExecution() override; + QStringList getSessionsName() override; // Test specific additions static TestLoggerDB* getCurrentInstance(); // no singleton!!! From 319de214a2a0861da50664810a6376f995d60ab6 Mon Sep 17 00:00:00 2001 From: Asmae Kaouissi Date: Fri, 21 Feb 2025 15:49:36 +0100 Subject: [PATCH 2/3] vl_databaselogger: delete session json file when the session is deleted Signed-off-by: Asmae Kaouissi --- lib/vl_databaselogger.cpp | 13 +++++++++++++ lib/vl_databaselogger.h | 1 + 2 files changed, 14 insertions(+) diff --git a/lib/vl_databaselogger.cpp b/lib/vl_databaselogger.cpp index cf7c130..837d50e 100644 --- a/lib/vl_databaselogger.cpp +++ b/lib/vl_databaselogger.cpp @@ -353,6 +353,18 @@ void DatabaseLogger::terminateCurrentDb() m_database = nullptr; } +bool DatabaseLogger::deleteSessionJsonFile(QString sessionName) +{ + bool removeOk = false; + QDir dir = QFileInfo(m_databaseFilePath ).dir(); + QString filePath = dir.absolutePath() + "/" + sessionName + ".json"; + if(QFile::exists(filePath)) { + if (QFile::remove(filePath)) + removeOk = true; + } + return removeOk; +} + void DatabaseLogger::closeDatabase() { if(m_databaseFilePath.isEmpty()) @@ -483,6 +495,7 @@ QVariant DatabaseLogger::RPC_deleteSession(QVariantMap parameters) m_dbSessionName = ""; emit sigSendEvent(new VeinEvent::CommandEvent(VeinEvent::CommandEvent::EventSubtype::NOTIFICATION, sessionNameCData)); } + retVal = retVal.toBool() && deleteSessionJsonFile(session); return retVal; } diff --git a/lib/vl_databaselogger.h b/lib/vl_databaselogger.h index fc257dd..231a43e 100644 --- a/lib/vl_databaselogger.h +++ b/lib/vl_databaselogger.h @@ -64,6 +64,7 @@ private slots: void writeCurrentStorageToDb(); QStringList getComponentsFilteredForDb(int entityId); void terminateCurrentDb(); + bool deleteSessionJsonFile(QString sessionName); int m_entityId; QLatin1String m_entityName; From 248c2176b6a827c4819f7e94180596b4c8c4365b Mon Sep 17 00:00:00 2001 From: Asmae Kaouissi Date: Mon, 24 Feb 2025 09:58:14 +0100 Subject: [PATCH 3/3] vl_databaselogger: remove transaction array when it's deleted Signed-off-by: Asmae Kaouissi --- lib/vl_databaselogger.cpp | 35 ++++++++++++++++++++++++++++++++++- lib/vl_databaselogger.h | 1 + 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/lib/vl_databaselogger.cpp b/lib/vl_databaselogger.cpp index 837d50e..5b27d8d 100644 --- a/lib/vl_databaselogger.cpp +++ b/lib/vl_databaselogger.cpp @@ -365,6 +365,37 @@ bool DatabaseLogger::deleteSessionJsonFile(QString sessionName) return removeOk; } +void DatabaseLogger::deleteTransactionFromJsonFile(QString sessionName, QString transactionName) +{ + QDir dir = QFileInfo(m_databaseFilePath ).dir(); + QString filePath = dir.absolutePath() + "/" + sessionName + ".json"; + QFile file(filePath); + if(!file.open(QIODevice::ReadOnly)) { + qDebug() << "Failed to open file for reading"; + return; + } + + QByteArray jsonData = file.readAll(); + file.close(); + QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); + QJsonArray jsonArray = jsonDoc.array(); + QJsonArray newArray; + for (const QJsonValue &value : jsonArray) { + if(value.isObject()) { + QJsonObject obj = value.toObject(); + if (obj.value("transactionName").toString() != transactionName) + newArray.append(obj); + } + } + jsonDoc.setArray(newArray); + if (!file.open(QIODevice::WriteOnly)) { + qDebug() << "Failed to open file for writing"; + return; + } + file.write(jsonDoc.toJson()); + file.close(); +} + void DatabaseLogger::closeDatabase() { if(m_databaseFilePath.isEmpty()) @@ -516,6 +547,8 @@ QVariant DatabaseLogger::RPC_displaySessionsInfos(QVariantMap parameters) QVariant DatabaseLogger::RPC_deleteTransaction(QVariantMap parameters) { QString transactionName = parameters["p_transaction"].toString(); + QString selectedSession = parameters["p_selectedSession"].toString(); + deleteTransactionFromJsonFile(selectedSession, transactionName); return m_database->deleteTransaction(transactionName); } @@ -605,7 +638,7 @@ void DatabaseLogger::initOnce() this, this, "RPC_deleteTransaction", - VfCpp::cVeinModuleRpc::Param({{"p_transaction", "QString"}})), + VfCpp::cVeinModuleRpc::Param({{"p_transaction", "QString"}, {"p_selectedSession", "QString"}})), &QObject::deleteLater); m_rpcList[tmpval->rpcName()]=tmpval; diff --git a/lib/vl_databaselogger.h b/lib/vl_databaselogger.h index 231a43e..fa4c110 100644 --- a/lib/vl_databaselogger.h +++ b/lib/vl_databaselogger.h @@ -65,6 +65,7 @@ private slots: QStringList getComponentsFilteredForDb(int entityId); void terminateCurrentDb(); bool deleteSessionJsonFile(QString sessionName); + void deleteTransactionFromJsonFile(QString sessionName, QString transactionName); int m_entityId; QLatin1String m_entityName;