[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;
     }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.