From d71dc36f473d4fecc0648ff915de0dcd2fb85184 Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Sun, 12 Feb 2023 17:48:17 +0100 Subject: QSQLDatabase: avoid some code duplication Avoid some code duplication and enhance the documentation about thread-safeness of QSQLDatabase::cloneDatabase() Fixes: QTBUG-60505 Change-Id: I6ca6b9f47d818d49ca51395da14051e40317cef6 Reviewed-by: Volker Hilsheimer --- src/sql/kernel/qsqldatabase.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) (limited to 'src/sql/kernel/qsqldatabase.cpp') diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp index 5a8d27a5d06..f05d95319aa 100644 --- a/src/sql/kernel/qsqldatabase.cpp +++ b/src/sql/kernel/qsqldatabase.cpp @@ -28,12 +28,17 @@ typedef QHash DriverDict; class QConnectionDict: public QHash { public: - inline bool contains_ts(const QString &key) + QSqlDatabase value_ts(const QString &key) const + { + QReadLocker locker(&lock); + return value(key); + } + bool contains_ts(const QString &key) const { QReadLocker locker(&lock); return contains(key); } - inline QStringList keys_ts() const + QStringList keys_ts() const { QReadLocker locker(&lock); return keys(); @@ -185,9 +190,7 @@ QSqlDatabase QSqlDatabasePrivate::database(const QString& name, bool open) const QConnectionDict *dict = dbDict(); Q_ASSERT(dict); - dict->lock.lockForRead(); - QSqlDatabase db = dict->value(name); - dict->lock.unlock(); + QSqlDatabase db = dict->value_ts(name); if (!db.isValid()) return db; if (db.driver()->thread() != QThread::currentThread()) { @@ -1249,6 +1252,8 @@ bool QSqlDatabase::isValid() const \note The new connection has not been opened. Before using the new connection, you must call open(). + + \reentrant */ QSqlDatabase QSqlDatabase::cloneDatabase(const QSqlDatabase &other, const QString &connectionName) { @@ -1283,16 +1288,7 @@ QSqlDatabase QSqlDatabase::cloneDatabase(const QString &other, const QString &co const QConnectionDict *dict = dbDict(); Q_ASSERT(dict); - dict->lock.lockForRead(); - QSqlDatabase otherDb = dict->value(other); - dict->lock.unlock(); - if (!otherDb.isValid()) - return QSqlDatabase(); - - QSqlDatabase db(otherDb.driverName()); - db.d->copy(otherDb.d); - QSqlDatabasePrivate::addDatabase(db, connectionName); - return db; + return cloneDatabase(dict->value_ts(other), connectionName); } /*! -- cgit v1.2.3