summaryrefslogtreecommitdiffstats
path: root/src/sql
diff options
context:
space:
mode:
authorChristian Ehrlicher <ch.ehrlicher@gmx.de>2023-02-12 17:48:17 +0100
committerChristian Ehrlicher <ch.ehrlicher@gmx.de>2023-04-14 19:25:55 +0200
commitd71dc36f473d4fecc0648ff915de0dcd2fb85184 (patch)
treef2ee1f190edd359969671ec4b06a2685b84617a7 /src/sql
parent6de26ae531cafd130024b6f12a4e97a5028075fe (diff)
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 <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/sql')
-rw-r--r--src/sql/kernel/qsqldatabase.cpp26
1 files changed, 11 insertions, 15 deletions
diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp
index 5a8d27a5d0..f05d95319a 100644
--- a/src/sql/kernel/qsqldatabase.cpp
+++ b/src/sql/kernel/qsqldatabase.cpp
@@ -28,12 +28,17 @@ typedef QHash<QString, QSqlDriverCreatorBase*> DriverDict;
class QConnectionDict: public QHash<QString, QSqlDatabase>
{
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);
}
/*!