summaryrefslogtreecommitdiffstats
path: root/tests/auto/sql
diff options
context:
space:
mode:
authorAndy Shaw <andy.shaw@qt.io>2017-12-05 14:21:05 +0100
committerAndy Shaw <andy.shaw@qt.io>2018-01-02 08:49:40 +0000
commit9b361f0e90fb1c154a16e65ec087ad36d5cca9b4 (patch)
treea72ecbe1b9c125d1ad3c8a7d2789f70d6249dcd0 /tests/auto/sql
parent2b0eb3fac319a17dd92903106d501f0f06df871f (diff)
Return an invalid QSqlDatabase when accessing from another thread
QSqlDatabase objects can only be used in the thread that the connection was opened for. So if the driver was created already then we check if the thread is correct. If it is not then we output a warning and return an invalid QSqlDatabase. [ChangeLog][QtSql][QSqlDatabase] QSqlDatabase::database() will return an invalid QSqlDatabase if the calling thread does not own the requested QSqlDatabase. Task-number: QTBUG-216 Change-Id: Ib5a25aa62129e3925f9819109af05961e5178bc5 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'tests/auto/sql')
-rw-r--r--tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp35
1 files changed, 35 insertions, 0 deletions
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"