SQL: use qsizetype and range-based for loops where possible

Some public functions are still using int instead qsizetype which
can't be changed until Qt7.

Change-Id: Ib6f210c344acce9f3836e8a5493a741eb8b2b385
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
This commit is contained in:
Christian Ehrlicher 2023-01-07 14:11:51 +01:00 committed by Marc Mutz
parent 8d5ff75774
commit e04af5b9ea
8 changed files with 49 additions and 54 deletions

View File

@ -256,7 +256,7 @@ public:
Q_DECLARE_SQLDRIVER_PRIVATE(QPSQLDriver)
using QSqlResultPrivate::QSqlResultPrivate;
QString fieldSerial(int i) const override { return u'$' + QString::number(i + 1); }
QString fieldSerial(qsizetype i) const override { return u'$' + QString::number(i + 1); }
void deallocatePreparedStmt();
std::queue<PGresult*> nextResultSets;

View File

@ -156,9 +156,9 @@ void QSqlQuery_snippets()
{
// examine with named or positional binding
//! [14]
QVariantList list = query.boundValues();
for (int i = 0; i < list.size(); ++i)
cout << i << ": " << list.at(i).toString().toUtf8().data() << "\n";
const QVariantList list = query.boundValues();
for (qsizetype i = 0; i < list.size(); ++i)
qDebug() << i << ":" << list.at(i).toString();
//! [14]
}
}

View File

