From: APTX Date: Sat, 14 Jul 2012 01:10:22 +0000 (+0200) Subject: A way of dynamically preparing statements only when needed + test use X-Git-Url: https://gitweb.aptx.org/?a=commitdiff_plain;h=df9843d89c01faebc8a87501f75be057fb065a87;p=localmylist.git A way of dynamically preparing statements only when needed + test use --- diff --git a/localmylist/database.cpp b/localmylist/database.cpp index 5257633..d095f70 100644 --- a/localmylist/database.cpp +++ b/localmylist/database.cpp @@ -127,6 +127,8 @@ struct DatabaseInternal { QSqlDatabase db; + QHash preparedQueries; + QSqlQuery getHostInfoQuery; QSqlQuery isKnownFileQuery; @@ -1318,6 +1320,33 @@ OpenFileData Database::readOpenFileData(QSqlQuery &q) 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"); diff --git a/localmylist/database.h b/localmylist/database.h index d56bca3..779e661 100644 --- a/localmylist/database.h +++ b/localmylist/database.h @@ -292,6 +292,7 @@ public: QSqlDatabase connection() const; + QSqlQuery &prepare(const char *const sql); bool exec(QSqlQuery &query); bool exec(const QString &sql); diff --git a/localmylist/mylistnode.cpp b/localmylist/mylistnode.cpp index 1b36156..9f546f6 100644 --- a/localmylist/mylistnode.cpp +++ b/localmylist/mylistnode.cpp @@ -96,11 +96,14 @@ bool MyListNode::canFetchMore() const 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())