{
QSqlDatabase db;
+ QHash<const char *const, QSqlQuery> preparedQueries;
+
QSqlQuery getHostInfoQuery;
QSqlQuery isKnownFileQuery;
return data;
}
+
+QSqlQuery &Database::prepare(const char *const sql)
+{
+ auto it = d->preparedQueries.find(sql);
+
+ if (it != d->preparedQueries.end())
+ return it.value();
+
+
+ QSqlQuery query(d->db);
+
+ if (!query.prepare(sql))
+ {
+ qDebug() << "SQL error: " << query.lastError().type();
+ qDebug() << "Message: " << query.lastError().text();
+ qDebug() << "DB Message:" << query.lastError().databaseText();
+ qDebug() << "Query: " << query.executedQuery();
+
+ if (query.lastError().type() == QSqlError::ConnectionError)
+ disconnect();
+ }
+
+ auto ite = d->preparedQueries.insert(sql, query);
+ return ite.value();
+}
+
+
bool Database::exec(QSqlQuery &query)
{
Q_ASSERT_X(d->thread == QThread::currentThread(), "threads", "DB used from different thread");
QSqlDatabase connection() const;
+ QSqlQuery &prepare(const char *const sql);
bool exec(QSqlQuery &query);
bool exec(const QString &sql);
int MyListNode::fetchMore()
{
qDebug() << "fetching some more for root";
- QSqlQuery q(LocalMyList::instance()->database()->connection());
-
- if (!q.exec("SELECT aid, title_romaji AS title, (SELECT COUNT(e.eid) FROM episode e WHERE e.aid = a.aid), rating, my_vote, (SELECT COUNT(DISTINCT f.eid) FROM episode e JOIN file f ON (f.eid = e.eid) WHERE e.aid = a.aid AND f.my_watched IS NOT NULL) FROM anime a ORDER BY title ASC "
- "LIMIT " + QString::number(LIMIT) + " "
- "OFFSET " + QString::number(childCount())))
+ QSqlQuery &q = LocalMyList::instance()->database()->prepare(
+ "SELECT aid, title_romaji AS title, (SELECT COUNT(e.eid) FROM episode e WHERE e.aid = a.aid), rating, my_vote, (SELECT COUNT(DISTINCT f.eid) FROM episode e JOIN file f ON (f.eid = e.eid) WHERE e.aid = a.aid AND f.my_watched IS NOT NULL) FROM anime a ORDER BY title ASC "
+ "LIMIT :limit "
+ "OFFSET :offset ");
+ q.bindValue(":limit", LIMIT);
+ q.bindValue(":offset", childCount());
+
+ if (!LocalMyList::instance()->database()->exec(q))
return 0;
while (q.next())