diff options
-rw-r--r-- | src/plugins/sqldrivers/db2/qsql_db2.cpp | 57 | ||||
-rw-r--r-- | src/sql/kernel/qsqlerror.cpp | 3 |
2 files changed, 49 insertions, 11 deletions
diff --git a/src/plugins/sqldrivers/db2/qsql_db2.cpp b/src/plugins/sqldrivers/db2/qsql_db2.cpp index b457ced538..1f98228f1b 100644 --- a/src/plugins/sqldrivers/db2/qsql_db2.cpp +++ b/src/plugins/sqldrivers/db2/qsql_db2.cpp @@ -156,7 +156,7 @@ static SQLTCHAR* qToTChar(const QString& str) return (SQLTCHAR*)str.utf16(); } -static QString qWarnDB2Handle(int handleType, SQLHANDLE handle) +static QString qWarnDB2Handle(int handleType, SQLHANDLE handle, int *errorCode) { SQLINTEGER nativeCode; SQLSMALLINT msgLen; @@ -171,22 +171,51 @@ static QString qWarnDB2Handle(int handleType, SQLHANDLE handle) (SQLTCHAR*) description, SQL_MAX_MESSAGE_LENGTH - 1, /* in bytes, not in characters */ &msgLen); - if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) + if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) { + if (errorCode) + *errorCode = nativeCode; return QString(qFromTChar(description)); + } return QString(); } -static QString qDB2Warn(const QDB2DriverPrivate* d) +static QString qDB2Warn(const QDB2DriverPrivate* d, QStringList *errorCodes = nullptr) { - return (qWarnDB2Handle(SQL_HANDLE_ENV, d->hEnv) + QLatin1Char(' ') - + qWarnDB2Handle(SQL_HANDLE_DBC, d->hDbc)); + int errorCode = 0; + QString error = qWarnDB2Handle(SQL_HANDLE_ENV, d->hEnv, &errorCode); + if (errorCodes && errorCode != 0) { + *errorCodes << QString::number(errorCode); + errorCode = 0; + } + if (!error.isEmpty()) + error += QLatin1Char(' '); + error += qWarnDB2Handle(SQL_HANDLE_DBC, d->hDbc, &errorCode); + if (errorCodes && errorCode != 0) + *errorCodes << QString::number(errorCode); + return error; } -static QString qDB2Warn(const QDB2ResultPrivate* d) +static QString qDB2Warn(const QDB2ResultPrivate* d, QStringList *errorCodes = nullptr) { - return (qWarnDB2Handle(SQL_HANDLE_ENV, d->drv_d_func()->hEnv) + QLatin1Char(' ') - + qWarnDB2Handle(SQL_HANDLE_DBC, d->drv_d_func()->hDbc) - + qWarnDB2Handle(SQL_HANDLE_STMT, d->hStmt)); + int errorCode = 0; + QString error = qWarnDB2Handle(SQL_HANDLE_ENV, d->drv_d_func()->hEnv, &errorCode); + if (errorCodes && errorCode != 0) { + *errorCodes << QString::number(errorCode); + errorCode = 0; + } + if (!error.isEmpty()) + error += QLatin1Char(' '); + error += qWarnDB2Handle(SQL_HANDLE_DBC, d->drv_d_func()->hDbc, &errorCode); + if (errorCodes && errorCode != 0) { + *errorCodes << QString::number(errorCode); + errorCode = 0; + } + if (!error.isEmpty()) + error += QLatin1Char(' '); + error += qWarnDB2Handle(SQL_HANDLE_STMT, d->hStmt, &errorCode); + if (errorCodes && errorCode != 0) + *errorCodes << QString::number(errorCode); + return error; } static void qSqlWarning(const QString& message, const QDB2DriverPrivate* d) @@ -204,13 +233,19 @@ static void qSqlWarning(const QString& message, const QDB2ResultPrivate* d) static QSqlError qMakeError(const QString& err, QSqlError::ErrorType type, const QDB2DriverPrivate* p) { - return QSqlError(QLatin1String("QDB2: ") + err, qDB2Warn(p), type); + QStringList errorCodes; + const QString error = qDB2Warn(p, &errorCodes); + return QSqlError(QStringLiteral("QDB2: ") + err, error, type, + errorCodes.join(QLatin1Char(';'))); } static QSqlError qMakeError(const QString& err, QSqlError::ErrorType type, const QDB2ResultPrivate* p) { - return QSqlError(QLatin1String("QDB2: ") + err, qDB2Warn(p), type); + QStringList errorCodes; + const QString error = qDB2Warn(p, &errorCodes); + return QSqlError(QStringLiteral("QDB2: ") + err, error, type, + errorCodes.join(QLatin1Char(';'))); } static QVariant::Type qDecodeDB2Type(SQLSMALLINT sqltype) 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) |