From: APTX Date: Wed, 5 Sep 2012 01:45:35 +0000 (+0200) Subject: Try to reconnect automatically. X-Git-Url: https://gitweb.tyo.aptx.org/?a=commitdiff_plain;h=8cb05bfddb23c07f29393a4ba580c313707ed105;p=localmylist.git Try to reconnect automatically. --- diff --git a/localmylist/database.cpp b/localmylist/database.cpp index e652597..5c739a8 100644 --- a/localmylist/database.cpp +++ b/localmylist/database.cpp @@ -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; diff --git a/localmylist/database.h b/localmylist/database.h index 21b563a..a761e64 100644 --- a/localmylist/database.h +++ b/localmylist/database.h @@ -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);