@ -20,7 +20,7 @@ QT_BEGIN_NAMESPACE
to indicate that we are not interested in the actual values.
*/
static const uint initial_cache_size = 128;
static constexpr qsizetype initial_cache_size = 128;
void QSqlCachedResultPrivate::cleanup()
{

View File

@ -499,19 +499,18 @@ QStringList QSqlDatabase::drivers()
if (QFactoryLoader *fl = loader()) {
typedef QMultiMap<int, QString> PluginKeyMap;
typedef PluginKeyMap::const_iterator PluginKeyMapConstIterator;
const PluginKeyMap keyMap = fl->keyMap();
const PluginKeyMapConstIterator cend = keyMap.constEnd();
for (PluginKeyMapConstIterator it = keyMap.constBegin(); it != cend; ++it)
if (!list.contains(it.value()))
list << it.value();
for (const QString &val : keyMap) {
if (!list.contains(val))
list << val;
}
}
DriverDict dict = QSqlDatabasePrivate::driverDict();
for (DriverDict::const_iterator i = dict.constBegin(); i != dict.constEnd(); ++i) {
if (!list.contains(i.key()))
list << i.key();
const DriverDict dict = QSqlDatabasePrivate::driverDict();
for (const auto &[k, _] : dict.asKeyValueRange()) {
if (!list.contains(k))
list << k;
}
return list;

View File

@ -8,6 +8,7 @@
#include "qsqlfield.h"
#include "qsqlindex.h"
#include "private/qsqldriver_p.h"
#include "private/qtools_p.h"
#include <limits.h>
@ -445,12 +446,11 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName,
{
const auto tableNameString = tableName.isEmpty() ? QString()
: prepareIdentifier(tableName, QSqlDriver::TableName, this);
int i;
QString s;
s.reserve(128);
switch (type) {
case SelectStatement:
for (i = 0; i < rec.count(); ++i) {
for (qsizetype i = 0; i < rec.count(); ++i) {
if (rec.isGenerated(i))
s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName, this)).append(", "_L1);
}
@ -463,7 +463,7 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName,
{
const QString tableNamePrefix = tableNameString.isEmpty()
? QString() : tableNameString + u'.';
for (int i = 0; i < rec.count(); ++i) {
for (qsizetype i = 0; i < rec.count(); ++i) {
if (!rec.isGenerated(i))
continue;
s.append(s.isEmpty() ? "WHERE "_L1 : " AND "_L1);
@ -480,7 +480,7 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName,
}
case UpdateStatement:
s = s + "UPDATE "_L1 + tableNameString + " SET "_L1;
for (i = 0; i < rec.count(); ++i) {
for (qsizetype i = 0; i < rec.count(); ++i) {
if (!rec.isGenerated(i))
continue;
s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName, this)).append(u'=');
@ -501,7 +501,7 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName,
case InsertStatement: {
s = s + "INSERT INTO "_L1 + tableNameString + " ("_L1;
QString vals;
for (i = 0; i < rec.count(); ++i) {
for (qsizetype i = 0; i < rec.count(); ++i) {
if (!rec.isGenerated(i))
continue;
s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName, this)).append(", "_L1);
@ -612,15 +612,15 @@ QString QSqlDriver::formatValue(const QSqlField &field, bool trimStrings) const
break;
case QMetaType::QByteArray : {
if (hasFeature(BLOB)) {
QByteArray ba = field.value().toByteArray();
QString res;
static const char hexchars[] = "0123456789abcdef";
for (int i = 0; i < ba.size(); ++i) {
uchar s = (uchar) ba[i];
res += QLatin1Char(hexchars[s >> 4]);
res += QLatin1Char(hexchars[s & 0x0f]);
const QByteArray ba = field.value().toByteArray();
r.reserve((ba.size() + 1) * 2);
r += u'\'';
for (const char c : ba) {
const uchar s = uchar(c);
r += QLatin1Char(QtMiscUtils::toHexLower(s >> 4));
r += QLatin1Char(QtMiscUtils::toHexLower(s & 0x0f));
}
r = u'\'' + res + u'\'';
r += u'\'';
break;
}
}

View File

@ -336,7 +336,7 @@ bool QSqlQuery::isNull(int field) const
bool QSqlQuery::isNull(const QString &name) const
{
int index = d->sqlResult->record().indexOf(name);
qsizetype index = d->sqlResult->record().indexOf(name);
if (index > -1)
return isNull(index);
qWarning("QSqlQuery::isNull: unknown field name '%s'", qPrintable(name));
@ -447,7 +447,7 @@ QVariant QSqlQuery::value(int index) const
QVariant QSqlQuery::value(const QString& name) const
{
int index = d->sqlResult->record().indexOf(name);
qsizetype index = d->sqlResult->record().indexOf(name);
if (index > -1)
return value(index);
qWarning("QSqlQuery::value: unknown field name '%s'", qPrintable(name));
@ -920,7 +920,7 @@ QSqlRecord QSqlQuery::record() const
QSqlRecord rec = d->sqlResult->record();
if (isValid()) {
for (int i = 0; i < rec.count(); ++i)
for (qsizetype i = 0; i < rec.count(); ++i)
rec.setValue(i, value(i));
}
return rec;

View File

@ -23,7 +23,7 @@ QString QSqlResultPrivate::holderAt(int index) const
return holders.size() > index ? holders.at(index).holderName : fieldSerial(index);
}
QString QSqlResultPrivate::fieldSerial(int i) const
QString QSqlResultPrivate::fieldSerial(qsizetype i) const
{
return QString(":%1"_L1).arg(i);
}
@ -37,15 +37,15 @@ static bool qIsAlnum(QChar ch)
QString QSqlResultPrivate::positionalToNamedBinding(const QString &query) const
{
int n = query.size();
const qsizetype n = query.size();
QString result;
result.reserve(n * 5 / 4);
QChar closingQuote;
int count = 0;
qsizetype count = 0;
bool ignoreBraces = (sqldriver->dbmsType() == QSqlDriver::PostgreSQL);
for (int i = 0; i < n; ++i) {
for (qsizetype i = 0; i < n; ++i) {
QChar ch = query.at(i);
if (!closingQuote.isNull()) {
if (ch == closingQuote) {
@ -84,13 +84,13 @@ QString QSqlResultPrivate::namedToPositionalBinding(const QString &query)
query.trimmed().startsWith("EXECUTE BLOCK"_L1, Qt::CaseInsensitive))
return query;
int n = query.size();
const qsizetype n = query.size();
QString result;
result.reserve(n);
QChar closingQuote;
int count = 0;
int i = 0;
qsizetype i = 0;
bool ignoreBraces = (sqldriver->dbmsType() == QSqlDriver::PostgreSQL);
while (i < n) {
@ -624,12 +624,9 @@ bool QSqlResult::exec()
// fake preparation - just replace the placeholders..
QString query = lastQuery();
if (d->binds == NamedBinding) {
int i;
QVariant val;
QString holder;
for (i = d->holders.size() - 1; i >= 0; --i) {
holder = d->holders.at(i).holderName;
val = d->values.value(d->indexes.value(holder).value(0,-1));
for (qsizetype i = d->holders.size() - 1; i >= 0; --i) {
const QString &holder = d->holders.at(i).holderName;
const QVariant val = d->values.value(d->indexes.value(holder).value(0,-1));
QSqlField f(""_L1, val.metaType());
if (QSqlResultPrivate::isVariantNull(val))
f.setValue(QVariant());
@ -639,21 +636,18 @@ bool QSqlResult::exec()
holder.size(), driver()->formatValue(f));
}
} else {
QString val;
qsizetype i = 0;
int idx = 0;
for (idx = 0; idx < d->values.size(); ++idx) {
for (const QVariant &var : std::as_const(d->values)) {
i = query.indexOf(u'?', i);
if (i == -1)
continue;
QVariant var = d->values.value(idx);
QSqlField f(""_L1, var.metaType());
if (QSqlResultPrivate::isVariantNull(var))
f.clear();
else
f.setValue(var);
val = driver()->formatValue(f);
query = query.replace(i, 1, driver()->formatValue(f));
const QString val = driver()->formatValue(f);
query = query.replace(i, 1, val);
i += val.size();
}
}
@ -945,11 +939,13 @@ bool QSqlResult::execBatch(bool arrayBind)
Q_UNUSED(arrayBind);
Q_D(QSqlResult);
QList<QVariant> values = d->values;
const QList<QVariant> values = d->values;
if (values.size() == 0)
return false;
for (int i = 0; i < values.at(0).toList().size(); ++i) {
for (int j = 0; j < values.size(); ++j)
const qsizetype batchCount = values.at(0).toList().size();
const qsizetype valueCount = values.size();
for (qsizetype i = 0; i < batchCount; ++i) {
for (qsizetype j = 0; j < valueCount; ++j)
bindValue(j, values.at(j).toList().at(i), QSql::In);
if (!exec())
return false;

View File

@ -30,11 +30,11 @@ QT_BEGIN_NAMESPACE
inline Class##Private* drv_d_func() { return !sqldriver ? nullptr : reinterpret_cast<Class *>(static_cast<QSqlDriver*>(sqldriver))->d_func(); }
struct QHolder {
QHolder(const QString &hldr = QString(), int index = -1): holderName(hldr), holderPos(index) { }
QHolder(const QString &hldr = QString(), qsizetype index = -1): holderName(hldr), holderPos(index) { }
bool operator==(const QHolder &h) const { return h.holderPos == holderPos && h.holderName == holderName; }
bool operator!=(const QHolder &h) const { return h.holderPos != holderPos || h.holderName != holderName; }
QString holderName;
int holderPos;
qsizetype holderPos;
};
class Q_SQL_EXPORT QSqlResultPrivate
@ -72,7 +72,7 @@ public:
clearIndex();
}
virtual QString fieldSerial(int) const;
virtual QString fieldSerial(qsizetype) const;
QString positionalToNamedBinding(const QString &query) const;
QString namedToPositionalBinding(const QString &query);
QString holderAt(int index) const;