SQL/ODBC: Fix calling SQLGetData() for old drivers
Some old drivers don't return SQL_NO_DATA when all data was fetched which resulted in an infinite loop. The previous check does not work when we receive chunked data and the driver returns fewer bytes than the maximum buffer size. Therefore simply check for SQL_SUCCESS since according the msdn docs, SQL_SUCCESS_WITH_INFO must be returned when there is more data to fetch. This also avoids an additional call to SQLGetData() here. Pick-to: 6.7 6.5 Fixes: QTBUG-119753 Change-Id: I42ed194f3955a650e63615615fe82d785f324228 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
c197fefb22
commit
e7c7402802
@ -437,16 +437,15 @@ static QVariant getStringDataImpl(SQLHANDLE hStmt, SQLUSMALLINT column, qsizetyp
|
||||
// if SQL_SUCCESS_WITH_INFO is returned, indicating that
|
||||
// more data can be fetched, the length indicator does NOT
|
||||
// contain the number of bytes returned - it contains the
|
||||
// total number of bytes that CAN be fetched
|
||||
// total number of bytes that were transferred to our buffer
|
||||
const qsizetype rSize = (r == SQL_SUCCESS_WITH_INFO)
|
||||
? buf.size()
|
||||
: qsizetype(lengthIndicator / sizeof(CT));
|
||||
fieldVal += fromSQLTCHAR<QVarLengthArray<CT>, sizeof(CT)>(buf, rSize);
|
||||
// lengthIndicator does not contain the termination character
|
||||
if (lengthIndicator < SQLLEN((buf.size() - 1) * sizeof(CT))) {
|
||||
// workaround for Drivermanagers that don't return SQL_NO_DATA
|
||||
// when we got SQL_SUCCESS_WITH_INFO then there is more data to fetch,
|
||||
// otherwise we are done
|
||||
if (r == SQL_SUCCESS)
|
||||
break;
|
||||
}
|
||||
} else if (r == SQL_NO_DATA) {
|
||||
break;
|
||||
} else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user