if (!d)
return;
+ d->preparedQueries.clear();
+
if (!d->db.isOpen())
{
qDebug() << "Not connected";
return;
}
- d->preparedQueries.clear();
d->db.close();
emit disconnected();
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())
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;
{
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;
{
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)
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;
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);