[libraries/ktextaddons] textautogeneratetext/core: Fix delete database
Laurent Montel <[email protected]>
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git commit 805f030e49b51ca4a4436383e930e6db26055ec5 by Laurent Montel.
Committed on 16/08/2026 at 12:28.
Pushed by mlaurent into branch 'master'.
Fix delete database
M +31 -0 textautogeneratetext/core/autotests/textautogeneratelocalmessagesdatabasetest.cpp
M +1 -0 textautogeneratetext/core/autotests/textautogeneratelocalmessagesdatabasetest.h
M +19 -6 textautogeneratetext/core/localdatabase/textautogeneratelocalmessagesdatabase.cpp
https://invent.kde.org/libraries/ktextaddons/-/commit/805f030e49b51ca4a4436383e930e6db26055ec5
diff --git a/textautogeneratetext/core/autotests/textautogeneratelocalmessagesdatabasetest.cpp b/textautogeneratetext/core/autotests/textautogeneratelocalmessagesdatabasetest.cpp
index 9e37ff878..3462ae66d 100644
--- a/textautogeneratetext/core/autotests/textautogeneratelocalmessagesdatabasetest.cpp
+++ b/textautogeneratetext/core/autotests/textautogeneratelocalmessagesdatabasetest.cpp
@@ -176,4 +176,35 @@ void TextAutoGenerateLocalMessagesDatabaseTest::shouldReturnNullIfDoesNotExist()
// THEN
QVERIFY(!tableModel);
}
+
+void TextAutoGenerateLocalMessagesDatabaseTest::shouldDeleteDatabaseWhenConnectionWasNeverOpened()
+{
+ // GIVEN a database file on disk without a registered connection, as after a
+ // restart where the chat was never selected.
+ TextAutoGenerateText::TextAutoGenerateLocalMessagesDatabase logger;
+ const QByteArray neverOpenedChatId = QByteArrayLiteral("neverOpenedChatId");
+ const QString neverOpenedChatIdStr = QString::fromLatin1(neverOpenedChatId);
+ const QString dbFileName = logger.dbFileName(neverOpenedChatIdStr);
+
+ TextAutoGenerateText::TextAutoGenerateMessage message;
+ message.setContent(u"never opened message"_s);
+ message.setUuid("never-opened-id");
+ message.generateHtml();
+ logger.insertOrReplaceMessage(neverOpenedChatId, message);
+ QVERIFY(QFile::exists(dbFileName));
+
+ const QString connectionName = u"messages-"_s + neverOpenedChatIdStr;
+ {
+ QSqlDatabase db = QSqlDatabase::database(connectionName, false);
+ db.close();
+ }
+ QSqlDatabase::removeDatabase(connectionName);
+ QVERIFY(!QSqlDatabase::contains(connectionName));
+
+ // WHEN
+ logger.deleteDatabase(neverOpenedChatId);
+
+ // THEN
+ QVERIFY(!QFile::exists(dbFileName));
+}
#include "moc_textautogeneratelocalmessagesdatabasetest.cpp"
diff --git a/textautogeneratetext/core/autotests/textautogeneratelocalmessagesdatabasetest.h b/textautogeneratetext/core/autotests/textautogeneratelocalmessagesdatabasetest.h
index a6c8c334e..66c8a1941 100644
--- a/textautogeneratetext/core/autotests/textautogeneratelocalmessagesdatabasetest.h
+++ b/textautogeneratetext/core/autotests/textautogeneratelocalmessagesdatabasetest.h
@@ -22,4 +22,5 @@ private Q_SLOTS:
void shouldStoreMessages();
void shouldDeleteMessages();
void shouldReturnNullIfDoesNotExist();
+ void shouldDeleteDatabaseWhenConnectionWasNeverOpened();
};
diff --git a/textautogeneratetext/core/localdatabase/textautogeneratelocalmessagesdatabase.cpp b/textautogeneratetext/core/localdatabase/textautogeneratelocalmessagesdatabase.cpp
index c1a3e550e..0a0d9ad17 100644
--- a/textautogeneratetext/core/localdatabase/textautogeneratelocalmessagesdatabase.cpp
+++ b/textautogeneratetext/core/localdatabase/textautogeneratelocalmessagesdatabase.cpp
@@ -9,6 +9,7 @@
#include "core/textautogeneratesearchmessageutils.h"
#include "textautogeneratelocaldatabaseutils.h"
#include "textautogeneratetextcore_database_debug.h"
+#include <QFile>
#include <QFileInfo>
#include <QJsonDocument>
#include <QJsonObject>
@@ -37,14 +38,26 @@ void TextAutoGenerateLocalMessagesDatabase::deleteDatabase(const QByteArray &cha
qCDebug(TEXTAUTOGENERATETEXT_CORE_DATABASE_LOG) << "deleteDatabase" << chatIdentifier;
const QString chatId = QString::fromLatin1(chatIdentifier);
- QSqlDatabase db;
- if (!checkDataBase(chatId, db)) {
- return;
- }
const QString dbName = generateDbName(chatId);
- db.close();
- QSqlDatabase::removeDatabase(dbName);
+ // The connection only exists when this chat was opened during this session.
+ // Close it in its own scope: removeDatabase() must not be called while a
+ // QSqlDatabase copy is still alive, otherwise the connection is leaked.
+ {
+ QSqlDatabase db = QSqlDatabase::database(dbName, false);
+ if (db.isValid()) {
+ db.close();
+ }
+ }
+ if (QSqlDatabase::contains(dbName)) {
+ QSqlDatabase::removeDatabase(dbName);
+ }
+ // Remove the file even when no connection was opened: the messages database is
+ // created lazily when a chat is selected, so deleting a chat which was never
+ // opened must not leave its messages behind.
const QString path = dbFileName(chatId);
+ if (!QFileInfo::exists(path)) {
+ return;
+ }
if (!QFile(path).remove()) {
qCWarning(TEXTAUTOGENERATETEXT_CORE_DATABASE_LOG) << "Impossible to remove file" << path;
}