diff options
author | Christian Ehrlicher <[email protected]> | 2024-06-06 17:44:44 +0200 |
---|---|---|
committer | Christian Ehrlicher <[email protected]> | 2024-06-07 17:31:30 +0200 |
commit | 54853352bbeff7ad3ee3b3aa3a90e45de5082e17 (patch) | |
tree | 6879df07e3e1d004cd7a51bb3e73db6862bda879 /src/plugins/sqldrivers/ibase/qsql_ibase.cpp | |
parent | e623f038f7738c202e745f693458ccb81f9484b6 (diff) |
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().
Pick-to: 6.8
Change-Id: I4454a3113c6bd1fe30b404af091f5cc0f904f78a
Reviewed-by: Axel Spoerl <[email protected]>
Diffstat (limited to 'src/plugins/sqldrivers/ibase/qsql_ibase.cpp')
-rw-r--r-- | src/plugins/sqldrivers/ibase/qsql_ibase.cpp | 44 |
1 files changed, 20 insertions, 24 deletions
diff --git a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp index ea836ca94b3..557302b344a 100644 --- a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp +++ b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp @@ -597,9 +597,8 @@ QVariant QIBaseResultPrivate::fetchBlob(ISC_QUAD *bId) return QVariant(); unsigned short len = 0; - QByteArray ba; - int chunkSize = QIBaseChunkSize; - ba.resize(chunkSize); + constexpr auto chunkSize = QIBaseChunkSize; + QByteArray ba(chunkSize, Qt::Uninitialized); qsizetype read = 0; while (isc_get_segment(status, &handle, &len, chunkSize, ba.data() + read) == 0 || status[1] == isc_segment) { read += len; @@ -723,8 +722,8 @@ QVariant QIBaseResultPrivate::fetchArray(int pos, ISC_QUAD *arr) return list; const XSQLVAR &sqlvar = sqlda->sqlvar[pos]; - QByteArray relname(sqlvar.relname, sqlvar.relname_length); - QByteArray sqlname(sqlvar.sqlname, sqlvar.sqlname_length); + const auto relname = QByteArray::fromRawData(sqlvar.relname, sqlvar.relname_length); + const auto sqlname = QByteArray::fromRawData(sqlvar.sqlname, sqlvar.sqlname_length); isc_array_lookup_bounds(status, &ibase, &trans, relname.data(), sqlname.data(), &desc); if (isError(QT_TRANSLATE_NOOP("QIBaseResult", "Could not find array"), @@ -732,19 +731,18 @@ QVariant QIBaseResultPrivate::fetchArray(int pos, ISC_QUAD *arr) return list; - int arraySize = 1, subArraySize; + int arraySize = 1; short dimensions = desc.array_desc_dimensions; QVarLengthArray<short> numElements(dimensions); for(int i = 0; i < dimensions; ++i) { - subArraySize = (desc.array_desc_bounds[i].array_bound_upper - - desc.array_desc_bounds[i].array_bound_lower + 1); + short subArraySize = (desc.array_desc_bounds[i].array_bound_upper - + desc.array_desc_bounds[i].array_bound_lower + 1); numElements[i] = subArraySize; arraySize = subArraySize * arraySize; } ISC_LONG bufLen; - QByteArray ba; /* varying arrayelements are stored with 2 trailing null bytes indicating the length of the string */ @@ -756,14 +754,13 @@ QVariant QIBaseResultPrivate::fetchArray(int pos, ISC_QUAD *arr) bufLen = desc.array_desc_length * arraySize; } - - ba.resize(int(bufLen)); + QByteArray ba(bufLen, Qt::Uninitialized); isc_array_get_slice(status, &ibase, &trans, arr, &desc, ba.data(), &bufLen); if (isError(QT_TRANSLATE_NOOP("QIBaseResult", "Could not get array data"), QSqlError::StatementError)) return list; - readArrayBuffer(list, ba.data(), 0, numElements.data(), &desc); + readArrayBuffer(list, ba.constData(), 0, numElements.constData(), &desc); return QVariant(list); } @@ -800,16 +797,16 @@ static char* qFillBufferWithString(char *buffer, const QString& string, if (str.length() < buflen) buflen = str.length(); 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); } else { *(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; } else { str = str.leftJustified(buflen, ' ', true); - memcpy(buffer, str.data(), buflen); + memcpy(buffer, str.constData(), buflen); buffer += buflen; } return buffer; @@ -921,8 +918,8 @@ bool QIBaseResultPrivate::writeArray(qsizetype column, const QList<QVariant> &li XSQLVAR &sqlvar = inda->sqlvar[column]; ISC_QUAD *arrayId = (ISC_QUAD*) sqlvar.sqldata; - QByteArray relname(sqlvar.relname, sqlvar.relname_length); - QByteArray sqlname(sqlvar.sqlname, sqlvar.sqlname_length); + const auto relname = QByteArray::fromRawData(sqlvar.relname, sqlvar.relname_length); + const auto sqlname = QByteArray::fromRawData(sqlvar.sqlname, sqlvar.sqlname_length); isc_array_lookup_bounds(status, &ibase, &trans, relname.data(), sqlname.data(), &desc); 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; bufLen = desc.array_desc_length * arraySize; - QByteArray ba; - ba.resize(int(bufLen)); + QByteArray ba(bufLen, Qt::Uninitialized); if (list.size() > arraySize) { 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_user_name)); 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(pass.length())); - ba.append(pass.data(), pass.length()); + ba.append(pass.constData(), pass.length()); ba.append(char(isc_dpb_lc_ctype)); ba.append(char(enc.length())); - ba.append(enc.data(), enc.length()); + ba.append(enc.constData(), enc.length()); if (!role.isEmpty()) { ba.append(char(isc_dpb_sql_role_name)); ba.append(char(role.length())); - ba.append(role.data(), role.length()); + ba.append(role.constData(), role.length()); } QString portString; @@ -1652,7 +1648,7 @@ bool QIBaseDriver::open(const QString &db, ldb += host + portString + u':'; ldb += db; 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"), QSqlError::ConnectionError)) { setOpenError(true); |