SQL/ODBC: misc cleanup
Misc cleanup - merge qGetIntData and qGetBigIntData - remove unused braces - properly initialize values Change-Id: I0867dbbfa611087cd470b821f1f8d7ed74ed0aae Reviewed-by: Axel Spoerl <axel.spoerl@qt.io> (cherry picked from commit 4896448ffd54178c3e9fa2cba0070ce3a936ed05) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
d7b80c9c9b
commit
e1d874a71b
@ -343,7 +343,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) {
|
||||
@ -526,29 +526,33 @@ static QVariant qGetBinaryData(SQLHANDLE hStmt, int column)
|
||||
return fieldVal;
|
||||
}
|
||||
|
||||
static QVariant qGetIntData(SQLHANDLE hStmt, int column, bool isSigned = true)
|
||||
template <typename T>
|
||||
static QVariant qGetIntData(SQLHANDLE hStmt, int column)
|
||||
{
|
||||
SQLINTEGER intbuf = 0;
|
||||
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,
|
||||
@ -556,37 +560,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
|
||||
@ -605,13 +586,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);
|
||||
@ -1002,9 +983,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);
|
||||
@ -1177,18 +1157,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;
|
||||
@ -1239,10 +1223,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);
|
||||
@ -1300,6 +1284,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) {
|
||||
@ -1676,9 +1663,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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user