Database::Database(const QString &connectionName) : d(0)
{
this->connectionName = connectionName;
+ reconnectAttempt = false;
}
Database::~Database()
if (!d->db.isOpen())
{
- qDebug() << "Already Connected";
+ qDebug() << "Not connected";
return;
}
d->db.close();
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");
return true;
}
-bool Database::checkError(QSqlQuery &query)
+bool Database::checkError(QSqlQuery &query, bool prepared)
{
if (query.lastError().type() == QSqlError::NoError)
return true;
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;
}
QSqlDatabase connection() const;
QSqlQuery &prepare(const char *const sql);
+ QSqlQuery prepareOneShot(const QString &sql);
+
bool exec(QSqlQuery &query);
bool exec(const QString &sql);
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