+
+void AbstractSqlStorage::connectionDestroyed() {
+ QMutexLocker locker(&_connectionPoolMutex);
+ _connectionPool.remove(sender()->thread());
+}
+
+// ========================================
+// AbstractSqlStorage::Connection
+// ========================================
+AbstractSqlStorage::Connection::Connection(const QString &name, AbstractSqlStorage *storage, QObject *parent)
+ : QObject(parent),
+ _name(name.toLatin1()),
+ _storageEngine(storage)
+{
+}
+
+AbstractSqlStorage::Connection::~Connection() {
+ QHash<QPair<QString, int>, QSqlQuery *>::iterator iter = _queryCache.begin();
+ while(iter != _queryCache.end()) {
+ delete *iter;
+ iter = _queryCache.erase(iter);
+ }
+ {
+ QSqlDatabase db = QSqlDatabase::database(name(), false);
+ if(db.isOpen()) {
+ db.commit();
+ db.close();
+ }
+ }
+ QSqlDatabase::removeDatabase(name());
+}
+
+QSqlQuery &AbstractSqlStorage::Connection::cachedQuery(const QString &queryName, int version) {
+ QPair<QString, int> queryId = qMakePair(queryName, version);
+ if(_queryCache.contains(queryId)) {
+ return *(_queryCache[queryId]);
+ }
+
+ QSqlQuery *query = new QSqlQuery(QSqlDatabase::database(name()));
+ query->prepare(_storageEngine->queryString(queryName, version));
+ _queryCache[queryId] = query;
+ return *query;
+}
+
+void AbstractSqlStorage::Connection::syncCachedQueries() {
+ QHash<QPair<QString, int>, QSqlQuery *>::iterator iter = _queryCache.begin();
+ while(iter != _queryCache.end()) {
+ delete *iter;
+ iter = _queryCache.erase(iter);
+ }
+ QSqlDatabase db = QSqlDatabase::database(name(), false);
+ if(db.isOpen())
+ db.commit();
+}