SQL/ODBC: sync usage of qSqlWarning()

Replace all qWarning() with qSqlWarning() to be able to get additional
error/warning output from the handles.

Change-Id: Ieaa947fe06216b3d20b20c509080fc409803683b
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
This commit is contained in:
Christian Ehrlicher 2024-02-10 20:08:58 +01:00
parent 003cef9d40
commit 453e66c61b

View File

@ -319,7 +319,11 @@ static QString errorStringFromDiagRecords(const QList<DiagRecord>& records)
template<class T> template<class T>
static void qSqlWarning(const QString &message, T &&val) static void qSqlWarning(const QString &message, T &&val)
{ {
qWarning() << message << "\tError:" << errorStringFromDiagRecords(qODBCWarn(val)); const auto addMsg = errorStringFromDiagRecords(qODBCWarn(val));
if (addMsg.isEmpty())
qWarning() << message;
else
qWarning() << message << "\tError:" << addMsg;
} }
static QSqlError qMakeError(const QString &err, static QSqlError qMakeError(const QString &err,
@ -443,7 +447,7 @@ static QVariant getStringDataImpl(SQLHANDLE hStmt, SQLUSMALLINT column, qsizetyp
} else if (r == SQL_NO_DATA) { } else if (r == SQL_NO_DATA) {
break; break;
} else { } else {
qSqlWarning("qGetStringData: Error while fetching data:"_L1, hStmt); qSqlWarning("QODBC::getStringData: Error while fetching data"_L1, hStmt);
return {}; return {};
} }
} }
@ -485,7 +489,8 @@ static QVariant qGetBinaryData(SQLHANDLE hStmt, int column)
&colScale, &colScale,
&nullable); &nullable);
if (r != SQL_SUCCESS) if (r != SQL_SUCCESS)
qWarning() << "qGetBinaryData: Unable to describe column" << column; qSqlWarning(("QODBC::qGetBinaryData: Unable to describe column %1"_L1)
.arg(QString::number(column)), hStmt);
// SQLDescribeCol may return 0 if size cannot be determined // SQLDescribeCol may return 0 if size cannot be determined
if (!colSize) if (!colSize)
colSize = 255; colSize = 255;
@ -586,8 +591,8 @@ static bool isAutoValue(const SQLHANDLE hStmt, int column)
const SQLRETURN r = ::SQLColAttribute(hStmt, column + 1, SQL_DESC_AUTO_UNIQUE_VALUE, const SQLRETURN r = ::SQLColAttribute(hStmt, column + 1, SQL_DESC_AUTO_UNIQUE_VALUE,
0, 0, 0, &nNumericAttribute); 0, 0, 0, &nNumericAttribute);
if (!SQL_SUCCEEDED(r)) { if (!SQL_SUCCEEDED(r)) {
qSqlWarning(QStringLiteral("qMakeField: Unable to get autovalue attribute for column ") qSqlWarning(("QODBC::isAutoValue: Unable to get autovalue attribute for column %1"_L1)
+ QString::number(column), hStmt); .arg(QString::number(column)), hStmt);
return false; return false;
} }
return nNumericAttribute != SQL_FALSE; return nNumericAttribute != SQL_FALSE;
@ -634,7 +639,8 @@ static QSqlField qMakeFieldInfo(const QODBCResultPrivate *p, int i)
&nullable); &nullable);
if (r != SQL_SUCCESS) { if (r != SQL_SUCCESS) {
qSqlWarning(QStringLiteral("qMakeField: Unable to describe column ") + QString::number(i), p); qSqlWarning(("QODBC::qMakeFieldInfo: Unable to describe column %1"_L1)
.arg(QString::number(i)), p);
return QSqlField(); return QSqlField();
} }
@ -647,8 +653,8 @@ static QSqlField qMakeFieldInfo(const QODBCResultPrivate *p, int i)
0, 0,
&unsignedFlag); &unsignedFlag);
if (r != SQL_SUCCESS) { if (r != SQL_SUCCESS) {
qSqlWarning(QStringLiteral("qMakeField: Unable to get column attributes for column ") qSqlWarning(("QODBC::qMakeFieldInfo: Unable to get column attributes for column %1"_L1)
+ QString::number(i), p); .arg(QString::number(i)), p);
} }
const QString qColName(fromSQLTCHAR(colName, colNameLen)); const QString qColName(fromSQLTCHAR(colName, colNameLen));
@ -734,7 +740,8 @@ bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts)
const QString tmp(opts.at(i)); const QString tmp(opts.at(i));
int idx; int idx;
if ((idx = tmp.indexOf(u'=')) == -1) { if ((idx = tmp.indexOf(u'=')) == -1) {
qWarning() << "QODBCDriver::open: Illegal connect option value '" << tmp << '\''; qSqlWarning(("QODBCDriver::open: Illegal connect option value '%1'"_L1)
.arg(tmp), this);
continue; continue;
} }
const QString opt(tmp.left(idx)); const QString opt(tmp.left(idx));
@ -748,7 +755,8 @@ bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts)
} else if (val.toUpper() == "SQL_MODE_READ_WRITE"_L1) { } else if (val.toUpper() == "SQL_MODE_READ_WRITE"_L1) {
v = SQL_MODE_READ_WRITE; v = SQL_MODE_READ_WRITE;
} else { } else {
qWarning() << "QODBCDriver::open: Unknown option value '" << val << '\''; qSqlWarning(("QODBCDriver::open: Unknown option value '%1'"_L1)
.arg(val), this);
continue; continue;
} }
r = SQLSetConnectAttr(hDbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER) size_t(v), 0); r = SQLSetConnectAttr(hDbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER) size_t(v), 0);
@ -766,7 +774,8 @@ bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts)
} else if (val.toUpper() == "SQL_FALSE"_L1) { } else if (val.toUpper() == "SQL_FALSE"_L1) {
v = SQL_FALSE; v = SQL_FALSE;
} else { } else {
qWarning() << "QODBCDriver::open: Unknown option value '" << val << '\''; qSqlWarning(("QODBCDriver::open: Unknown option value '%1'"_L1)
.arg(val), this);
continue; continue;
} }
r = SQLSetConnectAttr(hDbc, SQL_ATTR_METADATA_ID, (SQLPOINTER) size_t(v), 0); r = SQLSetConnectAttr(hDbc, SQL_ATTR_METADATA_ID, (SQLPOINTER) size_t(v), 0);
@ -781,7 +790,8 @@ bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts)
} else if (val.toUpper() == "SQL_OPT_TRACE_ON"_L1) { } else if (val.toUpper() == "SQL_OPT_TRACE_ON"_L1) {
v = SQL_OPT_TRACE_ON; v = SQL_OPT_TRACE_ON;
} else { } else {
qWarning() << "QODBCDriver::open: Unknown option value '" << val << '\''; qSqlWarning(("QODBCDriver::open: Unknown option value '%1'"_L1)
.arg(val), this);
continue; continue;
} }
r = SQLSetConnectAttr(hDbc, SQL_ATTR_TRACE, (SQLPOINTER) size_t(v), 0); r = SQLSetConnectAttr(hDbc, SQL_ATTR_TRACE, (SQLPOINTER) size_t(v), 0);
@ -795,7 +805,8 @@ bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts)
else if (val.toUpper() == "SQL_CP_DEFAULT"_L1) else if (val.toUpper() == "SQL_CP_DEFAULT"_L1)
v = SQL_CP_DEFAULT; v = SQL_CP_DEFAULT;
else { else {
qWarning() << "QODBCDriver::open: Unknown option value '" << val << '\''; qSqlWarning(("QODBCDriver::open: Unknown option value '%1'"_L1)
.arg(val), this);
continue; continue;
} }
r = SQLSetConnectAttr(hDbc, SQL_ATTR_CONNECTION_POOLING, (SQLPOINTER) size_t(v), 0); r = SQLSetConnectAttr(hDbc, SQL_ATTR_CONNECTION_POOLING, (SQLPOINTER) size_t(v), 0);
@ -807,7 +818,8 @@ bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts)
else if (val.toUpper() == "SQL_CP_MATCH_DEFAULT"_L1) else if (val.toUpper() == "SQL_CP_MATCH_DEFAULT"_L1)
v = SQL_CP_MATCH_DEFAULT; v = SQL_CP_MATCH_DEFAULT;
else { else {
qWarning() << "QODBCDriver::open: Unknown option value '" << val << '\''; qSqlWarning(("QODBCDriver::open: Unknown option value '%1'"_L1)
.arg(val), this);
continue; continue;
} }
r = SQLSetConnectAttr(hDbc, SQL_ATTR_CP_MATCH, (SQLPOINTER) size_t(v), 0); r = SQLSetConnectAttr(hDbc, SQL_ATTR_CP_MATCH, (SQLPOINTER) size_t(v), 0);
@ -815,11 +827,12 @@ bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts)
// Already handled in QODBCDriver::open() // Already handled in QODBCDriver::open()
continue; continue;
} else { } else {
qWarning() << "QODBCDriver::open: Unknown connection attribute '" << opt << '\''; qSqlWarning(("QODBCDriver::open: Unknown connection attribute '%1'"_L1)
.arg(opt), this);
} }
if (!SQL_SUCCEEDED(r)) if (!SQL_SUCCEEDED(r))
qSqlWarning(QString::fromLatin1("QODBCDriver::open: Unable to set connection attribute'%1'").arg( qSqlWarning(("QODBCDriver::open: Unable to set connection attribute '%1'"_L1)
opt), this); .arg(opt), this);
} }
return true; return true;
} }
@ -855,7 +868,7 @@ void QODBCDriverPrivate::splitTableQualifier(const QString &qualifier, QString &
table = adjustName(l.at(2).toString()); table = adjustName(l.at(2).toString());
break; break;
default: default:
qSqlWarning(QString::fromLatin1("QODBCDriver::splitTableQualifier: Unable to split table qualifier '%1'") qSqlWarning(("QODBCDriver::splitTableQualifier: Unable to split table qualifier '%1'"_L1)
.arg(qualifier), this); .arg(qualifier), this);
break; break;
} }
@ -919,8 +932,7 @@ QODBCResult::~QODBCResult()
if (d->hStmt && d->isStmtHandleValid() && driver() && driver()->isOpen()) { if (d->hStmt && d->isStmtHandleValid() && driver() && driver()->isOpen()) {
SQLRETURN r = SQLFreeHandle(SQL_HANDLE_STMT, d->hStmt); SQLRETURN r = SQLFreeHandle(SQL_HANDLE_STMT, d->hStmt);
if (r != SQL_SUCCESS) if (r != SQL_SUCCESS)
qSqlWarning("QODBCDriver: Unable to free statement handle "_L1 qSqlWarning(("QODBCResult: Unable to free statement handle "_L1), d);
+ QString::number(r), d);
} }
} }
@ -1151,7 +1163,8 @@ QVariant QODBCResult::data(int field)
{ {
Q_D(QODBCResult); Q_D(QODBCResult);
if (field >= d->rInf.count() || field < 0) { if (field >= d->rInf.count() || field < 0) {
qWarning() << "QODBCResult::data: column" << field << "out of range"; qSqlWarning(("QODBCResult::data: column %1 out of range"_L1)
.arg(QString::number(field)), d);
return QVariant(); return QVariant();
} }
if (field < d->fieldCacheIdx) if (field < d->fieldCacheIdx)
@ -1277,7 +1290,6 @@ int QODBCResult::numRowsAffected()
SQLRETURN r = SQLRowCount(d->hStmt, &affectedRowCount); SQLRETURN r = SQLRowCount(d->hStmt, &affectedRowCount);
if (r == SQL_SUCCESS) if (r == SQL_SUCCESS)
return affectedRowCount; return affectedRowCount;
else
qSqlWarning("QODBCResult::numRowsAffected: Unable to count affected rows"_L1, d); qSqlWarning("QODBCResult::numRowsAffected: Unable to count affected rows"_L1, d);
return -1; return -1;
} }
@ -1791,8 +1803,7 @@ bool QODBCResult::nextResult()
SQLRETURN r = SQLMoreResults(d->hStmt); SQLRETURN r = SQLMoreResults(d->hStmt);
if (r != SQL_SUCCESS) { if (r != SQL_SUCCESS) {
if (r == SQL_SUCCESS_WITH_INFO) { if (r == SQL_SUCCESS_WITH_INFO) {
QString message = errorStringFromDiagRecords(qODBCWarn(d)); qSqlWarning("QODBCResult::nextResult:"_L1, d);
qWarning() << "QODBCResult::nextResult():" << message;
} else { } else {
if (r != SQL_NO_DATA) if (r != SQL_NO_DATA)
setLastError(qMakeError(QCoreApplication::translate("QODBCResult", setLastError(qMakeError(QCoreApplication::translate("QODBCResult",
@ -2141,9 +2152,10 @@ bool QODBCDriverPrivate::checkDriver() const
return false; return false;
} }
if (sup == SQL_FALSE) { if (sup == SQL_FALSE) {
qWarning () << "QODBCDriver::open: Warning - Driver doesn't support all needed functionality (" qSqlWarning(("QODBCDriver::checkDriver: Driver doesn't support all needed "
<< func "functionality (func id %1).\nPlease look at the Qt SQL Module "
<< ").\nPlease look at the Qt SQL Module Driver documentation for more information."; "Driver documentation for more information."_L1)
.arg(QString::number(func)), this);
return false; return false;
} }
} }
@ -2158,8 +2170,9 @@ bool QODBCDriverPrivate::checkDriver() const
return false; return false;
} }
if (sup == SQL_FALSE) { if (sup == SQL_FALSE) {
qWarning() << "QODBCDriver::checkDriver: Warning - Driver doesn't support some non-critical functions (" qSqlWarning(("QODBCDriver::checkDriver: Driver doesn't support some "
<< func << ')'; "non-critical functions (func id %1)."_L1)
.arg(QString::number(func)), this);
return true; return true;
} }
} }
@ -2224,7 +2237,8 @@ void QODBCDriverPrivate::checkHasSQLFetchScroll()
SQLRETURN r = SQLGetFunctions(hDbc, SQL_API_SQLFETCHSCROLL, &sup); SQLRETURN r = SQLGetFunctions(hDbc, SQL_API_SQLFETCHSCROLL, &sup);
if ((!SQL_SUCCEEDED(r)) || sup != SQL_TRUE) { if ((!SQL_SUCCEEDED(r)) || sup != SQL_TRUE) {
hasSQLFetchScroll = false; hasSQLFetchScroll = false;
qWarning("QODBCDriver::checkHasSQLFetchScroll: Warning - Driver doesn't support scrollable result sets, use forward only mode for queries"); qSqlWarning("QODBCDriver::checkHasSQLFetchScroll: Driver doesn't support "
"scrollable result sets, use forward only mode for queries"_L1, this);
} }
} }
@ -2268,7 +2282,7 @@ bool QODBCDriver::beginTransaction()
{ {
Q_D(QODBCDriver); Q_D(QODBCDriver);
if (!isOpen()) { if (!isOpen()) {
qWarning("QODBCDriver::beginTransaction: Database not open"); qSqlWarning("QODBCDriver::beginTransaction: Database not open"_L1, d);
return false; return false;
} }
SQLUINTEGER ac(SQL_AUTOCOMMIT_OFF); SQLUINTEGER ac(SQL_AUTOCOMMIT_OFF);
@ -2288,7 +2302,7 @@ bool QODBCDriver::commitTransaction()
{ {
Q_D(QODBCDriver); Q_D(QODBCDriver);
if (!isOpen()) { if (!isOpen()) {
qWarning("QODBCDriver::commitTransaction: Database not open"); qSqlWarning("QODBCDriver::commitTransaction: Database not open"_L1, d);
return false; return false;
} }
SQLRETURN r = SQLEndTran(SQL_HANDLE_DBC, SQLRETURN r = SQLEndTran(SQL_HANDLE_DBC,
@ -2306,7 +2320,7 @@ bool QODBCDriver::rollbackTransaction()
{ {
Q_D(QODBCDriver); Q_D(QODBCDriver);
if (!isOpen()) { if (!isOpen()) {
qWarning("QODBCDriver::rollbackTransaction: Database not open"); qSqlWarning("QODBCDriver::rollbackTransaction: Database not open"_L1, d);
return false; return false;
} }
SQLRETURN r = SQLEndTran(SQL_HANDLE_DBC, SQLRETURN r = SQLEndTran(SQL_HANDLE_DBC,
@ -2372,12 +2386,12 @@ QStringList QODBCDriver::tables(QSql::TableType type) const
} }
if (r != SQL_SUCCESS) if (r != SQL_SUCCESS)
qSqlWarning("QODBCDriver::tables Unable to execute table list"_L1, d); qSqlWarning("QODBCDriver::tables Unable to execute table list"_L1,
hStmt.handle());
r = d->sqlFetchNext(hStmt); r = d->sqlFetchNext(hStmt);
if (!SQL_SUCCEEDED(r) && r != SQL_NO_DATA) { if (!SQL_SUCCEEDED(r) && r != SQL_NO_DATA) {
qSqlWarning("QODBCDriver::tables failed to retrieve table/view list: ("_L1 qSqlWarning("QODBCDriver::tables failed to retrieve table/view list"_L1,
+ QString::number(r) + u':',
hStmt.handle()); hStmt.handle());
return QStringList(); return QStringList();
} }
@ -2401,7 +2415,7 @@ QSqlIndex QODBCDriver::primaryIndex(const QString& tablename) const
SqlStmtHandle hStmt(d->hDbc); SqlStmtHandle hStmt(d->hDbc);
if (!hStmt.isValid()) { if (!hStmt.isValid()) {
qSqlWarning("QODBCDriver::primaryIndex: Unable to list primary key"_L1, d); qSqlWarning("QODBCDriver::primaryIndex: Unable to allocate handle"_L1, d);
return index; return index;
} }
QString catalog, schema, table; QString catalog, schema, table;
@ -2437,7 +2451,8 @@ QSqlIndex QODBCDriver::primaryIndex(const QString& tablename) const
SQL_NULLABLE); SQL_NULLABLE);
if (r != SQL_SUCCESS) { if (r != SQL_SUCCESS) {
qSqlWarning("QODBCDriver::primaryIndex: Unable to execute primary key list"_L1, d); qSqlWarning("QODBCDriver::primaryIndex: Unable to execute primary key list"_L1,
hStmt.handle());
} else { } else {
usingSpecialColumns = true; usingSpecialColumns = true;
} }
@ -2496,7 +2511,7 @@ QSqlRecord QODBCDriver::record(const QString& tablename) const
0); 0);
} }
if (r != SQL_SUCCESS) if (r != SQL_SUCCESS)
qSqlWarning("QODBCDriver::record: Unable to execute column list"_L1, d); qSqlWarning("QODBCDriver::record: Unable to execute column list"_L1, hStmt.handle());
r = d->sqlFetchNext(hStmt); r = d->sqlFetchNext(hStmt);
// Store all fields in a StringList because some drivers can't detail fields in this FETCH loop // Store all fields in a StringList because some drivers can't detail fields in this FETCH loop