604 Q_D(QMimerSQLResult);
607 if (d->callWithOut) {
608 if (i >= MimerParameterCount(d->statementhandle)) {
609 setLastError(qMakeError(
610 QCoreApplication::translate(
"QMimerSQLResult:",
"Column %1 out of range")
612 genericError, QSqlError::StatementError,
nullptr));
615 mType = MimerParameterType(d->statementhandle,
static_cast<std::int16_t>(i + 1));
617 if (i >= MimerColumnCount(d->statementhandle)) {
618 setLastError(qMakeError(
619 QCoreApplication::translate(
"QMimerSQLResult:",
"Column %1 out of range")
621 genericError, QSqlError::StatementError,
nullptr));
624 mType = MimerColumnType(d->statementhandle,
static_cast<std::int16_t>(i + 1));
626 const QMetaType::Type type = qDecodeMSQLType(mType);
628 err = MimerIsNull(d->statementhandle,
static_cast<std::int16_t>(i + 1));
630 return QVariant(QMetaType(type),
nullptr);
632 switch (mimDataType) {
635 err = MimerGetString(d->statementhandle,
static_cast<std::int16_t>(i + 1), dateString_w,
636 sizeof(dateString_w) /
sizeof(dateString_w[0]));
637 if (!MIMER_SUCCEEDED(err)) {
638 setLastError(qMakeError(msgCouldNotGet(
"date", i),
639 err, QSqlError::StatementError, d->drv_d_func()));
640 return QVariant(QMetaType(type),
nullptr);
642 return QDate::fromString(QString::fromWCharArray(dateString_w),
"yyyy-MM-dd"_L1);
646 err = MimerGetString(d->statementhandle,
static_cast<std::int16_t>(i + 1), timeString_w,
647 sizeof(timeString_w) /
sizeof(timeString_w[0]));
648 if (!MIMER_SUCCEEDED(err)) {
649 setLastError(qMakeError(msgCouldNotGet(
"time", i),
650 err, QSqlError::StatementError, d->drv_d_func()));
651 return QVariant(QMetaType(type),
nullptr);
653 QString timeString = QString::fromWCharArray(timeString_w);
654 QString timeFormatString =
"HH:mm:ss"_L1;
655 if (timeString.size() > 8) {
656 timeFormatString.append(
".zzz"_L1);
657 timeString = timeString.left(12);
659 return QTime::fromString(timeString, timeFormatString);
663 err = MimerGetString(d->statementhandle,
static_cast<std::int16_t>(i + 1),
665 sizeof(dateTimeString_w) /
sizeof(dateTimeString_w[0]));
666 if (!MIMER_SUCCEEDED(err)) {
668 qMakeError(msgCouldNotGet(
"date time", i),
669 err, QSqlError::StatementError, d->drv_d_func()));
670 return QVariant(QMetaType(type),
nullptr);
672 QString dateTimeString = QString::fromWCharArray(dateTimeString_w);
673 QString dateTimeFormatString =
"yyyy-MM-dd HH:mm:ss"_L1;
674 if (dateTimeString.size() > 19) {
675 dateTimeFormatString.append(
".zzz"_L1);
676 dateTimeString = dateTimeString.left(23);
678 return QDateTime::fromString(dateTimeString, dateTimeFormatString);
682 err = MimerGetInt32(d->statementhandle,
static_cast<std::int16_t>(i + 1), &resInt);
683 if (!MIMER_SUCCEEDED(err)) {
684 setLastError(qMakeError(msgCouldNotGet(
"int32", i),
685 err, QSqlError::StatementError, d->drv_d_func()));
686 return QVariant(QMetaType(type),
nullptr);
692 err = MimerGetInt64(d->statementhandle,
static_cast<std::int16_t>(i + 1), &resLongLong);
693 if (!MIMER_SUCCEEDED(err)) {
694 setLastError(qMakeError(msgCouldNotGet(
"int64", i),
695 err, QSqlError::StatementError, d->drv_d_func()));
696 return QVariant(QMetaType(type),
nullptr);
698 return (qlonglong)resLongLong;
701 err = MimerGetBoolean(d->statementhandle,
static_cast<std::int16_t>(i + 1));
702 if (!MIMER_SUCCEEDED(err)) {
704 qMakeError(msgCouldNotGet(
"boolean", i),
705 err, QSqlError::StatementError, d->drv_d_func()));
706 return QVariant(QMetaType(type),
nullptr);
712 err = MimerGetFloat(d->statementhandle,
static_cast<std::int16_t>(i + 1), &resFloat);
713 if (!MIMER_SUCCEEDED(err)) {
714 setLastError(qMakeError(msgCouldNotGet(
"float", i),
715 err, QSqlError::StatementError, d->drv_d_func()));
716 return QVariant(QMetaType(type),
nullptr);
722 err = MimerGetDouble(d->statementhandle,
static_cast<std::int16_t>(i + 1), &resDouble);
723 if (!MIMER_SUCCEEDED(err)) {
725 qMakeError(msgCouldNotGet(
"double", i),
726 err, QSqlError::StatementError, d->drv_d_func()));
727 return QVariant(QMetaType(type),
nullptr);
729 switch (numericalPrecisionPolicy()) {
730 case QSql::LowPrecisionInt32:
731 return static_cast<
std::int32_t>(resDouble);
732 case QSql::LowPrecisionInt64:
733 return static_cast<qint64>(resDouble);
734 case QSql::LowPrecisionDouble:
735 return static_cast<qreal>(resDouble);
736 case QSql::HighPrecision:
737 return QString::number(resDouble,
'g', 17);
739 return QVariant(QMetaType(type),
nullptr);
744 err = MimerGetBinary(d->statementhandle,
static_cast<std::int16_t>(i + 1), NULL, 0);
745 if (MIMER_SUCCEEDED(err)) {
746 byteArray.resize(err);
747 err = MimerGetBinary(d->statementhandle,
static_cast<std::int16_t>(i + 1),
748 byteArray.data(), err);
750 if (!MIMER_SUCCEEDED(err)) {
752 qMakeError(msgCouldNotGet(
"binary", i),
753 err, QSqlError::StatementError, d->drv_d_func()));
754 return QVariant(QMetaType(type),
nullptr);
761 err = MimerGetLob(d->statementhandle,
static_cast<std::int16_t>(i + 1), &size,
763 if (MIMER_SUCCEEDED(err)) {
765 QVarLengthArray<
char> blobchar(lobChunkMaxSizeFetch);
766 byteArray.reserve(
size);
767 size_t left_to_return = size;
768 while (left_to_return > 0) {
769 const size_t bytesToReceive =
770 left_to_return <= maxSize ? left_to_return : maxSize;
771 err = MimerGetBlobData(&d->lobhandle, blobchar.data(), bytesToReceive);
772 byteArray.append(QByteArray::fromRawData(blobchar.data(), bytesToReceive));
773 left_to_return -= bytesToReceive;
774 if (!MIMER_SUCCEEDED(err)) {
775 setLastError(qMakeError(msgCouldNotGet(
"BLOB", i),
776 err, QSqlError::StatementError, d->drv_d_func()));
777 return QVariant(QMetaType(type),
nullptr);
781 setLastError(qMakeError(msgCouldNotGet(
"BLOB", i),
782 err, QSqlError::StatementError, d->drv_d_func()));
783 return QVariant(QMetaType(type),
nullptr);
791 err = MimerGetString(d->statementhandle,
static_cast<std::int16_t>(i + 1), resString_w,
793 if (MIMER_SUCCEEDED(err)) {
797 err = MimerGetString(d->statementhandle,
static_cast<std::int16_t>(i + 1),
798 resString_w, maxStackStringSize + 1);
799 if (MIMER_SUCCEEDED(err))
800 return QString::fromWCharArray(resString_w);
802 QVarLengthArray<
wchar_t> largeResString_w(size + 1);
803 err = MimerGetString(d->statementhandle,
static_cast<std::int16_t>(i + 1),
804 largeResString_w.data(), size + 1);
805 if (MIMER_SUCCEEDED(err))
806 return QString::fromWCharArray(largeResString_w.data());
809 setLastError(qMakeError(msgCouldNotGet(
810 mimDataType == MimerColumnTypes::Numeric ?
"numeric" :
"string", i),
811 err, QSqlError::StatementError, d->drv_d_func()));
812 return QVariant(QMetaType(type),
nullptr);
816 err = MimerGetLob(d->statementhandle,
static_cast<std::int16_t>(i + 1), &size,
818 if (MIMER_SUCCEEDED(err)) {
820 QVarLengthArray<
wchar_t> clobstring_w(lobChunkMaxSizeFetch + 1);
822 size_t left_to_return = size;
823 QString returnString;
824 while (left_to_return > 0) {
825 const size_t bytesToReceive =
826 left_to_return <= maxSize ? left_to_return : maxSize;
827 err = MimerGetNclobData(&d->lobhandle, clobstring_w.data(), bytesToReceive + 1);
828 returnString.append(QString::fromWCharArray(clobstring_w.data()));
829 left_to_return -= bytesToReceive;
830 if (!MIMER_SUCCEEDED(err)) {
831 setLastError(qMakeError(msgCouldNotGet(
"CLOB", i),
832 err, QSqlError::StatementError, d->drv_d_func()));
833 return QVariant(QMetaType(type),
nullptr);
838 setLastError(qMakeError(msgCouldNotGet(
"CLOB", i),
839 err, QSqlError::StatementError, d->drv_d_func()));
840 return QVariant(QMetaType(type),
nullptr);
843 unsigned char uuidChar[16];
844 err = MimerGetUUID(d->statementhandle,
static_cast<std::int16_t>(i + 1), uuidChar);
845 if (!MIMER_SUCCEEDED(err)) {
846 setLastError(qMakeError(msgCouldNotGet(
"UUID", i),
847 err, QSqlError::StatementError, d->drv_d_func()));
848 return QVariant(QMetaType(type),
nullptr);
850 const auto uuidByteArray = QByteArrayView(
reinterpret_cast<
char *>(uuidChar), 16);
851 return QUuid::fromRfc4122(uuidByteArray);
855 setLastError(qMakeError(
856 QCoreApplication::translate(
"QMimerSQLResult",
"Unknown data type %1").arg(i),
857 genericError, QSqlError::StatementError,
nullptr));
859 return QVariant(QMetaType(type),
nullptr);
970 Q_D(QMimerSQLResult);
974 if (!d->preparedQuery)
975 return QSqlResult::exec();
976 if (d->executedStatement) {
977 d->executedStatement =
false;
981 setAt(QSql::BeforeFirstRow);
982 err = MimerCloseCursor(d->statementhandle);
983 d->openCursor =
false;
986 QVector<QVariant> &values = boundValues();
988 values = d->batch_vector;
989 int mimParamCount = MimerParameterCount(d->statementhandle);
990 if (!MIMER_SUCCEEDED(mimParamCount))
992 if (mimParamCount != values.size()) {
993 setLastError(qMakeError(
994 QCoreApplication::translate(
"QMimerSQLResult",
"Wrong number of parameters"),
995 genericError, QSqlError::StatementError,
nullptr));
998 for (
int i = 0; i < mimParamCount; i++) {
999 if (bindValueType(i) == QSql::Out) {
1000 d->callWithOut =
true;
1003 const QVariant &val = values.at(i);
1004 if (QSqlResultPrivate::isVariantNull(val) || val.isNull() || val.toString().isNull()) {
1005 err = MimerSetNull(d->statementhandle, i + 1);
1006 if (!MIMER_SUCCEEDED(err)) {
1008 qMakeError(msgCouldNotSet(
"null", i),
1009 err, QSqlError::StatementError, d->drv_d_func()));
1015 const int mimParamType = MimerParameterType(d->statementhandle, i + 1);
1017 switch (mimDataType) {
1020 err = MimerSetInt32(d->statementhandle, i + 1, val.toInt(&convertOk));
1021 if (!convertOk || !MIMER_SUCCEEDED(err)) {
1023 qMakeError(msgCouldNotSet(
"int32", i),
1024 convertOk ? err : genericError, QSqlError::StatementError,
1025 convertOk ? d->drv_d_func() :
nullptr));
1032 err = MimerSetInt64(d->statementhandle, i + 1, val.toLongLong(&convertOk));
1033 if (!convertOk || !MIMER_SUCCEEDED(err)) {
1035 qMakeError(msgCouldNotSet(
"int64", i),
1036 convertOk ? err : genericError, QSqlError::StatementError,
1037 convertOk ? d->drv_d_func() :
nullptr));
1044 err = MimerSetFloat(d->statementhandle, i + 1, val.toFloat(&convertOk));
1045 if (!convertOk || !MIMER_SUCCEEDED(err)) {
1047 qMakeError(msgCouldNotSet(
"float", i),
1048 convertOk ? err : genericError, QSqlError::StatementError,
1049 convertOk ? d->drv_d_func() :
nullptr));
1056 err = MimerSetDouble(d->statementhandle, i + 1, val.toDouble(&convertOk));
1057 if (!convertOk || !MIMER_SUCCEEDED(err)) {
1059 qMakeError(msgCouldNotSet(
"double", i),
1060 convertOk ? err : genericError, QSqlError::StatementError,
1061 convertOk ? d->drv_d_func() :
nullptr));
1068 size_t
size =
static_cast<
std::size_t>(binArr.size());
1069 err = MimerSetBinary(d->statementhandle, i + 1, binArr.data(), size);
1070 if (!MIMER_SUCCEEDED(err)) {
1072 qMakeError(msgCouldNotSet(
"binary", i),
1073 err, QSqlError::StatementError, d->drv_d_func()));
1079 err = MimerSetBoolean(d->statementhandle, i + 1, val.toBool() ==
true ? 1 : 0);
1080 if (!MIMER_SUCCEEDED(err)) {
1082 qMakeError(msgCouldNotSet(
"boolean", i),
1083 err, QSqlError::StatementError, d->drv_d_func()));
1089 const QByteArray uuidArray = val.toUuid().toRfc4122();
1090 const unsigned char *uuid =
1091 reinterpret_cast<
const unsigned char *>(uuidArray.constData());
1092 err = MimerSetUUID(d->statementhandle, i + 1, uuid);
1093 if (!MIMER_SUCCEEDED(err)) {
1095 qMakeError(msgCouldNotSet(
"UUID", i),
1096 err, QSqlError::StatementError, d->drv_d_func()));
1103 QByteArray string_b = val.toString().trimmed().toUtf8();
1104 const char *string_u = string_b.constData();
1105 err = MimerSetString8(d->statementhandle, i + 1, string_u);
1106 if (!MIMER_SUCCEEDED(err)) {
1108 qMakeError(msgCouldNotSet(
1109 mimDataType == MimerColumnTypes::Numeric ?
"numeric" :
"string", i),
1110 err, QSqlError::StatementError, d->drv_d_func()));
1116 err = MimerSetString8(d->statementhandle, i + 1, val.toString().toUtf8().constData());
1117 if (!MIMER_SUCCEEDED(err)) {
1119 qMakeError(msgCouldNotSet(
"date", i),
1120 err, QSqlError::StatementError, d->drv_d_func()));
1126 QString timeFormatString =
"hh:mm:ss"_L1;
1127 const QTime timeVal = val.toTime();
1128 if (timeVal.msec() > 0)
1129 timeFormatString.append(
".zzz"_L1);
1130 err = MimerSetString8(d->statementhandle, i + 1,
1131 timeVal.toString(timeFormatString).toUtf8().constData());
1132 if (!MIMER_SUCCEEDED(err)) {
1134 qMakeError(msgCouldNotSet(
"time", i),
1135 err, QSqlError::StatementError, d->drv_d_func()));
1141 QString dateTimeFormatString =
"yyyy-MM-dd hh:mm:ss"_L1;
1142 const QDateTime dateTimeVal = val.toDateTime();
1143 if (dateTimeVal.time().msec() > 0)
1144 dateTimeFormatString.append(
".zzz"_L1);
1145 err = MimerSetString8(
1146 d->statementhandle, i + 1,
1147 val.toDateTime().toString(dateTimeFormatString).toUtf8().constData());
1148 if (!MIMER_SUCCEEDED(err)) {
1149 setLastError(qMakeError(msgCouldNotSet(
"datetime", i),
1150 err, QSqlError::StatementError, d->drv_d_func()));
1156 const QByteArray blobArr = val.toByteArray();
1157 const char *blobData = blobArr.constData();
1158 qsizetype size = blobArr.size();
1159 err = MimerSetLob(d->statementhandle, i + 1, size, &d->lobhandle);
1160 if (MIMER_SUCCEEDED(err)) {
1162 if (size > maxSize) {
1163 qsizetype left_to_send = size;
1164 for (qsizetype k = 0; left_to_send > 0; k++) {
1165 if (left_to_send <= maxSize) {
1166 err = MimerSetBlobData(&d->lobhandle, &blobData[k * maxSize],
1170 err = MimerSetBlobData(&d->lobhandle, &blobData[k * maxSize], maxSize);
1171 left_to_send = left_to_send - maxSize;
1174 if (!MIMER_SUCCEEDED(err)) {
1176 qMakeError(msgCouldNotSet(
"BLOB byte array", i),
1177 err, QSqlError::StatementError, d->drv_d_func()));
1181 err = MimerSetBlobData(&d->lobhandle, blobArr, size);
1184 if (!MIMER_SUCCEEDED(err)) {
1185 setLastError(qMakeError(msgCouldNotSet(
"BLOB byte array", i),
1186 err, QSqlError::StatementError, d->drv_d_func()));
1192 QByteArray string_b = val.toString().trimmed().toUtf8();
1193 const char *string_u = string_b.constData();
1196 while (string_u[size++])
1197 if ((string_u[size] & 0xc0) != 0x80)
1199 err = MimerSetLob(d->statementhandle, i + 1, size_c, &d->lobhandle);
1200 if (MIMER_SUCCEEDED(err)) {
1202 if (
size > maxSize) {
1203 size_t left_to_send = size;
1206 while (left_to_send > 0 && step_back < maxSize) {
1208 if (left_to_send <= maxSize) {
1209 err = MimerSetNclobData8(&d->lobhandle, &string_u[pos], left_to_send);
1213 while (pos + maxSize - step_back > 0
1214 && (string_u[pos + maxSize - step_back] & 0xc0) == 0x80)
1216 err = MimerSetNclobData8(&d->lobhandle, &string_u[pos],
1217 maxSize - step_back);
1218 left_to_send = left_to_send - maxSize + step_back;
1219 pos += maxSize - step_back;
1221 if (!MIMER_SUCCEEDED(err)) {
1222 setLastError(qMakeError(msgCouldNotSet(
"CLOB", i),
1223 err, QSqlError::StatementError, d->drv_d_func()));
1228 err = MimerSetNclobData8(&d->lobhandle, string_u, size);
1231 if (!MIMER_SUCCEEDED(err)) {
1233 qMakeError(msgCouldNotSet(
"CLOB", i),
1234 err, QSqlError::StatementError, d->drv_d_func()));
1241 setLastError(qMakeError(
1242 QCoreApplication::translate(
"QMimerSQLResult",
"Unknown datatype, parameter %1")
1244 genericError, QSqlError::StatementError,
nullptr));
1250 err = MimerExecute(d->statementhandle);
1251 if (MIMER_SUCCEEDED(err)) {
1252 d->rowsAffected = err;
1254 for (qsizetype i = 0; i < values.size(); i++) {
1255 if (bindValueType(i) == QSql::Out || bindValueType(i) == QSql::InOut) {
1256 bindValue(i, data(k), QSql::In);
1260 d->callWithOut =
false;
1263 if (MIMER_SEQUENCE_ERROR == err) {
1264 err = MimerOpenCursor(d->statementhandle);
1265 d->rowsAffected = err;
1266 d->openCursor =
true;
1267 d->currentRow = QSql::BeforeFirstRow;
1270 if (!MIMER_SUCCEEDED(err)) {
1272 qMakeError(QCoreApplication::translate(
"QMimerSQLResult",
1273 "Could not execute statement/open cursor"),
1274 err, QSqlError::StatementError, d->drv_d_func()));