diff options
Diffstat (limited to 'src/sql/kernel')
-rw-r--r-- | src/sql/kernel/qsqldatabase.cpp | 51 | ||||
-rw-r--r-- | src/sql/kernel/qsqldatabase.h | 3 | ||||
-rw-r--r-- | src/sql/kernel/qsqlindex.cpp | 18 | ||||
-rw-r--r-- | src/sql/kernel/qsqlindex.h | 1 |
4 files changed, 53 insertions, 20 deletions
diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp index da5c51e770..fdbb16a589 100644 --- a/src/sql/kernel/qsqldatabase.cpp +++ b/src/sql/kernel/qsqldatabase.cpp @@ -7,6 +7,7 @@ #include "qcoreapplication.h" #include "qreadwritelock.h" #include "qsqldriver.h" +#include "qsqldriver_p.h" #include "qsqldriverplugin.h" #include "qsqlindex.h" #include "QtCore/qapplicationstatic.h" @@ -122,7 +123,7 @@ QSqlDatabasePrivate::~QSqlDatabasePrivate() QtSqlGlobals::~QtSqlGlobals() { qDeleteAll(registeredDrivers); - for (const auto &[k, v] : connections.asKeyValueRange()) + for (const auto &[k, v] : std::as_const(connections).asKeyValueRange()) QSqlDatabasePrivate::invalidateDb(v, k, false); } @@ -282,6 +283,10 @@ void QSqlDatabasePrivate::disable() QSqlDriver. Alternatively, you can subclass your own database driver from QSqlDriver. See \l{How to Write Your Own Database Driver} for more information. + A QSqlDatabase instance must only be accessed by the thread it + was created in. Therefore you have to make sure to create them + in the correct context. Alternatively you can change the context + with QSqlDatabase::moveToThread(). Create a connection (i.e., an instance of QSqlDatabase) by calling one of the static addDatabase() functions, where you specify @@ -1333,6 +1338,50 @@ QSql::NumericalPrecisionPolicy QSqlDatabase::numericalPrecisionPolicy() const return d->precisionPolicy; } +/*! + \since 6.8 + + Changes the thread affinity for QSqlDatabase and its associated driver. + This function returns \c true when the function succeeds. Event processing + will continue in the \a targetThread. + + During this operation you have to make sure that there is no QSqlQuery + bound to this instance otherwise the QSqlDatabase will not be moved to + the given thread and the function returns \c false. + + Since the associated driver is derived from QObject, all constraints for + moving a QObject to another thread also apply to this function. + + \sa QObject::moveToThread(), {Threads and the SQL Module} +*/ +bool QSqlDatabase::moveToThread(QThread *targetThread) +{ + if (auto drv = driver()) { + if (drv != QSqlDatabasePrivate::shared_null()->driver) { + // two instances are alive - the one here and the one in dbDict() + if (d->ref.loadRelaxed() > 2) { + qWarning("QSqlDatabasePrivate::moveToThread: connection '%ls' is still in use " + "in the current thread.", qUtf16Printable(d->connName)); + return false; + } + return drv->moveToThread(targetThread); + } + } + return false; +} + +/*! + \since 6.8 + + Returns a pointer to the associated QThread instance. +*/ +QThread *QSqlDatabase::currentThread() const +{ + if (auto drv = driver()) + return drv->thread(); + return nullptr; +} + #ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug dbg, const QSqlDatabase &d) diff --git a/src/sql/kernel/qsqldatabase.h b/src/sql/kernel/qsqldatabase.h index 10019c7d5c..5059dbba83 100644 --- a/src/sql/kernel/qsqldatabase.h +++ b/src/sql/kernel/qsqldatabase.h @@ -18,6 +18,7 @@ class QSqlIndex; class QSqlRecord; class QSqlQuery; class QSqlDatabasePrivate; +class QThread; class Q_SQL_EXPORT QSqlDriverCreatorBase { @@ -80,6 +81,8 @@ public: QString connectionName() const; void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy); QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() const; + bool moveToThread(QThread *targetThread); + QThread *currentThread() const; QSqlDriver* driver() const; diff --git a/src/sql/kernel/qsqlindex.cpp b/src/sql/kernel/qsqlindex.cpp index 26553155cc..15ee489928 100644 --- a/src/sql/kernel/qsqlindex.cpp +++ b/src/sql/kernel/qsqlindex.cpp @@ -149,24 +149,6 @@ void QSqlIndex::setDescending(int i, bool desc) sorts[i] = desc; } -/*! \internal - - Creates a string representing the field number \a i using prefix \a - prefix. If \a verbose is true, ASC or DESC is included in the field - description if the field is sorted in ASCending or DESCending order. -*/ - -QString QSqlIndex::createField(int i, const QString& prefix, bool verbose) const -{ - QString f; - if (!prefix.isEmpty()) - f += prefix + u'.'; - f += field(i).name(); - if (verbose) - f += u' ' + QString((isDescending(i) ? "DESC"_L1 : "ASC"_L1)); - return f; -} - /*! \property QSqlIndex::cursorName \since 6.8 diff --git a/src/sql/kernel/qsqlindex.h b/src/sql/kernel/qsqlindex.h index 409cb463e3..3d5d95b373 100644 --- a/src/sql/kernel/qsqlindex.h +++ b/src/sql/kernel/qsqlindex.h @@ -47,7 +47,6 @@ public: void setDescending(int i, bool desc); private: - QString createField(int i, const QString& prefix, bool verbose) const; // ### Qt7: move to d-ptr QString cursor; QString nm; |