@@ -50,8 +50,8 @@ TSqlDatabasePool::~TSqlDatabasePool()
5050 QString name;
5151 while (!cache.isEmpty ()) {
5252 name = cache.pop ();
53- QSqlDatabase db = TSqlDatabase::database (name). sqlDatabase ( );
54- db. close ( );
53+ auto & db = TSqlDatabase::database (name);
54+ closeDatabase (db );
5555 TSqlDatabase::removeDatabase (name);
5656 }
5757
@@ -90,7 +90,6 @@ void TSqlDatabasePool::init()
9090
9191 QMutexLocker locker (&_mutex);
9292
93-
9493 cachedDatabase = new QStack<QString>[Tf::app ()->sqlDatabaseSettingsCount ()];
9594 lastCachedTime = new TAtomic<uint>[Tf::app ()->sqlDatabaseSettingsCount ()];
9695 availableNames = new QStack<QString>[Tf::app ()->sqlDatabaseSettingsCount ()];
@@ -129,7 +128,6 @@ void TSqlDatabasePool::init()
129128QSqlDatabase TSqlDatabasePool::database (int databaseId)
130129{
131130 QMutexLocker locker (&_mutex);
132- TSqlDatabase tdb;
133131
134132 if (Q_LIKELY (databaseId >= 0 && databaseId < Tf::app ()->sqlDatabaseSettingsCount ())) {
135133 auto &cache = cachedDatabase[databaseId];
@@ -139,7 +137,7 @@ QSqlDatabase TSqlDatabasePool::database(int databaseId)
139137 QString name;
140138 if (!cache.isEmpty ()) {
141139 name = cache.pop ();
142- tdb = TSqlDatabase::database (name);
140+ const auto & tdb = TSqlDatabase::database (name);
143141 if (Q_LIKELY (tdb.sqlDatabase ().isOpen ())) {
144142 tSystemDebug (" Gets cached database: %s" , qUtf8Printable (tdb.connectionName ()));
145143 return tdb.sqlDatabase ();
@@ -152,8 +150,8 @@ QSqlDatabase TSqlDatabasePool::database(int databaseId)
152150
153151 if (Q_LIKELY (!stack.isEmpty ())) {
154152 name = stack.pop ();
155- auto tdb = TSqlDatabase::database (name);
156- if (Q_UNLIKELY (!tdb. sqlDatabase (). open ( ))) {
153+ auto & tdb = TSqlDatabase::database (name);
154+ if (Q_UNLIKELY (!openDatabase (tdb ))) {
157155 tError (" Database open error. Invalid database settings, or maximum number of SQL connection exceeded." );
158156 tSystemError (" SQL database open error: %s" , qUtf8Printable (tdb.sqlDatabase ().connectionName ()));
159157 stack.push (name);
@@ -241,9 +239,6 @@ bool TSqlDatabasePool::setDatabaseSettings(TSqlDatabase &database, int databaseI
241239 tSystemDebug (" Database enableUpsert: %d" , enableUpsert);
242240 database.setUpsertEnabled (enableUpsert);
243241
244- auto *extension = TSqlDriverExtensionFactory::create (database.sqlDatabase ().driverName (), database.sqlDatabase ().driver ());
245- database.setDriverExtension (extension);
246-
247242 return true ;
248243}
249244
@@ -258,7 +253,8 @@ void TSqlDatabasePool::pool(QSqlDatabase &database, bool forceClose)
258253 if (databaseId >= 0 && databaseId < Tf::app ()->sqlDatabaseSettingsCount ()) {
259254 if (forceClose) {
260255 tSystemWarn (" Force close database: %s" , qUtf8Printable (database.connectionName ()));
261- closeDatabase (database);
256+ TSqlDatabase &db = TSqlDatabase::database (database.connectionName ());
257+ closeDatabase (db);
262258 } else {
263259 if (database.isOpen ()) {
264260 // pool
@@ -294,7 +290,7 @@ void TSqlDatabasePool::timerEvent(QTimerEvent *event)
294290 while (lastCachedTime[i].load () < (uint)std::time (nullptr ) - 30
295291 && !cache.isEmpty ()) {
296292 name = cache.pop ();
297- QSqlDatabase db = TSqlDatabase::database (name). sqlDatabase ( );
293+ TSqlDatabase & db = TSqlDatabase::database (name);
298294 closeDatabase (db);
299295 }
300296 }
@@ -304,13 +300,39 @@ void TSqlDatabasePool::timerEvent(QTimerEvent *event)
304300}
305301
306302
307- void TSqlDatabasePool::closeDatabase (QSqlDatabase &database)
303+ bool TSqlDatabasePool::openDatabase (TSqlDatabase &database)
304+ {
305+ bool ret = database.sqlDatabase ().open ();
306+
307+ if (ret) {
308+ TSqlDriverExtension *extension = database.driverExtension ();
309+ if (extension) {
310+ TSqlDriverExtensionFactory::destroy (database.sqlDatabase ().driverName (), extension);
311+ }
312+
313+ extension = TSqlDriverExtensionFactory::create (database.sqlDatabase ().driverName (), database.sqlDatabase ().driver ());
314+ database.setDriverExtension (extension);
315+ }
316+
317+ return ret;
318+ }
319+
320+
321+ void TSqlDatabasePool::closeDatabase (TSqlDatabase &database)
308322{
309323 QMutexLocker locker (&_mutex);
310324
311- int id = getDatabaseId (database);
312- QString name = database.connectionName ();
313- database.close ();
325+ QSqlDatabase db = database.sqlDatabase ();
326+ int id = getDatabaseId (db);
327+ QString name = db.connectionName ();
328+ db.close ();
329+
330+ TSqlDriverExtension *extension = database.driverExtension ();
331+ if (extension) {
332+ TSqlDriverExtensionFactory::destroy (database.sqlDatabase ().driverName (), extension);
333+ }
334+ database.setDriverExtension (nullptr );
335+
314336 tSystemDebug (" Closed database connection, name: %s" , qUtf8Printable (name));
315337 availableNames[id].push (name);
316338}
0 commit comments