diff options
author | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2014-04-02 08:37:59 (GMT) |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-04-07 10:31:12 (GMT) |
commit | 1ff6efe5ce1f0687d1ce44dcaa281fcbdfb90044 (patch) | |
tree | 72de1f1f21aebbec3523110fdc12f4a94b2e25cf /src/sql/drivers/odbc/qsql_odbc.cpp | |
parent | 343df131f7207d65932c6505769aa2fb7fc04713 (diff) | |
download | Qt-1ff6efe5ce1f0687d1ce44dcaa281fcbdfb90044.zip Qt-1ff6efe5ce1f0687d1ce44dcaa281fcbdfb90044.tar.gz Qt-1ff6efe5ce1f0687d1ce44dcaa281fcbdfb90044.tar.bz2 |
Fix access of tmpStorage in QODBCResult::exec().
Instead of using a list and appending / popping of elements, use
a vector of constant size and access via index to avoid
bookkeeping errors.
Task-number: QTBUG-37831
Change-Id: Icb5a182626c63e693b04daaf7a2f70997d9aeae1
Reviewed-by: Mark Brand <mabrand@mabrand.nl>
(cherry picked from qtbase/d5ff16bc8ebf0f17fae3a28f08018db26567e81c)
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
Diffstat (limited to 'src/sql/drivers/odbc/qsql_odbc.cpp')
-rw-r--r-- | src/sql/drivers/odbc/qsql_odbc.cpp | 49 |
1 files changed, 22 insertions, 27 deletions
diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp index dd9f7af..3c47343 100644 --- a/src/sql/drivers/odbc/qsql_odbc.cpp +++ b/src/sql/drivers/odbc/qsql_odbc.cpp @@ -1331,12 +1331,12 @@ bool QODBCResult::exec() if (isSelect()) SQLCloseCursor(d->hStmt); - QList<QByteArray> tmpStorage; // holds temporary buffers - QVarLengthArray<SQLLEN, 32> indicators(boundValues().count()); + QVector<QVariant>& values = boundValues(); + QVector<QByteArray> tmpStorage(values.count(), QByteArray()); // holds temporary buffers + QVarLengthArray<SQLLEN, 32> indicators(values.count()); memset(indicators.data(), 0, indicators.size() * sizeof(SQLLEN)); // bind parameters - only positional binding allowed - QVector<QVariant>& values = boundValues(); int i; SQLRETURN r; for (i = 0; i < values.count(); ++i) { @@ -1348,7 +1348,7 @@ bool QODBCResult::exec() *ind = SQL_NULL_DATA; switch (val.type()) { case QVariant::Date: { - QByteArray ba; + QByteArray &ba = tmpStorage[i]; ba.resize(sizeof(DATE_STRUCT)); DATE_STRUCT *dt = (DATE_STRUCT *)ba.constData(); QDate qdt = val.toDate(); @@ -1365,10 +1365,9 @@ bool QODBCResult::exec() (void *) dt, 0, *ind == SQL_NULL_DATA ? ind : NULL); - tmpStorage.append(ba); break; } case QVariant::Time: { - QByteArray ba; + QByteArray &ba = tmpStorage[i]; ba.resize(sizeof(TIME_STRUCT)); TIME_STRUCT *dt = (TIME_STRUCT *)ba.constData(); QTime qdt = val.toTime(); @@ -1385,10 +1384,9 @@ bool QODBCResult::exec() (void *) dt, 0, *ind == SQL_NULL_DATA ? ind : NULL); - tmpStorage.append(ba); break; } case QVariant::DateTime: { - QByteArray ba; + QByteArray &ba = tmpStorage[i]; ba.resize(sizeof(TIMESTAMP_STRUCT)); TIMESTAMP_STRUCT * dt = (TIMESTAMP_STRUCT *)ba.constData(); QDateTime qdt = val.toDateTime(); @@ -1420,7 +1418,6 @@ bool QODBCResult::exec() (void *) dt, 0, *ind == SQL_NULL_DATA ? ind : NULL); - tmpStorage.append(ba); break; } case QVariant::Int: r = SQLBindParameter(d->hStmt, @@ -1511,14 +1508,15 @@ bool QODBCResult::exec() break; case QVariant::String: if (d->unicode) { + QByteArray &ba = tmpStorage[i]; QString str = val.toString(); if (*ind != SQL_NULL_DATA) *ind = str.length() * sizeof(SQLTCHAR); int strSize = str.length() * sizeof(SQLTCHAR); if (bindValueType(i) & QSql::Out) { - QVarLengthArray<SQLTCHAR> ba(toSQLTCHAR(str)); - ba.reserve(str.capacity()); + QVarLengthArray<SQLTCHAR> a(toSQLTCHAR(str)); + a.reserve(str.capacity()); r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], @@ -1526,13 +1524,12 @@ bool QODBCResult::exec() strSize > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR, 0, // god knows... don't change this! 0, - (void *)ba.constData(), - ba.size(), + (void *)a.constData(), + a.size(), ind); - tmpStorage.append(QByteArray((const char *)ba.constData(), ba.size()*sizeof(SQLTCHAR))); break; } - QByteArray strba((const char *)toSQLTCHAR(str).constData(), str.size()*sizeof(SQLTCHAR)); + ba = QByteArray((const char *)toSQLTCHAR(str).constData(), str.size()*sizeof(SQLTCHAR)); r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], @@ -1540,15 +1537,15 @@ bool QODBCResult::exec() strSize > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR, strSize, 0, - (SQLPOINTER)strba.constData(), - strba.size(), + (SQLPOINTER)ba.constData(), + ba.size(), ind); - tmpStorage.append(strba); break; } else { - QByteArray str = val.toString().toUtf8(); + QByteArray &str = tmpStorage[i]; + str = val.toString().toUtf8(); if (*ind != SQL_NULL_DATA) *ind = str.length(); int strSize = str.length(); @@ -1563,12 +1560,11 @@ bool QODBCResult::exec() (void *)str.constData(), strSize, ind); - tmpStorage.append(str); break; } // fall through default: { - QByteArray ba = val.toByteArray(); + QByteArray &ba = tmpStorage[i]; if (*ind != SQL_NULL_DATA) *ind = ba.size(); r = SQLBindParameter(d->hStmt, @@ -1581,7 +1577,6 @@ bool QODBCResult::exec() (void *) ba.constData(), ba.length() + 1, ind); - tmpStorage.append(ba); break; } } if (r != SQL_SUCCESS) { @@ -1625,16 +1620,16 @@ bool QODBCResult::exec() for (i = 0; i < values.count(); ++i) { switch (values.at(i).type()) { case QVariant::Date: { - DATE_STRUCT ds = *((DATE_STRUCT *)tmpStorage.takeFirst().constData()); + DATE_STRUCT ds = *((DATE_STRUCT *)tmpStorage.at(i).constData()); values[i] = QVariant(QDate(ds.year, ds.month, ds.day)); break; } case QVariant::Time: { - TIME_STRUCT dt = *((TIME_STRUCT *)tmpStorage.takeFirst().constData()); + TIME_STRUCT dt = *((TIME_STRUCT *)tmpStorage.at(i).constData()); values[i] = QVariant(QTime(dt.hour, dt.minute, dt.second)); break; } case QVariant::DateTime: { TIMESTAMP_STRUCT dt = *((TIMESTAMP_STRUCT*) - tmpStorage.takeFirst().constData()); + tmpStorage.at(i).constData()); values[i] = QVariant(QDateTime(QDate(dt.year, dt.month, dt.day), QTime(dt.hour, dt.minute, dt.second, dt.fraction / 1000000))); break; } @@ -1650,7 +1645,7 @@ bool QODBCResult::exec() case QVariant::String: if (d->unicode) { if (bindValueType(i) & QSql::Out) { - QByteArray first = tmpStorage.takeFirst(); + const QByteArray &first = tmpStorage.at(i); QVarLengthArray<SQLTCHAR> array; array.append((SQLTCHAR *)first.constData(), first.size()); values[i] = fromSQLTCHAR(array, first.size()/sizeof(SQLTCHAR*)); @@ -1660,7 +1655,7 @@ bool QODBCResult::exec() // fall through default: { if (bindValueType(i) & QSql::Out) - values[i] = tmpStorage.takeFirst(); + values[i] = tmpStorage.at(i); break; } } if (indicators[i] == SQL_NULL_DATA) |