QSqlResultPrivate: parameterize input query for parsing
Change-Id: If57f4fcea2e00a1910df5a5bd2b556289f4ffb21 Reviewed-by: Israel Lins Albuquerque <israelins85@yahoo.com.br> Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com> Reviewed-by: Mark Brand <mabrand@mabrand.nl>bb10
parent
e2b9dab539
commit
b8073b8414
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue