Skip to content

Commit

Permalink
[transfer-engine] Fix QSqlDatabase leak.
Browse files Browse the repository at this point in the history
We need to remove the database from the list of connections in order to really close
the database and cleanup any temporary files left.
  • Loading branch information
foolab committed Sep 3, 2014
1 parent 2c68e58 commit df61e14
Showing 1 changed file with 25 additions and 3 deletions.
28 changes: 25 additions & 3 deletions declarative/declarativetransfermodel.cpp
Expand Up @@ -46,6 +46,24 @@ template <> bool compareIdentity<TransferDBRecord>(
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<TransferDBRecord>())
Expand Down Expand Up @@ -394,7 +412,7 @@ bool TransferModel::executeQuery(QVector<TransferDBRecord> *rows, int *activeTra

QSqlDatabase TransferModel::database()
{
static QThreadStorage<QSqlDatabase> thread_database;
static QThreadStorage<QSqlDatabaseWrapper *> thread_database;

if (!thread_database.hasLocalData()) {
const QString absDbPath = QDir::homePath() + QDir::separator()
Expand All @@ -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();
Expand Down

0 comments on commit df61e14

Please sign in to comment.