From e9c6adb992b4f209e3c206dc68cbd61f3f581716 Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Sat, 27 Apr 2024 20:20:29 +0200 Subject: [PATCH] SQL/IBase: factor out setting numeric values Factor out setting numeric values for better readability. Change-Id: I8980c63e87934e3bc3777897e9cd42aef17caf51 Reviewed-by: Thiago Macieira --- src/plugins/sqldrivers/ibase/qsql_ibase.cpp | 37 ++++++++++----------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp index 9bfaeb2e922..d2dc9f6a811 100644 --- a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp +++ b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp @@ -435,6 +435,16 @@ protected: } return QVariant(val); } + + template + void setWithScale(const QVariant &val, int scale, char *data) + { + auto ptr = reinterpret_cast(data); + if (scale < 0) + *ptr = static_cast(floor(0.5 + val.toDouble() * pow(10.0, scale * -1))); + else + *ptr = val.value(); + } }; class QIBaseResultPrivate: public QSqlCachedResultPrivate @@ -1095,32 +1105,19 @@ bool QIBaseResult::exec() } switch(d->inda->sqlvar[para].sqltype & ~1) { case SQL_INT64: - if (d->inda->sqlvar[para].sqlscale < 0) - *((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(); + setWithScale(val, d->inda->sqlvar[para].sqlscale, d->inda->sqlvar[para].sqldata); break; case SQL_LONG: - if (d->inda->sqlvar[para].sqllen == 4) { - if (d->inda->sqlvar[para].sqlscale < 0) - *((qint32*)d->inda->sqlvar[para].sqldata) = - (qint32)floor(0.5 + val.toDouble() * pow(10.0, d->inda->sqlvar[para].sqlscale * -1)); - else - *((qint32*)d->inda->sqlvar[para].sqldata) = (qint32)val.toInt(); - } else { - *((qint64*)d->inda->sqlvar[para].sqldata) = val.toLongLong(); - } + if (d->inda->sqlvar[para].sqllen == 4) + setWithScale(val, d->inda->sqlvar[para].sqlscale, d->inda->sqlvar[para].sqldata); + else + setWithScale(val, 0, d->inda->sqlvar[para].sqldata); break; case SQL_SHORT: - if (d->inda->sqlvar[para].sqlscale < 0) - *((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(); + setWithScale(val, d->inda->sqlvar[para].sqlscale, d->inda->sqlvar[para].sqldata); break; case SQL_FLOAT: - *((float*)d->inda->sqlvar[para].sqldata) = (float)val.toDouble(); + *((float*)d->inda->sqlvar[para].sqldata) = val.toFloat(); break; case SQL_DOUBLE: *((double*)d->inda->sqlvar[para].sqldata) = val.toDouble();