diff options
-rw-r--r-- | src/sql/kernel/qsqldatabase.cpp | 6 | ||||
-rw-r--r-- | tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp | 35 |
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" |