summaryrefslogtreecommitdiffstats
path: root/src/sql
diff options
context:
space:
mode:
authorHonglei Zhang <honglei.zhang@nokia.com>2011-12-08 14:17:08 +0200
committerQt by Nokia <qt-info@nokia.com>2012-04-03 08:51:58 +0200
commit8cd69eb1ffd37194e3d736a3bb5ce8511b8b8854 (patch)
tree56e5a299418ed3ef2bc55f876c6c74600933d22c /src/sql
parentcdc1720730dff64ef61e4cb9457c46dae8101315 (diff)
Memory leak fix of sqlite driver when close failed
If an ongoing query is not finalized before close function is called, sqlite driver can't close the connection to sqlite. In this case, the failure is only reported to the client via getLastError(). Even if the client want to handle this case, there is no easy way to revoke the close function. This commit finalizes all queries before close is called. Task-number: QTBUG-16967 Change-Id: I069f6073bd46f53780e13d269e44aa86366e0574 Reviewed-by: Andy Shaw <andy.shaw@digia.com> Reviewed-by: Mark Brand <mabrand@mabrand.nl>
Diffstat (limited to 'src/sql')
-rw-r--r--src/sql/drivers/sqlite/qsql_sqlite.cpp8
-rw-r--r--src/sql/kernel/qsqlresult.cpp7
2 files changed, 12 insertions, 3 deletions
diff --git a/src/sql/drivers/sqlite/qsql_sqlite.cpp b/src/sql/drivers/sqlite/qsql_sqlite.cpp
index 97d3531c8b..e95b7942c5 100644
--- a/src/sql/drivers/sqlite/qsql_sqlite.cpp
+++ b/src/sql/drivers/sqlite/qsql_sqlite.cpp
@@ -105,6 +105,7 @@ class QSQLiteDriverPrivate
public:
inline QSQLiteDriverPrivate() : access(0) {}
sqlite3 *access;
+ QList <QSQLiteResult *> results;
};
@@ -312,10 +313,14 @@ QSQLiteResult::QSQLiteResult(const QSQLiteDriver* db)
{
d = new QSQLiteResultPrivate(this);
d->access = db->d->access;
+ db->d->results.append(this);
}
QSQLiteResult::~QSQLiteResult()
{
+ const QSQLiteDriver * sqlDriver = qobject_cast<const QSQLiteDriver *>(driver());
+ if (sqlDriver)
+ sqlDriver->d->results.removeOne(this);
d->cleanup();
delete d;
}
@@ -579,6 +584,9 @@ bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, c
void QSQLiteDriver::close()
{
if (isOpen()) {
+ foreach (QSQLiteResult *result, d->results)
+ result->d->finalize();
+
if (sqlite3_close(d->access) != SQLITE_OK)
setLastError(qMakeError(d->access, tr("Error closing database"),
QSqlError::ConnectionError));
diff --git a/src/sql/kernel/qsqlresult.cpp b/src/sql/kernel/qsqlresult.cpp
index 4aeae1fd82..de348c99f5 100644
--- a/src/sql/kernel/qsqlresult.cpp
+++ b/src/sql/kernel/qsqlresult.cpp
@@ -48,6 +48,7 @@
#include "qsqlresult.h"
#include "qvector.h"
#include "qsqldriver.h"
+#include "qpointer.h"
#include <QDebug>
QT_BEGIN_NAMESPACE
@@ -64,7 +65,7 @@ class QSqlResultPrivate
{
public:
QSqlResultPrivate(QSqlResult* d)
- : q(d), sqldriver(0), idx(QSql::BeforeFirstRow), active(false),
+ : q(d), idx(QSql::BeforeFirstRow), active(false),
isSel(false), forwardOnly(false), precisionPolicy(QSql::LowPrecisionDouble), bindCount(0), binds(QSqlResult::PositionalBinding)
{}
@@ -98,7 +99,7 @@ public:
public:
QSqlResult* q;
- const QSqlDriver* sqldriver;
+ QPointer<QSqlDriver> sqldriver;
int idx;
QString sql;
bool active;
@@ -250,7 +251,7 @@ QString QSqlResultPrivate::namedToPositionalBinding()
QSqlResult::QSqlResult(const QSqlDriver *db)
{
d = new QSqlResultPrivate(this);
- d->sqldriver = db;
+ d->sqldriver = const_cast<QSqlDriver *>(db);
if(db) {
setNumericalPrecisionPolicy(db->numericalPrecisionPolicy());
}