From 37e7c3c11698812f07d8b78c90d0adcffd1d0d33 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Sun, 2 Aug 2020 14:54:28 +0200 Subject: Interbase: Add support for the boolean type This is added to Interbase in v7 and Firebird in v3 which has been available for sometime now. This means the minimum supported for Interbase is now v7. [ChangeLog][QtSQL][Interbase] The minimum required version for Interbase is now v7. Fixes: QTBUG-83401 Change-Id: I9927fd962f25c935be8ed5d2b7c76c00fb88cd8c Reviewed-by: Christian Ehrlicher --- src/plugins/sqldrivers/ibase/qsql_ibase.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'src/plugins/sqldrivers') diff --git a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp index 1754492fe7..6b7ee8f133 100644 --- a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp +++ b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp @@ -64,6 +64,11 @@ QT_BEGIN_NAMESPACE #define SQLDA_CURRENT_VERSION SQLDA_VERSION1 #endif +// Firebird uses blr_bool and not blr_boolean_dtype which is what Interbase uses +#ifndef blr_boolean_dtype +#define blr_boolean_dtype blr_bool +#endif + enum { QIBaseChunkSize = SHRT_MAX / 2 }; static bool getIBaseError(QString& msg, const ISC_STATUS* status, ISC_LONG &sqlcode) @@ -117,6 +122,7 @@ static void initDA(XSQLDA *sqlda) case SQL_TYPE_DATE: case SQL_TEXT: case SQL_BLOB: + case SQL_BOOLEAN: sqlda->sqlvar[i].sqldata = new char[sqlda->sqlvar[i].sqllen]; break; case SQL_ARRAY: @@ -179,6 +185,8 @@ static QVariant::Type qIBaseTypeName(int iType, bool hasScale) case blr_d_float: case blr_double: return QVariant::Double; + case blr_boolean_dtype: + return QVariant::Bool; } qWarning("qIBaseTypeName: unknown datatype: %d", iType); return QVariant::Invalid; @@ -208,6 +216,8 @@ static QVariant::Type qIBaseTypeName2(int iType, bool hasScale) return QVariant::List; case SQL_BLOB: return QVariant::ByteArray; + case SQL_BOOLEAN: + return QVariant::Bool; default: return QVariant::Invalid; } @@ -378,7 +388,6 @@ public: bool writeBlob(int i, const QByteArray &ba); QVariant fetchArray(int pos, ISC_QUAD *arr); bool writeArray(int i, const QList &list); - public: ISC_STATUS status[20]; isc_tr_handle trans; @@ -549,6 +558,9 @@ static char* readArrayBuffer(QList& list, char *buffer, short curDim, buffer += sizeof(ISC_DATE); } break; + case blr_boolean_dtype: + valList = toList(&buffer, numElements[dim]); + break; } } if (dim > 0) @@ -739,6 +751,9 @@ static char* createArrayBuffer(char *buffer, const QList &list, buffer += sizeof(ISC_TIMESTAMP); } break; + case QVariant::Bool: + buffer = fillList(buffer, list); + break; default: break; } @@ -1032,6 +1047,9 @@ bool QIBaseResult::exec() case SQL_ARRAY: ok &= d->writeArray(para, val.toList()); break; + case SQL_BOOLEAN: + *((bool*)d->inda->sqlvar[para].sqldata) = val.toBool(); + break; default: qWarning("QIBaseResult::exec: Unknown datatype %d", d->inda->sqlvar[para].sqltype & ~1); @@ -1184,6 +1202,9 @@ bool QIBaseResult::gotoNext(QSqlCachedResult::ValueCache& row, int rowIdx) case SQL_ARRAY: row[idx] = d->fetchArray(i, (ISC_QUAD*)buf); break; + case SQL_BOOLEAN: + row[idx] = QVariant(bool((*(bool*)buf))); + break; default: // unknown type - don't even try to fetch row[idx] = QVariant(); -- cgit v1.2.3