summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/sql/kernel/qsqldatabase.cpp6
-rw-r--r--tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp35
2 files changed, 41 insertions, 0 deletions
diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp
index b129499fe6..ded9bd7246 100644
--- a/src/sql/kernel/qsqldatabase.cpp
+++ b/src/sql/kernel/qsqldatabase.cpp
@@ -50,6 +50,7 @@
#include "private/qsqlnulldriver_p.h"
#include "qmutex.h"
#include "qhash.h"
+#include "qthread.h"
#include <stdlib.h>
QT_BEGIN_NAMESPACE
@@ -232,6 +233,11 @@ QSqlDatabase QSqlDatabasePrivate::database(const QString& name, bool open)
dict->lock.lockForRead();
QSqlDatabase db = dict->value(name);
dict->lock.unlock();
+ if (db.driver() && db.driver()->thread() != QThread::currentThread()) {
+ qWarning("QSqlDatabasePrivate::database: requested database does not belong to the calling thread.");
+ return QSqlDatabase();
+ }
+
if (db.isValid() && !db.isOpen() && open) {
if (!db.open())
qWarning() << "QSqlDatabasePrivate::database: unable to open database:" << db.lastError().text();
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
index ec5afd2b5c..427bc092a5 100644
--- a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
+++ b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
@@ -126,6 +126,8 @@ private slots:
void formatValueTrimStrings();
void precisionPolicy_data() { generic_data(); }
void precisionPolicy();
+ void multipleThreads_data() { generic_data(); }
+ void multipleThreads();
void db2_valueCacheUpdate_data() { generic_data("QDB2"); }
void db2_valueCacheUpdate();
@@ -2317,5 +2319,38 @@ void tst_QSqlDatabase::cloneDatabase()
}
}
+class DatabaseThreadObject : public QObject
+{
+ Q_OBJECT
+public:
+ DatabaseThreadObject(const QString &name, QObject *parent = nullptr) : QObject(parent), dbName(name)
+ {}
+public slots:
+ void ready()
+ {
+ QTest::ignoreMessage(QtWarningMsg,
+ "QSqlDatabasePrivate::database: requested database does not belong to the calling thread.");
+ QSqlDatabase db = QSqlDatabase::database(dbName);
+ QVERIFY(!db.isValid());
+ QThread::currentThread()->exit();
+ }
+private:
+ QString dbName;
+};
+
+void tst_QSqlDatabase::multipleThreads()
+{
+ QFETCH(QString, dbName);
+ QSqlDatabase db = QSqlDatabase::database(dbName);
+ CHECK_DATABASE(db);
+ DatabaseThreadObject dto(dbName);
+ QThread t;
+ dto.moveToThread(&t);
+ connect(&t, &QThread::started, &dto, &DatabaseThreadObject::ready);
+ t.start();
+ QTRY_VERIFY(t.isRunning());
+ QTRY_VERIFY(t.isFinished());
+}
+
QTEST_MAIN(tst_QSqlDatabase)
#include "tst_qsqldatabase.moc"