From df61e147e05efa1cb15f0367a4a63165e0cf5b76 Mon Sep 17 00:00:00 2001 From: Mohammed Sameer Date: Wed, 3 Sep 2014 22:41:26 +0300 Subject: [PATCH] [transfer-engine] Fix QSqlDatabase leak. We need to remove the database from the list of connections in order to really close the database and cleanup any temporary files left. --- declarative/declarativetransfermodel.cpp | 28 +++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/declarative/declarativetransfermodel.cpp b/declarative/declarativetransfermodel.cpp index 3d21100..4fb8183 100644 --- a/declarative/declarativetransfermodel.cpp +++ b/declarative/declarativetransfermodel.cpp @@ -46,6 +46,24 @@ template <> bool compareIdentity( return item.transfer_id == reference.transfer_id; } +class QSqlDatabaseWrapper +{ +public: + QSqlDatabaseWrapper(const QSqlDatabase& db) : m_db(db) {} + ~QSqlDatabaseWrapper() { + QString name = m_db.connectionName(); + m_db = QSqlDatabase(); // Drop our last reference. + if (!name.isEmpty()) { + QSqlDatabase::removeDatabase(name); + } + } + + QSqlDatabase& database() { return m_db; } + +private: + QSqlDatabase m_db; +}; + TransferModel::TransferModel(QObject *parent) : QAbstractListModel(parent) , m_rows(new QVector()) @@ -394,7 +412,7 @@ bool TransferModel::executeQuery(QVector *rows, int *activeTra QSqlDatabase TransferModel::database() { - static QThreadStorage thread_database; + static QThreadStorage thread_database; if (!thread_database.hasLocalData()) { const QString absDbPath = QDir::homePath() + QDir::separator() @@ -407,10 +425,14 @@ QSqlDatabase TransferModel::database() QLatin1String("transferengine-") + uuid); database.setDatabaseName(absDbPath); database.setConnectOptions(QLatin1String("QSQLITE_OPEN_READONLY")); // sanity check - thread_database.setLocalData(database); + + QSqlDatabaseWrapper *wrapper = new QSqlDatabaseWrapper(database); + thread_database.setLocalData(wrapper); } - QSqlDatabase &database = thread_database.localData(); + QSqlDatabaseWrapper *wrapper = thread_database.localData(); + QSqlDatabase &database = wrapper->database(); + if (!database.isOpen() && !database.open()) { qWarning() << "Failed to open transfer engine database"; qWarning() << database.lastError();