SQL/IBase: factor out setting numeric values

Factor out setting numeric values for better readability.

Change-Id: I8980c63e87934e3bc3777897e9cd42aef17caf51
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Christian Ehrlicher 2024-04-27 20:20:29 +02:00
parent 9d693dbfb1
commit e9c6adb992

View File

@ -435,6 +435,16 @@ protected:
} }
return QVariant(val); return QVariant(val);
} }
template<typename T>
void setWithScale(const QVariant &val, int scale, char *data)
{
auto ptr = reinterpret_cast<T *>(data);
if (scale < 0)
*ptr = static_cast<T>(floor(0.5 + val.toDouble() * pow(10.0, scale * -1)));
else
*ptr = val.value<T>();
}
}; };
class QIBaseResultPrivate: public QSqlCachedResultPrivate class QIBaseResultPrivate: public QSqlCachedResultPrivate
@ -1095,32 +1105,19 @@ bool QIBaseResult::exec()
} }
switch(d->inda->sqlvar[para].sqltype & ~1) { switch(d->inda->sqlvar[para].sqltype & ~1) {
case SQL_INT64: case SQL_INT64:
if (d->inda->sqlvar[para].sqlscale < 0) setWithScale<qint64>(val, d->inda->sqlvar[para].sqlscale, d->inda->sqlvar[para].sqldata);
*((qint64*)d->inda->sqlvar[para].sqldata) =
(qint64)floor(0.5 + val.toDouble() * pow(10.0, d->inda->sqlvar[para].sqlscale * -1));
else
*((qint64*)d->inda->sqlvar[para].sqldata) = val.toLongLong();
break; break;
case SQL_LONG: case SQL_LONG:
if (d->inda->sqlvar[para].sqllen == 4) { if (d->inda->sqlvar[para].sqllen == 4)
if (d->inda->sqlvar[para].sqlscale < 0) setWithScale<qint32>(val, d->inda->sqlvar[para].sqlscale, d->inda->sqlvar[para].sqldata);
*((qint32*)d->inda->sqlvar[para].sqldata) =
(qint32)floor(0.5 + val.toDouble() * pow(10.0, d->inda->sqlvar[para].sqlscale * -1));
else else
*((qint32*)d->inda->sqlvar[para].sqldata) = (qint32)val.toInt(); setWithScale<qint64>(val, 0, d->inda->sqlvar[para].sqldata);
} else {
*((qint64*)d->inda->sqlvar[para].sqldata) = val.toLongLong();
}
break; break;
case SQL_SHORT: case SQL_SHORT:
if (d->inda->sqlvar[para].sqlscale < 0) setWithScale<qint16>(val, d->inda->sqlvar[para].sqlscale, d->inda->sqlvar[para].sqldata);
*((short*)d->inda->sqlvar[para].sqldata) =
(short)floor(0.5 + val.toDouble() * pow(10.0, d->inda->sqlvar[para].sqlscale * -1));
else
*((short*)d->inda->sqlvar[para].sqldata) = (short)val.toInt();
break; break;
case SQL_FLOAT: case SQL_FLOAT:
*((float*)d->inda->sqlvar[para].sqldata) = (float)val.toDouble(); *((float*)d->inda->sqlvar[para].sqldata) = val.toFloat();
break; break;
case SQL_DOUBLE: case SQL_DOUBLE:
*((double*)d->inda->sqlvar[para].sqldata) = val.toDouble(); *((double*)d->inda->sqlvar[para].sqldata) = val.toDouble();