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:
parent
8d5ff75774
commit
e04af5b9ea
@ -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;
|
||||
|
@ -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]
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user