]> Some of my projects - localmylist.git/commitdiff
Attempt to reconnect and execute the query again
authorAPTX <marek321@gmail.com>
Sat, 14 Jul 2012 15:22:31 +0000 (17:22 +0200)
committerAPTX <marek321@gmail.com>
Sat, 14 Jul 2012 15:22:31 +0000 (17:22 +0200)
localmylist/database.cpp
localmylist/database.h

index f55442f7abaae74e0715c086476294546bee1988..f2517db0d9110a6f28eb02c0343fdd5b54059129 100644 (file)
@@ -171,6 +171,7 @@ struct DatabaseInternal
 Database::Database(const QString &connectionName) : d(0)
 {
        this->connectionName = connectionName;
+       reconnectAttempt = false;
 }
 
 Database::~Database()
@@ -1131,7 +1132,7 @@ void Database::disconnect()
 
        if (!d->db.isOpen())
        {
-               qDebug() << "Already Connected";
+               qDebug() << "Not connected";
                return;
        }
        d->db.close();
@@ -1327,14 +1328,20 @@ QSqlQuery &Database::prepare(const char *const sql)
        if (it != d->preparedQueries.end())
                return it.value();
 
-       QSqlQuery query(d->db);
-       if (!query.prepare(sql))
-               checkError(query);
+       QSqlQuery query = prepareOneShot(sql);
 
        auto ite = d->preparedQueries.insert(sql, query);
        return ite.value();
 }
 
+QSqlQuery Database::prepareOneShot(const QString &sql)
+{
+       QSqlQuery query(d->db);
+       if (!query.prepare(sql))
+               checkError(query, true);
+       return query;
+}
+
 bool Database::exec(QSqlQuery &query)
 {
        Q_ASSERT_X(d->thread == QThread::currentThread(), "threads", "DB used from different thread");
@@ -1355,7 +1362,7 @@ bool Database::exec(const QString &sql)
        return true;
 }
 
-bool Database::checkError(QSqlQuery &query)
+bool Database::checkError(QSqlQuery &query, bool prepared)
 {
        if (query.lastError().type() == QSqlError::NoError)
                return true;
@@ -1366,8 +1373,30 @@ bool Database::checkError(QSqlQuery &query)
        qDebug() << "Query:     " << query.executedQuery();
 
        if (query.lastError().type() == QSqlError::ConnectionError)
+       {
                disconnect();
 
+               if (!connect())
+                       return false;
+
+               if (!reconnectAttempt)
+               {
+                       reconnectAttempt = true;
+                       if (prepared)
+                       {
+                               QString sql = query.lastQuery();
+                               query = prepareOneShot(sql);
+                       }
+                       else
+                       {
+                               exec(query);
+                       }
+                       reconnectAttempt = false;
+
+                       return true;
+               }
+       }
+
        return false;
 }
 
index 321c05f2d2c055b6fedbbc04f851d0ad1c3151b6..c4ce454ddc8957cce1e5aa2b6c07d654c31f345a 100644 (file)
@@ -293,6 +293,8 @@ public:
        QSqlDatabase connection() const;
 
        QSqlQuery &prepare(const char *const sql);
+       QSqlQuery prepareOneShot(const QString &sql);
+
        bool exec(QSqlQuery &query);
        bool exec(const QString &sql);
 
@@ -320,13 +322,14 @@ private slots:
 private:
        void prepareQueries();
 
-       bool checkError(QSqlQuery &query);
+       bool checkError(QSqlQuery &query, bool prepared = false);
        OpenFileData readOpenFileData(QSqlQuery &q);
 
        DatabaseInternal *d;
        DatabaseConnectionSettings m_connectionSettings;
 
        QString connectionName;
+       bool reconnectAttempt;
 };
 
 class RaiiTransaction