]> Some of my projects - localmylist.git/commitdiff
Fix possible crash in Database::exec().
authorAPTX <marek321@gmail.com>
Mon, 15 Apr 2013 14:28:15 +0000 (16:28 +0200)
committerAPTX <marek321@gmail.com>
Mon, 15 Apr 2013 14:28:15 +0000 (16:28 +0200)
Disconnecting clears all prepared statements so a query passed to exec might would invalid.

localmylist/database.cpp

index aba3988167da6615502ce77d99c78981fe9b3263..a74c4c7c05b46621d3e2c4eaa1736ad1d72e5981 100644 (file)
@@ -7,6 +7,8 @@
 #include <QSqlDriver>
 #include <QVariant>
 #include <QThread>
+#include <algorithm>
+
 #include <QDebug>
 
 namespace LocalMyList {
@@ -1701,13 +1703,22 @@ bool Database::exec(QSqlQuery &query)
 {
        Q_ASSERT_X(d->thread == QThread::currentThread(), "threads", "DB used from different thread");
 
-       if (!d->db.isOpen())
+       if (!isConnected())
        {
-               disconnect();
-               if (!connect())
-                       return false;
+               auto keyIt = std::find_if(d->preparedQueries.constBegin(), d->preparedQueries.constEnd(),
+                                       [&](const QSqlQuery &a) { return &a == &query;});
 
-               return retryExec(query, true);
+               Q_ASSERT(keyIt != d->preparedQueries.constEnd());
+
+               auto key = keyIt.key();
+               auto values = query.boundValues();
+
+               query = prepare(key);
+
+               for(auto it = values.constBegin(); it != values.constEnd(); ++it)
+                       query.bindValue(it.key(), it.value());
+
+               return retryExec(query, false);
        }
 
        if (!query.exec())
@@ -1719,7 +1730,7 @@ bool Database::exec(const QString &sql)
 {
        Q_ASSERT_X(d->thread == QThread::currentThread(), "threads", "DB used from different thread");
 
-       if (!d->db.isOpen())
+       if (!isConnected())
        {
                disconnect();
                if (!connect())