]> Some of my projects - localmylist.git/commitdiff
Try to reconnect automatically.
authorAPTX <marek321@gmail.com>
Wed, 5 Sep 2012 01:45:35 +0000 (03:45 +0200)
committerAPTX <marek321@gmail.com>
Wed, 5 Sep 2012 01:45:35 +0000 (03:45 +0200)
localmylist/database.cpp
localmylist/database.h

index e65259750b39d4f8e821efd281662214fc37b226..5c739a80451d2b1ef25cf40aad9c547e614ad0b0 100644 (file)
@@ -1417,13 +1417,14 @@ void Database::disconnect()
        if (!d)
                return;
 
+       d->preparedQueries.clear();
+
        if (!d->db.isOpen())
        {
                qDebug() << "Not connected";
                return;
        }
 
-       d->preparedQueries.clear();
        d->db.close();
 
        emit disconnected();
@@ -1541,6 +1542,16 @@ UnknownFile Database::readUnknownFile(QSqlQuery &q)
 
 QSqlQuery &Database::prepare(const char *const sql)
 {
+       if (!d->db.isOpen())
+       {
+               disconnect();
+               if (!connect())
+               {
+                       auto ite = d->preparedQueries.insert("___invalid", QSqlQuery(d->db));
+                       return ite.value();
+               }
+       }
+
        auto it = d->preparedQueries.find(sql);
 
        if (it != d->preparedQueries.end())
@@ -1555,6 +1566,14 @@ QSqlQuery &Database::prepare(const char *const sql)
 QSqlQuery Database::prepareOneShot(const QString &sql)
 {
        QSqlQuery query(d->db);
+
+       if (!d->db.isOpen())
+       {
+               disconnect();
+               if (!connect())
+                       return query;
+       }
+
        if (!query.prepare(sql))
                checkError(query, true);
        return query;
@@ -1564,6 +1583,15 @@ bool Database::exec(QSqlQuery &query)
 {
        Q_ASSERT_X(d->thread == QThread::currentThread(), "threads", "DB used from different thread");
 
+       if (!d->db.isOpen())
+       {
+               disconnect();
+               if (!connect())
+                       return false;
+
+               return retryExec(query, true);
+       }
+
        if (!query.exec())
                return checkError(query);
        return true;
@@ -1573,11 +1601,9 @@ bool Database::exec(const QString &sql)
 {
        Q_ASSERT_X(d->thread == QThread::currentThread(), "threads", "DB used from different thread");
 
-       QSqlQuery query(d->db);
+       QSqlQuery query = prepareOneShot(sql);
 
-       if (!query.exec(sql))
-               return checkError(query);
-       return true;
+       return exec(query);
 }
 
 bool Database::checkError(QSqlQuery &query, bool prepared)
@@ -1597,22 +1623,29 @@ bool Database::checkError(QSqlQuery &query, bool prepared)
                if (!connect())
                        return false;
 
-               if (!reconnectAttempt)
+               return retryExec(query, prepared);
+       }
+
+       return false;
+}
+
+bool Database::retryExec(QSqlQuery &query, bool prepared)
+{
+       if (!reconnectAttempt)
+       {
+               reconnectAttempt = true;
+               if (prepared)
+               {
+                       QString sql = query.lastQuery();
+                       query = prepareOneShot(sql);
+               }
+               else
                {
-                       reconnectAttempt = true;
-                       if (prepared)
-                       {
-                               QString sql = query.lastQuery();
-                               query = prepareOneShot(sql);
-                       }
-                       else
-                       {
-                               exec(query);
-                       }
-                       reconnectAttempt = false;
-
-                       return true;
+                       exec(query);
                }
+               reconnectAttempt = false;
+
+               return true;
        }
 
        return false;
index 21b563a633e139e575ad34d2a22aa94dbef953ac..a761e6487487b63e0cfb84a4b50241fea3a10948 100644 (file)
@@ -347,6 +347,8 @@ private:
        void subscribeToNotifications();
 
        bool checkError(QSqlQuery &query, bool prepared = false);
+       bool retryExec(QSqlQuery &query, bool prepared);
+
        OpenFileData readOpenFileData(QSqlQuery &q);
        Episode readEpisode(QSqlQuery &q);
        File readFile(QSqlQuery &q);