SQL/IBase: code cleanup part 4/5

Make sure that QByteArray does not detach when not needed and avoid some
copies by using QByteArray::fromRawData().

Change-Id: I4454a3113c6bd1fe30b404af091f5cc0f904f78a
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
(cherry picked from commit 54853352bbeff7ad3ee3b3aa3a90e45de5082e17)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Christian Ehrlicher 2024-06-06 17:44:44 +02:00 committed by Qt Cherry-pick Bot
parent 12b2e08747
commit 2e98bc7ffa

View File

@ -597,9 +597,8 @@ QVariant QIBaseResultPrivate::fetchBlob(ISC_QUAD *bId)
return QVariant(); return QVariant();
unsigned short len = 0; unsigned short len = 0;
QByteArray ba; constexpr auto chunkSize = QIBaseChunkSize;
int chunkSize = QIBaseChunkSize; QByteArray ba(chunkSize, Qt::Uninitialized);
ba.resize(chunkSize);
qsizetype read = 0; qsizetype read = 0;
while (isc_get_segment(status, &handle, &len, chunkSize, ba.data() + read) == 0 || status[1] == isc_segment) { while (isc_get_segment(status, &handle, &len, chunkSize, ba.data() + read) == 0 || status[1] == isc_segment) {
read += len; read += len;
@ -723,8 +722,8 @@ QVariant QIBaseResultPrivate::fetchArray(int pos, ISC_QUAD *arr)
return list; return list;
const XSQLVAR &sqlvar = sqlda->sqlvar[pos]; const XSQLVAR &sqlvar = sqlda->sqlvar[pos];
QByteArray relname(sqlvar.relname, sqlvar.relname_length); const auto relname = QByteArray::fromRawData(sqlvar.relname, sqlvar.relname_length);
QByteArray sqlname(sqlvar.sqlname, sqlvar.sqlname_length); const auto sqlname = QByteArray::fromRawData(sqlvar.sqlname, sqlvar.sqlname_length);
isc_array_lookup_bounds(status, &ibase, &trans, relname.data(), sqlname.data(), &desc); isc_array_lookup_bounds(status, &ibase, &trans, relname.data(), sqlname.data(), &desc);
if (isError(QT_TRANSLATE_NOOP("QIBaseResult", "Could not find array"), if (isError(QT_TRANSLATE_NOOP("QIBaseResult", "Could not find array"),
@ -732,19 +731,18 @@ QVariant QIBaseResultPrivate::fetchArray(int pos, ISC_QUAD *arr)
return list; return list;
int arraySize = 1, subArraySize; int arraySize = 1;
short dimensions = desc.array_desc_dimensions; short dimensions = desc.array_desc_dimensions;
QVarLengthArray<short> numElements(dimensions); QVarLengthArray<short> numElements(dimensions);
for(int i = 0; i < dimensions; ++i) { for(int i = 0; i < dimensions; ++i) {
subArraySize = (desc.array_desc_bounds[i].array_bound_upper - short subArraySize = (desc.array_desc_bounds[i].array_bound_upper -
desc.array_desc_bounds[i].array_bound_lower + 1); desc.array_desc_bounds[i].array_bound_lower + 1);
numElements[i] = subArraySize; numElements[i] = subArraySize;
arraySize = subArraySize * arraySize; arraySize = subArraySize * arraySize;
} }
ISC_LONG bufLen; ISC_LONG bufLen;
QByteArray ba;
/* varying arrayelements are stored with 2 trailing null bytes /* varying arrayelements are stored with 2 trailing null bytes
indicating the length of the string indicating the length of the string
*/ */
@ -756,14 +754,13 @@ QVariant QIBaseResultPrivate::fetchArray(int pos, ISC_QUAD *arr)
bufLen = desc.array_desc_length * arraySize; bufLen = desc.array_desc_length * arraySize;
} }
QByteArray ba(bufLen, Qt::Uninitialized);
ba.resize(int(bufLen));
isc_array_get_slice(status, &ibase, &trans, arr, &desc, ba.data(), &bufLen); isc_array_get_slice(status, &ibase, &trans, arr, &desc, ba.data(), &bufLen);
if (isError(QT_TRANSLATE_NOOP("QIBaseResult", "Could not get array data"), if (isError(QT_TRANSLATE_NOOP("QIBaseResult", "Could not get array data"),
QSqlError::StatementError)) QSqlError::StatementError))
return list; return list;
readArrayBuffer(list, ba.data(), 0, numElements.data(), &desc); readArrayBuffer(list, ba.constData(), 0, numElements.constData(), &desc);
return QVariant(list); return QVariant(list);
} }
@ -800,16 +797,16 @@ static char* qFillBufferWithString(char *buffer, const QString& string,
if (str.length() < buflen) if (str.length() < buflen)
buflen = str.length(); buflen = str.length();
if (array) { // interbase stores varying arrayelements different than normal varying elements if (array) { // interbase stores varying arrayelements different than normal varying elements
memcpy(buffer, str.data(), buflen); memcpy(buffer, str.constData(), buflen);
memset(buffer + buflen, 0, tmpBuflen - buflen); memset(buffer + buflen, 0, tmpBuflen - buflen);
} else { } else {
*(short*)buffer = buflen; // first two bytes is the length *(short*)buffer = buflen; // first two bytes is the length
memcpy(buffer + sizeof(short), str.data(), buflen); memcpy(buffer + sizeof(short), str.constData(), buflen);
} }
buffer += tmpBuflen; buffer += tmpBuflen;
} else { } else {
str = str.leftJustified(buflen, ' ', true); str = str.leftJustified(buflen, ' ', true);
memcpy(buffer, str.data(), buflen); memcpy(buffer, str.constData(), buflen);
buffer += buflen; buffer += buflen;
} }
return buffer; return buffer;
@ -921,8 +918,8 @@ bool QIBaseResultPrivate::writeArray(qsizetype column, const QList<QVariant> &li
XSQLVAR &sqlvar = inda->sqlvar[column]; XSQLVAR &sqlvar = inda->sqlvar[column];
ISC_QUAD *arrayId = (ISC_QUAD*) sqlvar.sqldata; ISC_QUAD *arrayId = (ISC_QUAD*) sqlvar.sqldata;
QByteArray relname(sqlvar.relname, sqlvar.relname_length); const auto relname = QByteArray::fromRawData(sqlvar.relname, sqlvar.relname_length);
QByteArray sqlname(sqlvar.sqlname, sqlvar.sqlname_length); const auto sqlname = QByteArray::fromRawData(sqlvar.sqlname, sqlvar.sqlname_length);
isc_array_lookup_bounds(status, &ibase, &trans, relname.data(), sqlname.data(), &desc); isc_array_lookup_bounds(status, &ibase, &trans, relname.data(), sqlname.data(), &desc);
if (isError(QT_TRANSLATE_NOOP("QIBaseResult", "Could not find array"), if (isError(QT_TRANSLATE_NOOP("QIBaseResult", "Could not find array"),
@ -946,8 +943,7 @@ bool QIBaseResultPrivate::writeArray(qsizetype column, const QList<QVariant> &li
desc.array_desc_length += 2; desc.array_desc_length += 2;
bufLen = desc.array_desc_length * arraySize; bufLen = desc.array_desc_length * arraySize;
QByteArray ba; QByteArray ba(bufLen, Qt::Uninitialized);
ba.resize(int(bufLen));
if (list.size() > arraySize) { if (list.size() > arraySize) {
error = "Array size mismatch: size of %1 is %2, size of provided list is %3"_L1; error = "Array size mismatch: size of %1 is %2, size of provided list is %3"_L1;
@ -1629,18 +1625,18 @@ bool QIBaseDriver::open(const QString &db,
ba.append(char(isc_dpb_version1)); ba.append(char(isc_dpb_version1));
ba.append(char(isc_dpb_user_name)); ba.append(char(isc_dpb_user_name));
ba.append(char(usr.length())); ba.append(char(usr.length()));
ba.append(usr.data(), usr.length()); ba.append(usr.constData(), usr.length());
ba.append(char(isc_dpb_password)); ba.append(char(isc_dpb_password));
ba.append(char(pass.length())); ba.append(char(pass.length()));
ba.append(pass.data(), pass.length()); ba.append(pass.constData(), pass.length());
ba.append(char(isc_dpb_lc_ctype)); ba.append(char(isc_dpb_lc_ctype));
ba.append(char(enc.length())); ba.append(char(enc.length()));
ba.append(enc.data(), enc.length()); ba.append(enc.constData(), enc.length());
if (!role.isEmpty()) { if (!role.isEmpty()) {
ba.append(char(isc_dpb_sql_role_name)); ba.append(char(isc_dpb_sql_role_name));
ba.append(char(role.length())); ba.append(char(role.length()));
ba.append(role.data(), role.length()); ba.append(role.constData(), role.length());
} }
QString portString; QString portString;
@ -1652,7 +1648,7 @@ bool QIBaseDriver::open(const QString &db,
ldb += host + portString + u':'; ldb += host + portString + u':';
ldb += db; ldb += db;
isc_attach_database(d->status, 0, const_cast<char *>(ldb.toLocal8Bit().constData()), isc_attach_database(d->status, 0, const_cast<char *>(ldb.toLocal8Bit().constData()),
&d->ibase, ba.size(), ba.data()); &d->ibase, ba.size(), ba.constData());
if (d->isError(QT_TRANSLATE_NOOP("QIBaseDriver", "Error opening database"), if (d->isError(QT_TRANSLATE_NOOP("QIBaseDriver", "Error opening database"),
QSqlError::ConnectionError)) { QSqlError::ConnectionError)) {
setOpenError(true); setOpenError(true);