summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Ehrlicher <[email protected]>2025-06-06 22:10:27 +0200
committerChristian Ehrlicher <[email protected]>2025-06-09 20:33:57 +0200
commit4896448ffd54178c3e9fa2cba0070ce3a936ed05 (patch)
tree568a9df3c2289185ec96258acb30da8a11ec68e9
parentce101c2c3c04f5ccd46abf7024662d0bc4e5a3a3 (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.cpp100
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);