--- /Users/johny/Qt/5.14.2/Src/qtbase/src/plugins/sqldrivers/ibase/qsql_ibase.cpp 2020-03-27 10:49:30.000000000 +0100 +++ ./qsql_ibase.cpp 2020-04-06 14:24:42.000000000 +0200 @@ -66,6 +66,14 @@ #define SQLDA_CURRENT_VERSION SQLDA_VERSION1 #endif +#ifndef SQL_BOOLEAN +#define SQL_BOOLEAN 32764 +#endif + +#ifndef blr_bool +#define blr_bool (unsigned char)23 +#endif + enum { QIBaseChunkSize = SHRT_MAX / 2 }; #if defined(FB_API_VER) && FB_API_VER >= 20 @@ -120,6 +128,7 @@ { for (int i = 0; i < sqlda->sqld; ++i) { switch (sqlda->sqlvar[i].sqltype & ~1) { + case SQL_BOOLEAN: case SQL_INT64: case SQL_LONG: case SQL_SHORT: @@ -192,6 +201,8 @@ case blr_d_float: case blr_double: return QVariant::Double; + case blr_bool: + return QVariant::Bool; } qWarning("qIBaseTypeName: unknown datatype: %d", iType); return QVariant::Invalid; @@ -221,6 +232,8 @@ return QVariant::List; case SQL_BLOB: return QVariant::ByteArray; + case SQL_BOOLEAN: + return QVariant::Bool; default: return QVariant::Invalid; } @@ -529,6 +542,17 @@ return res; } +template<> +QList toList(char** buf, int count, bool*) +{ + QList res; + for (int i = 0; i < count; ++i) { + res.append(QVariant{*(*buf) ? true: false}); + (*buf)++; + } + return res; +} + static char* readArrayBuffer(QList& list, char *buffer, short curDim, short* numElements, ISC_ARRAY_DESC *arrayDesc, QTextCodec *tc) @@ -596,6 +620,9 @@ buffer += sizeof(ISC_DATE); } break; + case blr_bool: + valList = toList(&buffer, numElements[dim]); + break; } } if (dim > 0) @@ -614,14 +641,13 @@ return list; QByteArray relname(sqlda->sqlvar[pos].relname, sqlda->sqlvar[pos].relname_length); - QByteArray sqlname(sqlda->sqlvar[pos].aliasname, sqlda->sqlvar[pos].aliasname_length); + QByteArray sqlname(sqlda->sqlvar[pos].sqlname, sqlda->sqlvar[pos].sqlname_length); isc_array_lookup_bounds(status, &ibase, &trans, relname.data(), sqlname.data(), &desc); if (isError(QT_TRANSLATE_NOOP("QIBaseResult", "Could not find array"), QSqlError::StatementError)) return list; - int arraySize = 1, subArraySize; short dimensions = desc.array_desc_dimensions; QVarLengthArray numElements(dimensions); @@ -684,6 +710,16 @@ return buffer; } +template<> +char* fillList(char *buffer, const QList &list, bool*) +{ + for (int i = 0; i < list.size(); ++i) { + *buffer = qvariant_cast(list.at(i)) ? '\1': '\0'; + buffer++; + } + return buffer; +} + static char* qFillBufferWithString(char *buffer, const QString& string, short buflen, bool varying, bool array, QTextCodec *tc) @@ -787,6 +823,9 @@ buffer += sizeof(ISC_TIMESTAMP); } break; + case QVariant::Bool: + buffer = fillList(buffer, list); + break; default: break; } @@ -802,7 +841,7 @@ ISC_ARRAY_DESC desc; QByteArray relname(inda->sqlvar[column].relname, inda->sqlvar[column].relname_length); - QByteArray sqlname(inda->sqlvar[column].aliasname, inda->sqlvar[column].aliasname_length); + QByteArray sqlname(inda->sqlvar[column].sqlname, inda->sqlvar[column].sqlname_length); isc_array_lookup_bounds(status, &ibase, &trans, relname.data(), sqlname.data(), &desc); if (isError(QT_TRANSLATE_NOOP("QIBaseResult", "Could not find array"), @@ -1080,6 +1119,9 @@ case SQL_ARRAY: ok &= d->writeArray(para, val.toList()); break; + case SQL_BOOLEAN: + *d->inda->sqlvar[para].sqldata = val.toBool() ? '\1' : '\0'; + break; default: qWarning("QIBaseResult::exec: Unknown datatype %d", d->inda->sqlvar[para].sqltype & ~1); @@ -1238,6 +1280,9 @@ case SQL_ARRAY: row[idx] = d->fetchArray(i, (ISC_QUAD*)buf); break; + case SQL_BOOLEAN: + row[idx] = QVariant(*buf ? true: false); + break; default: // unknown type - don't even try to fetch row[idx] = QVariant();