From b8073b841404f0f5b9a6f87faba375c6eb45f3d0 Mon Sep 17 00:00:00 2001 From: Mark Brand Date: Mon, 11 Feb 2013 10:23:43 +0100 Subject: QSqlResultPrivate: parameterize input query for parsing Change-Id: If57f4fcea2e00a1910df5a5bd2b556289f4ffb21 Reviewed-by: Israel Lins Albuquerque Reviewed-by: Konstantin Ritt Reviewed-by: Mark Brand --- src/sql/kernel/qsqlresult.cpp | 26 +++++++++++++------------- src/sql/kernel/qsqlresult_p.h | 4 ++-- 2 files changed, 15 insertions(+), 15 deletions(-) (limited to 'src/sql/kernel') diff --git a/src/sql/kernel/qsqlresult.cpp b/src/sql/kernel/qsqlresult.cpp index b73c80f192..6ae9c2b314 100644 --- a/src/sql/kernel/qsqlresult.cpp +++ b/src/sql/kernel/qsqlresult.cpp @@ -81,9 +81,9 @@ static bool qIsAlnum(QChar ch) return u - 'a' < 26 || u - 'A' < 26 || u - '0' < 10 || u == '_'; } -QString QSqlResultPrivate::positionalToNamedBinding() +QString QSqlResultPrivate::positionalToNamedBinding(const QString &query) { - int n = sql.size(); + int n = query.size(); QString result; result.reserve(n * 5 / 4); @@ -91,7 +91,7 @@ QString QSqlResultPrivate::positionalToNamedBinding() int count = 0; for (int i = 0; i < n; ++i) { - QChar ch = sql.at(i); + QChar ch = query.at(i); if (ch == QLatin1Char('?') && !inQuote) { result += fieldSerial(count++); } else { @@ -104,9 +104,9 @@ QString QSqlResultPrivate::positionalToNamedBinding() return result; } -QString QSqlResultPrivate::namedToPositionalBinding() +QString QSqlResultPrivate::namedToPositionalBinding(const QString &query) { - int n = sql.size(); + int n = query.size(); QString result; result.reserve(n); @@ -115,14 +115,14 @@ QString QSqlResultPrivate::namedToPositionalBinding() int i = 0; while (i < n) { - QChar ch = sql.at(i); + QChar ch = query.at(i); if (ch == QLatin1Char(':') && !inQuote - && (i == 0 || sql.at(i - 1) != QLatin1Char(':')) - && (i + 1 < n && qIsAlnum(sql.at(i + 1)))) { + && (i == 0 || query.at(i - 1) != QLatin1Char(':')) + && (i + 1 < n && qIsAlnum(query.at(i + 1)))) { int pos = i + 2; - while (pos < n && qIsAlnum(sql.at(pos))) + while (pos < n && qIsAlnum(query.at(pos))) ++pos; - QString holder(sql.mid(i, pos - i)); + QString holder(query.mid(i, pos - i)); indexes[holder].append(count++); holders.append(QHolder(holder, i)); result += QLatin1Char('?'); @@ -529,10 +529,10 @@ bool QSqlResult::savePrepare(const QString& query) return prepare(query); // parse the query to memorize parameter location - d->executedQuery = d->namedToPositionalBinding(); + d->executedQuery = d->namedToPositionalBinding(query); if (driver()->hasFeature(QSqlDriver::NamedPlaceholders)) - d->executedQuery = d->positionalToNamedBinding(); + d->executedQuery = QSqlResultPrivate::positionalToNamedBinding(query); return prepare(d->executedQuery); } @@ -549,7 +549,7 @@ bool QSqlResult::prepare(const QString& query) d->sql = query; if (d->holders.isEmpty()) { // parse the query to memorize parameter location - d->namedToPositionalBinding(); + d->namedToPositionalBinding(query); } return true; // fake prepares should always succeed } diff --git a/src/sql/kernel/qsqlresult_p.h b/src/sql/kernel/qsqlresult_p.h index 95148853df..e70e2e32e9 100644 --- a/src/sql/kernel/qsqlresult_p.h +++ b/src/sql/kernel/qsqlresult_p.h @@ -107,8 +107,8 @@ public: } static QString fieldSerial(int); - QString positionalToNamedBinding(); - QString namedToPositionalBinding(); + static QString positionalToNamedBinding(const QString &query); + QString namedToPositionalBinding(const QString &query); QString holderAt(int index) const; QSqlResult *q; -- cgit v1.2.3