summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/sql/kernel/qsqldatabase.cpp29
-rw-r--r--tests/auto/sql/kernel/qsql/tst_qsql.cpp4
2 files changed, 18 insertions, 15 deletions
diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp
index 9f306748af..4a966dcfa7 100644
--- a/src/sql/kernel/qsqldatabase.cpp
+++ b/src/sql/kernel/qsqldatabase.cpp
@@ -9,6 +9,7 @@
#include "qsqldriver.h"
#include "qsqldriverplugin.h"
#include "qsqlindex.h"
+#include "QtCore/qapplicationstatic.h"
#include "private/qfactoryloader_p.h"
#include "private/qsqlnulldriver_p.h"
#include "qhash.h"
@@ -23,8 +24,6 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
const char *QSqlDatabase::defaultConnection = "qt_sql_default_connection";
-typedef QHash<QString, QSqlDriverCreatorBase*> DriverDict;
-
class QConnectionDict: public QHash<QString, QSqlDatabase>
{
public:
@@ -48,6 +47,14 @@ public:
};
Q_GLOBAL_STATIC(QConnectionDict, dbDict)
+namespace {
+ struct DriverDict : public QHash<QString, QSqlDriverCreatorBase*>
+ {
+ ~DriverDict();
+ };
+}
+Q_APPLICATION_STATIC(DriverDict, qtDriverDict)
+
class QSqlDatabasePrivate
{
public:
@@ -120,23 +127,15 @@ void QSqlDatabasePrivate::cleanConnections()
dict->clear();
}
-static bool qDriverDictInit = false;
-static void cleanDriverDict()
+DriverDict::~DriverDict()
{
- qDeleteAll(QSqlDatabasePrivate::driverDict());
- QSqlDatabasePrivate::driverDict().clear();
+ qDeleteAll(*this);
QSqlDatabasePrivate::cleanConnections();
- qDriverDictInit = false;
}
DriverDict &QSqlDatabasePrivate::driverDict()
{
- static DriverDict dict;
- if (!qDriverDictInit) {
- qDriverDictInit = true;
- qAddPostRoutine(cleanDriverDict);
- }
- return dict;
+ return *qtDriverDict();
}
QSqlDatabasePrivate *QSqlDatabasePrivate::shared_null()
@@ -504,7 +503,7 @@ QStringList QSqlDatabase::drivers()
}
QReadLocker locker(&dbDict()->lock);
- const DriverDict dict = QSqlDatabasePrivate::driverDict();
+ const DriverDict &dict = QSqlDatabasePrivate::driverDict();
for (const auto &[k, _] : dict.asKeyValueRange()) {
if (!list.contains(k))
list << k;
@@ -645,7 +644,7 @@ void QSqlDatabasePrivate::init(const QString &type)
if (!driver) {
QReadLocker locker(&dbDict()->lock);
- DriverDict dict = QSqlDatabasePrivate::driverDict();
+ const DriverDict &dict = QSqlDatabasePrivate::driverDict();
for (DriverDict::const_iterator it = dict.constBegin();
it != dict.constEnd() && !driver; ++it) {
if (type == it.key()) {
diff --git a/tests/auto/sql/kernel/qsql/tst_qsql.cpp b/tests/auto/sql/kernel/qsql/tst_qsql.cpp
index 78f48a4117..4ccfff8647 100644
--- a/tests/auto/sql/kernel/qsql/tst_qsql.cpp
+++ b/tests/auto/sql/kernel/qsql/tst_qsql.cpp
@@ -121,6 +121,10 @@ void tst_QSql::open()
void tst_QSql::openInvalid()
{
+ int argc = 1;
+ char *argv[] = { const_cast<char*>(QTest::currentAppName()) };
+ QCoreApplication app(argc, argv, false);
+
QSqlDatabase db;
QVERIFY(!db.open());