diff options
author | Christian Ehrlicher <[email protected]> | 2025-06-06 22:10:27 +0200 |
---|---|---|
committer | Christian Ehrlicher <[email protected]> | 2025-06-09 20:33:57 +0200 |
commit | 4896448ffd54178c3e9fa2cba0070ce3a936ed05 (patch) | |
tree | 568a9df3c2289185ec96258acb30da8a11ec68e9 | |
parent | ce101c2c3c04f5ccd46abf7024662d0bc4e5a3a3 (diff) |
SQL/ODBC: misc cleanup
Misc cleanup
- merge qGetIntData and qGetBigIntData
- remove unused braces
- properly initialize values
Pick-to: 6.10
Change-Id: I0867dbbfa611087cd470b821f1f8d7ed74ed0aae
Reviewed-by: Axel Spoerl <[email protected]>
-rw-r--r-- | src/plugins/sqldrivers/odbc/qsql_odbc.cpp | 100 |
1 files changed, 43 insertions, 57 deletions
diff --git a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp index 18289f93b54..2c0cfc61923 100644 --- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp +++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp @@ -337,7 +337,7 @@ static QSqlError qMakeError(const QString &err, return errorFromDiagRecords(err, type, qODBCWarn(p)); } -static QMetaType qDecodeODBCType(SQLSMALLINT sqltype, bool isSigned = true) +static QMetaType qDecodeODBCType(SQLSMALLINT sqltype, bool isSigned) { int type = QMetaType::UnknownType; switch (sqltype) { @@ -520,29 +520,33 @@ static QVariant qGetBinaryData(SQLHANDLE hStmt, int column) return fieldVal; } -static QVariant qGetIntData(SQLHANDLE hStmt, int column, bool isSigned = true) -{ - SQLINTEGER intbuf = 0; +template <typename T> +static QVariant qGetIntData(SQLHANDLE hStmt, int column) +{ + constexpr auto isSigned = std::is_signed<T>(); + constexpr auto is16BitType = sizeof(T) == 2; + constexpr auto is32BitType = sizeof(T) == 4; + constexpr auto is64BitType = sizeof(T) == 8; + constexpr auto tgtType = + is16BitType ? (isSigned ? SQL_C_SSHORT : SQL_C_USHORT) + : is32BitType ? (isSigned ? SQL_C_SLONG : SQL_C_ULONG) + : (isSigned ? SQL_C_SBIGINT : SQL_C_UBIGINT); + static_assert(is16BitType || is32BitType || is64BitType, + "Can only handle 16, 32 or 64 bit integer"); + T intbuf = 0; SQLLEN lengthIndicator = 0; - SQLRETURN r = SQLGetData(hStmt, - column+1, - isSigned ? SQL_C_SLONG : SQL_C_ULONG, - (SQLPOINTER)&intbuf, - sizeof(intbuf), - &lengthIndicator); + SQLRETURN r = SQLGetData(hStmt, column + 1, tgtType, + (SQLPOINTER)&intbuf, sizeof(intbuf), &lengthIndicator); if (!SQL_SUCCEEDED(r)) return QVariant(); if (lengthIndicator == SQL_NULL_DATA) - return QVariant(QMetaType::fromType<int>()); - if (isSigned) - return int(intbuf); - else - return uint(intbuf); + return QVariant(QMetaType::fromType<T>()); + return QVariant::fromValue<T>(intbuf); } static QVariant qGetDoubleData(SQLHANDLE hStmt, int column) { - SQLDOUBLE dblbuf; + SQLDOUBLE dblbuf = 0; SQLLEN lengthIndicator = 0; SQLRETURN r = SQLGetData(hStmt, column+1, @@ -550,37 +554,14 @@ static QVariant qGetDoubleData(SQLHANDLE hStmt, int column) (SQLPOINTER) &dblbuf, 0, &lengthIndicator); - if (!SQL_SUCCEEDED(r)) { + if (!SQL_SUCCEEDED(r)) return QVariant(); - } if (lengthIndicator == SQL_NULL_DATA) return QVariant(QMetaType::fromType<double>()); return (double) dblbuf; } - -static QVariant qGetBigIntData(SQLHANDLE hStmt, int column, bool isSigned = true) -{ - SQLBIGINT lngbuf = 0; - SQLLEN lengthIndicator = 0; - SQLRETURN r = SQLGetData(hStmt, - column+1, - isSigned ? SQL_C_SBIGINT : SQL_C_UBIGINT, - (SQLPOINTER) &lngbuf, - sizeof(lngbuf), - &lengthIndicator); - if (!SQL_SUCCEEDED(r)) - return QVariant(); - if (lengthIndicator == SQL_NULL_DATA) - return QVariant(QMetaType::fromType<qlonglong>()); - - if (isSigned) - return qint64(lngbuf); - else - return quint64(lngbuf); -} - static bool isAutoValue(const SQLHANDLE hStmt, int column) { SQLLEN nNumericAttribute = 0; // Check for auto-increment @@ -599,13 +580,13 @@ static bool isAutoValue(const SQLHANDLE hStmt, int column) static QSqlField qMakeFieldInfo(const SQLHANDLE hStmt, const QODBCDriverPrivate* p) { QString fname = qGetStringData(hStmt, 3, -1, p->unicode).toString(); - int type = qGetIntData(hStmt, 4).toInt(); // column type - QSqlField f(fname, qDecodeODBCType(type, p)); - QVariant var = qGetIntData(hStmt, 6); + int type = qGetIntData<int>(hStmt, 4).toInt(); // column type + QSqlField f(fname, qDecodeODBCType(type, true)); // signed, we don't know better here + QVariant var = qGetIntData<int>(hStmt, 6); f.setLength(var.isNull() ? -1 : var.toInt()); // column size - var = qGetIntData(hStmt, 8).toInt(); + var = qGetIntData<int>(hStmt, 8).toInt(); f.setPrecision(var.isNull() ? -1 : var.toInt()); // precision - int required = qGetIntData(hStmt, 10).toInt(); // nullable-flag + int required = qGetIntData<int>(hStmt, 10).toInt(); // nullable-flag // required can be SQL_NO_NULLS, SQL_NULLABLE or SQL_NULLABLE_UNKNOWN if (required == SQL_NO_NULLS) f.setRequired(true); @@ -996,9 +977,8 @@ bool QODBCResult::reset (const QString& query) SQLNumResultCols(d->hStmt, &count); if (count) { setSelect(true); - for (SQLSMALLINT i = 0; i < count; ++i) { + for (SQLSMALLINT i = 0; i < count; ++i) d->rInf.append(qMakeFieldInfo(d, i)); - } d->fieldCache.resize(count); } else { setSelect(false); @@ -1171,18 +1151,22 @@ QVariant QODBCResult::data(int field) const QSqlField info = d->rInf.field(i); switch (info.metaType().id()) { case QMetaType::LongLong: - d->fieldCache[i] = qGetBigIntData(d->hStmt, i); - break; - case QMetaType::ULongLong: - d->fieldCache[i] = qGetBigIntData(d->hStmt, i, false); + d->fieldCache[i] = qGetIntData<int64_t>(d->hStmt, i); break; case QMetaType::Int: + d->fieldCache[i] = qGetIntData<int32_t>(d->hStmt, i); + break; case QMetaType::Short: - d->fieldCache[i] = qGetIntData(d->hStmt, i); + d->fieldCache[i] = qGetIntData<int16_t>(d->hStmt, i); + break; + case QMetaType::ULongLong: + d->fieldCache[i] = qGetIntData<uint64_t>(d->hStmt, i); break; case QMetaType::UInt: + d->fieldCache[i] = qGetIntData<uint32_t>(d->hStmt, i); + break; case QMetaType::UShort: - d->fieldCache[i] = qGetIntData(d->hStmt, i, false); + d->fieldCache[i] = qGetIntData<uint16_t>(d->hStmt, i); break; case QMetaType::QDate: DATE_STRUCT dbuf; @@ -1233,10 +1217,10 @@ QVariant QODBCResult::data(int field) case QMetaType::Double: switch(numericalPrecisionPolicy()) { case QSql::LowPrecisionInt32: - d->fieldCache[i] = qGetIntData(d->hStmt, i); + d->fieldCache[i] = qGetIntData<int32_t>(d->hStmt, i); break; case QSql::LowPrecisionInt64: - d->fieldCache[i] = qGetBigIntData(d->hStmt, i); + d->fieldCache[i] = qGetIntData<int64_t>(d->hStmt, i); break; case QSql::LowPrecisionDouble: d->fieldCache[i] = qGetDoubleData(d->hStmt, i); @@ -1294,6 +1278,9 @@ bool QODBCResult::prepare(const QString& query) SQLRETURN r; d->rInf.clear(); + d->fieldCache.clear(); + d->fieldCacheIdx = 0; + if (d->hStmt && d->isStmtHandleValid()) { r = SQLFreeHandle(SQL_HANDLE_STMT, d->hStmt); if (r != SQL_SUCCESS) { @@ -1670,9 +1657,8 @@ bool QODBCResult::exec() SQLNumResultCols(d->hStmt, &count); if (count) { setSelect(true); - for (SQLSMALLINT i = 0; i < count; ++i) { + for (SQLSMALLINT i = 0; i < count; ++i) d->rInf.append(qMakeFieldInfo(d, i)); - } d->fieldCache.resize(count); } else { setSelect(false); |