diff options
Diffstat (limited to 'src/sql/kernel')
-rw-r--r-- | src/sql/kernel/qsqlcachedresult_p.h | 20 | ||||
-rw-r--r-- | src/sql/kernel/qsqldatabase.cpp | 16 | ||||
-rw-r--r-- | src/sql/kernel/qsqldatabase.h | 9 | ||||
-rw-r--r-- | src/sql/kernel/qsqldriver.h | 4 | ||||
-rw-r--r-- | src/sql/kernel/qsqldriverplugin.h | 2 | ||||
-rw-r--r-- | src/sql/kernel/qsqlerror.cpp | 3 | ||||
-rw-r--r-- | src/sql/kernel/qsqlfield.cpp | 6 | ||||
-rw-r--r-- | src/sql/kernel/qsqlnulldriver_p.h | 52 | ||||
-rw-r--r-- | src/sql/kernel/qsqlquery.cpp | 8 | ||||
-rw-r--r-- | src/sql/kernel/qsqlresult.cpp | 12 |
10 files changed, 79 insertions, 53 deletions
diff --git a/src/sql/kernel/qsqlcachedresult_p.h b/src/sql/kernel/qsqlcachedresult_p.h index 9bcfd49f1a..543a902554 100644 --- a/src/sql/kernel/qsqlcachedresult_p.h +++ b/src/sql/kernel/qsqlcachedresult_p.h @@ -78,20 +78,20 @@ protected: virtual bool gotoNext(ValueCache &values, int index) = 0; - QVariant data(int i) Q_DECL_OVERRIDE; - bool isNull(int i) Q_DECL_OVERRIDE; - bool fetch(int i) Q_DECL_OVERRIDE; - bool fetchNext() Q_DECL_OVERRIDE; - bool fetchPrevious() Q_DECL_OVERRIDE; - bool fetchFirst() Q_DECL_OVERRIDE; - bool fetchLast() Q_DECL_OVERRIDE; + QVariant data(int i) override; + bool isNull(int i) override; + bool fetch(int i) override; + bool fetchNext() override; + bool fetchPrevious() override; + bool fetchFirst() override; + bool fetchLast() override; int colCount() const; ValueCache &cache(); - void virtual_hook(int id, void *data) Q_DECL_OVERRIDE; - void detachFromResultSet() Q_DECL_OVERRIDE; - void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy) Q_DECL_OVERRIDE; + void virtual_hook(int id, void *data) override; + void detachFromResultSet() override; + void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy) override; private: bool cacheNext(); }; diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp index 14374c7ca9..c25762cd01 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 @@ -58,11 +59,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader, (QSqlDriverFactoryInterface_iid, QLatin1String("/sqldrivers"))) -#if !defined(Q_CC_MSVC) || _MSC_VER >= 1900 -// ### Qt6: remove the #ifdef -const -#endif -char *QSqlDatabase::defaultConnection = const_cast<char *>("qt_sql_default_connection"); +const char *QSqlDatabase::defaultConnection = const_cast<char *>("qt_sql_default_connection"); typedef QHash<QString, QSqlDriverCreatorBase*> DriverDict; @@ -135,6 +132,8 @@ QSqlDatabasePrivate::QSqlDatabasePrivate(const QSqlDatabasePrivate &other) : ref connOptions = other.connOptions; driver = other.driver; precisionPolicy = other.precisionPolicy; + if (driver) + driver->setNumericalPrecisionPolicy(other.driver->numericalPrecisionPolicy()); } QSqlDatabasePrivate::~QSqlDatabasePrivate() @@ -230,6 +229,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(); @@ -253,6 +257,8 @@ void QSqlDatabasePrivate::copy(const QSqlDatabasePrivate *other) port = other->port; connOptions = other->connOptions; precisionPolicy = other->precisionPolicy; + if (driver) + driver->setNumericalPrecisionPolicy(other->driver->numericalPrecisionPolicy()); } void QSqlDatabasePrivate::disable() diff --git a/src/sql/kernel/qsqldatabase.h b/src/sql/kernel/qsqldatabase.h index 0b4aca8cdd..3aadab9b2f 100644 --- a/src/sql/kernel/qsqldatabase.h +++ b/src/sql/kernel/qsqldatabase.h @@ -64,7 +64,7 @@ template <class T> class QSqlDriverCreator : public QSqlDriverCreatorBase { public: - QSqlDriver *createObject() const Q_DECL_OVERRIDE { return new T; } + QSqlDriver *createObject() const override { return new T; } }; class Q_SQL_EXPORT QSqlDatabase @@ -111,12 +111,7 @@ public: QSqlDriver* driver() const; - static -#if !defined(Q_CC_MSVC) || _MSC_VER >= 1900 - // ### Qt6: remove the #ifdef - const -#endif - char *defaultConnection; + static const char *defaultConnection; static QSqlDatabase addDatabase(const QString& type, const QString& connectionName = QLatin1String(defaultConnection)); diff --git a/src/sql/kernel/qsqldriver.h b/src/sql/kernel/qsqldriver.h index 1296bd5d51..1e03be48d3 100644 --- a/src/sql/kernel/qsqldriver.h +++ b/src/sql/kernel/qsqldriver.h @@ -89,7 +89,7 @@ public: DB2 }; - explicit QSqlDriver(QObject *parent = Q_NULLPTR); + explicit QSqlDriver(QObject *parent = nullptr); ~QSqlDriver(); virtual bool isOpen() const; bool isOpenError() const; @@ -139,7 +139,7 @@ Q_SIGNALS: void notification(const QString &name, QSqlDriver::NotificationSource source, const QVariant &payload); protected: - QSqlDriver(QSqlDriverPrivate &dd, QObject *parent = Q_NULLPTR); + QSqlDriver(QSqlDriverPrivate &dd, QObject *parent = nullptr); virtual void setOpen(bool o); virtual void setOpenError(bool e); virtual void setLastError(const QSqlError& e); diff --git a/src/sql/kernel/qsqldriverplugin.h b/src/sql/kernel/qsqldriverplugin.h index c0f4c00943..001368a291 100644 --- a/src/sql/kernel/qsqldriverplugin.h +++ b/src/sql/kernel/qsqldriverplugin.h @@ -55,7 +55,7 @@ class Q_SQL_EXPORT QSqlDriverPlugin : public QObject { Q_OBJECT public: - explicit QSqlDriverPlugin(QObject *parent = Q_NULLPTR); + explicit QSqlDriverPlugin(QObject *parent = nullptr); ~QSqlDriverPlugin(); virtual QSqlDriver *create(const QString &key) = 0; diff --git a/src/sql/kernel/qsqlerror.cpp b/src/sql/kernel/qsqlerror.cpp index 50b10aab40..5ca5987e95 100644 --- a/src/sql/kernel/qsqlerror.cpp +++ b/src/sql/kernel/qsqlerror.cpp @@ -144,6 +144,9 @@ QSqlError::QSqlError(const QString& driverText, const QString& databaseText, Err Constructs an error containing the driver error text \a driverText, the database-specific error text \a databaseText, the type \a type and the error code \a code. + + \note DB2: It is possible for DB2 to report more than one error code. + When this happens, \c ; is used as separator between the error codes. */ QSqlError::QSqlError(const QString &driverText, const QString &databaseText, ErrorType type, const QString &code) diff --git a/src/sql/kernel/qsqlfield.cpp b/src/sql/kernel/qsqlfield.cpp index a258d44df7..782ab0d71c 100644 --- a/src/sql/kernel/qsqlfield.cpp +++ b/src/sql/kernel/qsqlfield.cpp @@ -588,7 +588,6 @@ void QSqlField::setAutoValue(bool autoVal) \sa tableName() */ - void QSqlField::setTableName(const QString &table) { detach(); @@ -598,9 +597,12 @@ void QSqlField::setTableName(const QString &table) /*! Returns the tableName of the field. + \note When using the QPSQL driver, due to limitations in the libpq library, + the \c tableName() field is not populated in a QSqlField resulting + from a QSqlRecord obtained by QSqlQuery::record() of a forward-only query. + \sa setTableName() */ - QString QSqlField::tableName() const { return d->table; diff --git a/src/sql/kernel/qsqlnulldriver_p.h b/src/sql/kernel/qsqlnulldriver_p.h index 92d8d30485..7a40199d71 100644 --- a/src/sql/kernel/qsqlnulldriver_p.h +++ b/src/sql/kernel/qsqlnulldriver_p.h @@ -66,27 +66,27 @@ public: { QSqlResult::setLastError( QSqlError(QLatin1String("Driver not loaded"), QLatin1String("Driver not loaded"), QSqlError::ConnectionError)); } protected: - inline QVariant data(int) Q_DECL_OVERRIDE { return QVariant(); } - inline bool reset (const QString&) Q_DECL_OVERRIDE { return false; } - inline bool fetch(int) Q_DECL_OVERRIDE { return false; } - inline bool fetchFirst() Q_DECL_OVERRIDE { return false; } - inline bool fetchLast() Q_DECL_OVERRIDE { return false; } - inline bool isNull(int) Q_DECL_OVERRIDE { return false; } - inline int size() Q_DECL_OVERRIDE { return -1; } - inline int numRowsAffected() Q_DECL_OVERRIDE { return 0; } + inline QVariant data(int) override { return QVariant(); } + inline bool reset (const QString&) override { return false; } + inline bool fetch(int) override { return false; } + inline bool fetchFirst() override { return false; } + inline bool fetchLast() override { return false; } + inline bool isNull(int) override { return false; } + inline int size() override { return -1; } + inline int numRowsAffected() override { return 0; } - inline void setAt(int) Q_DECL_OVERRIDE {} - inline void setActive(bool) Q_DECL_OVERRIDE {} - inline void setLastError(const QSqlError&) Q_DECL_OVERRIDE {} - inline void setQuery(const QString&) Q_DECL_OVERRIDE {} - inline void setSelect(bool) Q_DECL_OVERRIDE {} - inline void setForwardOnly(bool) Q_DECL_OVERRIDE {} + inline void setAt(int) override {} + inline void setActive(bool) override {} + inline void setLastError(const QSqlError&) override {} + inline void setQuery(const QString&) override {} + inline void setSelect(bool) override {} + inline void setForwardOnly(bool) override {} - inline bool exec() Q_DECL_OVERRIDE { return false; } - inline bool prepare(const QString&) Q_DECL_OVERRIDE { return false; } - inline bool savePrepare(const QString&) Q_DECL_OVERRIDE { return false; } - inline void bindValue(int, const QVariant&, QSql::ParamType) Q_DECL_OVERRIDE {} - inline void bindValue(const QString&, const QVariant&, QSql::ParamType) Q_DECL_OVERRIDE {} + inline bool exec() override { return false; } + inline bool prepare(const QString&) override { return false; } + inline bool savePrepare(const QString&) override { return false; } + inline void bindValue(int, const QVariant&, QSql::ParamType) override {} + inline void bindValue(const QString&, const QVariant&, QSql::ParamType) override {} }; class QSqlNullDriver : public QSqlDriver @@ -95,16 +95,16 @@ public: inline QSqlNullDriver(): QSqlDriver() { QSqlDriver::setLastError( QSqlError(QLatin1String("Driver not loaded"), QLatin1String("Driver not loaded"), QSqlError::ConnectionError)); } - inline bool hasFeature(DriverFeature) const Q_DECL_OVERRIDE { return false; } - inline bool open(const QString &, const QString &, const QString &, const QString &, int, const QString&) Q_DECL_OVERRIDE + inline bool hasFeature(DriverFeature) const override { return false; } + inline bool open(const QString &, const QString &, const QString &, const QString &, int, const QString&) override { return false; } - inline void close() Q_DECL_OVERRIDE {} - inline QSqlResult *createResult() const Q_DECL_OVERRIDE { return new QSqlNullResult(this); } + inline void close() override {} + inline QSqlResult *createResult() const override { return new QSqlNullResult(this); } protected: - inline void setOpen(bool) Q_DECL_OVERRIDE {} - inline void setOpenError(bool) Q_DECL_OVERRIDE {} - inline void setLastError(const QSqlError&) Q_DECL_OVERRIDE {} + inline void setOpen(bool) override {} + inline void setOpenError(bool) override {} + inline void setLastError(const QSqlError&) override {} }; QT_END_NAMESPACE diff --git a/src/sql/kernel/qsqlquery.cpp b/src/sql/kernel/qsqlquery.cpp index b89d20976f..628bfa1880 100644 --- a/src/sql/kernel/qsqlquery.cpp +++ b/src/sql/kernel/qsqlquery.cpp @@ -878,6 +878,14 @@ bool QSqlQuery::isForwardOnly() const \note Calling setForwardOnly after execution of the query will result in unexpected results at best, and crashes at worst. + \note To make sure the forward-only query completed successfully, + the application should check lastError() for an error not only after + executing the query, but also after navigating the query results. + + \warning PostgreSQL: While navigating the query results in forward-only + mode, do not execute any other SQL command on the same database + connection. This will cause the query results to be lost. + \sa isForwardOnly(), next(), seek(), QSqlResult::setForwardOnly() */ void QSqlQuery::setForwardOnly(bool forward) diff --git a/src/sql/kernel/qsqlresult.cpp b/src/sql/kernel/qsqlresult.cpp index f79c1c71cd..cdb1379502 100644 --- a/src/sql/kernel/qsqlresult.cpp +++ b/src/sql/kernel/qsqlresult.cpp @@ -565,6 +565,14 @@ bool QSqlResult::isForwardOnly() const \note Calling setForwardOnly after execution of the query will result in unexpected results at best, and crashes at worst. + \note To make sure the forward-only query completed successfully, + the application should check lastError() for an error not only after + executing the query, but also after navigating the query results. + + \warning PostgreSQL: While navigating the query results in forward-only + mode, do not execute any other SQL command on the same database + connection. This will cause the query results to be lost. + \sa isForwardOnly(), fetchNext(), QSqlQuery::setForwardOnly() */ void QSqlResult::setForwardOnly(bool forward) @@ -1002,6 +1010,10 @@ bool QSqlResult::nextResult() \warning The handle can be NULL if the result was not executed yet. + \warning PostgreSQL: in forward-only mode, the handle of QSqlResult can change + after calling fetch(), fetchFirst(), fetchLast(), fetchNext(), fetchPrevious(), + nextResult(). + The handle returned here is database-dependent, you should query the type name of the variant before accessing it. |