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));
|
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;
|
int type = QMetaType::UnknownType;
|
||||||
switch (sqltype) {
|
switch (sqltype) {
|
||||||
@ -526,29 +526,33 @@ static QVariant qGetBinaryData(SQLHANDLE hStmt, int column)
|
|||||||
return fieldVal;
|
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;
|
SQLLEN lengthIndicator = 0;
|
||||||
SQLRETURN r = SQLGetData(hStmt,
|
SQLRETURN r = SQLGetData(hStmt, column + 1, tgtType,
|
||||||
column+1,
|
(SQLPOINTER)&intbuf, sizeof(intbuf), &lengthIndicator);
|
||||||
isSigned ? SQL_C_SLONG : SQL_C_ULONG,
|
|
||||||
(SQLPOINTER)&intbuf,
|
|
||||||
sizeof(intbuf),
|
|
||||||
&lengthIndicator);
|
|
||||||
if (!SQL_SUCCEEDED(r))
|
if (!SQL_SUCCEEDED(r))
|
||||||
return QVariant();
|
return QVariant();
|
||||||
if (lengthIndicator == SQL_NULL_DATA)
|
if (lengthIndicator == SQL_NULL_DATA)
|
||||||
return QVariant(QMetaType::fromType<int>());
|
return QVariant(QMetaType::fromType<T>());
|
||||||
if (isSigned)
|
return QVariant::fromValue<T>(intbuf);
|
||||||
return int(intbuf);
|
|
||||||
else
|
|
||||||
return uint(intbuf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static QVariant qGetDoubleData(SQLHANDLE hStmt, int column)
|
static QVariant qGetDoubleData(SQLHANDLE hStmt, int column)
|
||||||
{
|
{
|
||||||
SQLDOUBLE dblbuf;
|
SQLDOUBLE dblbuf = 0;
|
||||||
SQLLEN lengthIndicator = 0;
|
SQLLEN lengthIndicator = 0;
|
||||||
SQLRETURN r = SQLGetData(hStmt,
|
SQLRETURN r = SQLGetData(hStmt,
|
||||||
column+1,
|
column+1,
|
||||||
@ -556,37 +560,14 @@ static QVariant qGetDoubleData(SQLHANDLE hStmt, int column)
|
|||||||
(SQLPOINTER) &dblbuf,
|
(SQLPOINTER) &dblbuf,
|
||||||
0,
|
0,
|
||||||
&lengthIndicator);
|
&lengthIndicator);
|
||||||
if (!SQL_SUCCEEDED(r)) {
|
if (!SQL_SUCCEEDED(r))
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
|
||||||
if (lengthIndicator == SQL_NULL_DATA)
|
if (lengthIndicator == SQL_NULL_DATA)
|
||||||
return QVariant(QMetaType::fromType<double>());
|
return QVariant(QMetaType::fromType<double>());
|
||||||
|
|
||||||
return (double) dblbuf;
|
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)
|
static bool isAutoValue(const SQLHANDLE hStmt, int column)
|
||||||
{
|
{
|
||||||
SQLLEN nNumericAttribute = 0; // Check for auto-increment
|
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)
|
static QSqlField qMakeFieldInfo(const SQLHANDLE hStmt, const QODBCDriverPrivate* p)
|
||||||
{
|
{
|
||||||
QString fname = qGetStringData(hStmt, 3, -1, p->unicode).toString();
|
QString fname = qGetStringData(hStmt, 3, -1, p->unicode).toString();
|
||||||
int type = qGetIntData(hStmt, 4).toInt(); // column type
|
int type = qGetIntData<int>(hStmt, 4).toInt(); // column type
|
||||||
QSqlField f(fname, qDecodeODBCType(type, p));
|
QSqlField f(fname, qDecodeODBCType(type, true)); // signed, we don't know better here
|
||||||
QVariant var = qGetIntData(hStmt, 6);
|
QVariant var = qGetIntData<int>(hStmt, 6);
|
||||||
f.setLength(var.isNull() ? -1 : var.toInt()); // column size
|
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
|
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
|
// required can be SQL_NO_NULLS, SQL_NULLABLE or SQL_NULLABLE_UNKNOWN
|
||||||
if (required == SQL_NO_NULLS)
|
if (required == SQL_NO_NULLS)
|
||||||
f.setRequired(true);
|
f.setRequired(true);
|
||||||
@ -1002,9 +983,8 @@ bool QODBCResult::reset (const QString& query)
|
|||||||
SQLNumResultCols(d->hStmt, &count);
|
SQLNumResultCols(d->hStmt, &count);
|
||||||
if (count) {
|
if (count) {
|
||||||
setSelect(true);
|
setSelect(true);
|
||||||
for (SQLSMALLINT i = 0; i < count; ++i) {
|
for (SQLSMALLINT i = 0; i < count; ++i)
|
||||||
d->rInf.append(qMakeFieldInfo(d, i));
|
d->rInf.append(qMakeFieldInfo(d, i));
|
||||||
}
|
|
||||||
d->fieldCache.resize(count);
|
d->fieldCache.resize(count);
|
||||||
} else {
|
} else {
|
||||||
setSelect(false);
|
setSelect(false);
|
||||||
@ -1177,18 +1157,22 @@ QVariant QODBCResult::data(int field)
|
|||||||
const QSqlField info = d->rInf.field(i);
|
const QSqlField info = d->rInf.field(i);
|
||||||
switch (info.metaType().id()) {
|
switch (info.metaType().id()) {
|
||||||
case QMetaType::LongLong:
|
case QMetaType::LongLong:
|
||||||
d->fieldCache[i] = qGetBigIntData(d->hStmt, i);
|
d->fieldCache[i] = qGetIntData<int64_t>(d->hStmt, i);
|
||||||
break;
|
|
||||||
case QMetaType::ULongLong:
|
|
||||||
d->fieldCache[i] = qGetBigIntData(d->hStmt, i, false);
|
|
||||||
break;
|
break;
|
||||||
case QMetaType::Int:
|
case QMetaType::Int:
|
||||||
|
d->fieldCache[i] = qGetIntData<int32_t>(d->hStmt, i);
|
||||||
|
break;
|
||||||
case QMetaType::Short:
|
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;
|
break;
|
||||||
case QMetaType::UInt:
|
case QMetaType::UInt:
|
||||||
|
d->fieldCache[i] = qGetIntData<uint32_t>(d->hStmt, i);
|
||||||
|
break;
|
||||||
case QMetaType::UShort:
|
case QMetaType::UShort:
|
||||||
d->fieldCache[i] = qGetIntData(d->hStmt, i, false);
|
d->fieldCache[i] = qGetIntData<uint16_t>(d->hStmt, i);
|
||||||
break;
|
break;
|
||||||
case QMetaType::QDate:
|
case QMetaType::QDate:
|
||||||
DATE_STRUCT dbuf;
|
DATE_STRUCT dbuf;
|
||||||
@ -1239,10 +1223,10 @@ QVariant QODBCResult::data(int field)
|
|||||||
case QMetaType::Double:
|
case QMetaType::Double:
|
||||||
switch(numericalPrecisionPolicy()) {
|
switch(numericalPrecisionPolicy()) {
|
||||||
case QSql::LowPrecisionInt32:
|
case QSql::LowPrecisionInt32:
|
||||||
d->fieldCache[i] = qGetIntData(d->hStmt, i);
|
d->fieldCache[i] = qGetIntData<int32_t>(d->hStmt, i);
|
||||||
break;
|
break;
|
||||||
case QSql::LowPrecisionInt64:
|
case QSql::LowPrecisionInt64:
|
||||||
d->fieldCache[i] = qGetBigIntData(d->hStmt, i);
|
d->fieldCache[i] = qGetIntData<int64_t>(d->hStmt, i);
|
||||||
break;
|
break;
|
||||||
case QSql::LowPrecisionDouble:
|
case QSql::LowPrecisionDouble:
|
||||||
d->fieldCache[i] = qGetDoubleData(d->hStmt, i);
|
d->fieldCache[i] = qGetDoubleData(d->hStmt, i);
|
||||||
@ -1300,6 +1284,9 @@ bool QODBCResult::prepare(const QString& query)
|
|||||||
SQLRETURN r;
|
SQLRETURN r;
|
||||||
|
|
||||||
d->rInf.clear();
|
d->rInf.clear();
|
||||||
|
d->fieldCache.clear();
|
||||||
|
d->fieldCacheIdx = 0;
|
||||||
|
|
||||||
if (d->hStmt && d->isStmtHandleValid()) {
|
if (d->hStmt && d->isStmtHandleValid()) {
|
||||||
r = SQLFreeHandle(SQL_HANDLE_STMT, d->hStmt);
|
r = SQLFreeHandle(SQL_HANDLE_STMT, d->hStmt);
|
||||||
if (r != SQL_SUCCESS) {
|
if (r != SQL_SUCCESS) {
|
||||||
@ -1676,9 +1663,8 @@ bool QODBCResult::exec()
|
|||||||
SQLNumResultCols(d->hStmt, &count);
|
SQLNumResultCols(d->hStmt, &count);
|
||||||
if (count) {
|
if (count) {
|
||||||
setSelect(true);
|
setSelect(true);
|
||||||
for (SQLSMALLINT i = 0; i < count; ++i) {
|
for (SQLSMALLINT i = 0; i < count; ++i)
|
||||||
d->rInf.append(qMakeFieldInfo(d, i));
|
d->rInf.append(qMakeFieldInfo(d, i));
|
||||||
}
|
|
||||||
d->fieldCache.resize(count);
|
d->fieldCache.resize(count);
|
||||||
} else {
|
} else {
|
||||||
setSelect(false);
|
setSelect(false);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user