From: APTX Date: Sat, 14 Jul 2012 15:22:31 +0000 (+0200) Subject: Attempt to reconnect and execute the query again X-Git-Url: https://gitweb.tyo.aptx.org/?a=commitdiff_plain;h=a713529d0c0425f70c201b389845784e0a4944d9;p=localmylist.git Attempt to reconnect and execute the query again --- diff --git a/localmylist/database.cpp b/localmylist/database.cpp index f55442f..f2517db 100644 --- a/localmylist/database.cpp +++ b/localmylist/database.cpp @@ -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; } diff --git a/localmylist/database.h b/localmylist/database.h index 321c05f..c4ce454 100644 --- a/localmylist/database.h +++ b/localmylist/database.h @@ -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