From a58e630b61c19eac8f0c0d931825b42eeb7ea16b Mon Sep 17 00:00:00 2001 From: Mark Brand Date: Wed, 8 Feb 2012 00:16:46 +0100 Subject: [PATCH] QSqlTableModel::setRecord(): improve handling of field mapping -Only use fields where generated flag is set to true. -Require all fields to map correctly. If fields don't map, that is a sign of a programming or user error. Change-Id: Ie8474393005de6c9926b4e46985d62b194eafde2 Reviewed-by: Yunqiao Yin --- dist/changes-5.0.0 | 5 +++++ src/sql/models/qsqltablemodel.cpp | 34 ++++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/dist/changes-5.0.0 b/dist/changes-5.0.0 index d2e8dde..996bdf4 100644 --- a/dist/changes-5.0.0 +++ b/dist/changes-5.0.0 @@ -350,6 +350,11 @@ model methods setData() or setRecord(). before doing anything. Previously, it would remove what it could and ignore the rest of the range. +* setRecord() and insertRecord() + -Only use fields where generated flag is set to true. This is + is consistent with the meaning of the flag. + -Require all fields to map correctly. Previously fields that didn't + map were simply ignored. **************************************************************************** * Database Drivers * diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp index dd46296..9e1cfe3 100644 --- a/src/sql/models/qsqltablemodel.cpp +++ b/src/sql/models/qsqltablemodel.cpp @@ -1066,6 +1066,8 @@ bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent) the record will be appended to the end. Calls insertRows() and setRecord() internally. + Only fields where the generated flag is true will be included. + Returns true if the record could be inserted, otherwise false. \sa insertRows(), removeRows() @@ -1183,8 +1185,10 @@ Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const /*! Sets the values at the specified \a row to the values of \a - record. Returns true if all the values could be set; otherwise - returns false. + record for fields where generated flag is true. + + Returns true if all the values could be set; otherwise returns + false. \sa record() */ @@ -1203,28 +1207,34 @@ bool QSqlTableModel::setRecord(int row, const QSqlRecord &record) else if (d->strategy == OnRowChange && !d->cache.isEmpty() && !d->cache.contains(row)) submit(); + // Check field names and remember mapping + typedef QMap Map; + Map map; + for (int i = 0; i < record.count(); ++i) { + if (record.isGenerated(i)) { + int idx = d->nameToIndex(record.fieldName(i)); + if (idx == -1) + return false; + map[i] = idx; + } + } + QSqlTableModelPrivate::ModifiedRow &mrow = d->cache[row]; if (mrow.op() == QSqlTableModelPrivate::None) mrow = QSqlTableModelPrivate::ModifiedRow(QSqlTableModelPrivate::Update, d->rec, d->primaryValues(indexInQuery(createIndex(row, 0)).row())); - bool isOk = true; - for (int i = 0; i < record.count(); ++i) { - int idx = d->nameToIndex(record.fieldName(i)); - if (idx == -1) - isOk = false; - else - mrow.setValue(idx, record.value(i)); - } + Map::const_iterator i = map.constBegin(); + const Map::const_iterator e = map.constEnd(); + for ( ; i != e; ++i) + mrow.setValue(i.value(), record.value(i.key())); if (columnCount()) emit dataChanged(createIndex(row, 0), createIndex(row, columnCount() - 1)); if (d->strategy == OnFieldChange) return submit(); - else if (d->strategy == OnManualSubmit) - return isOk; return true; } -- 2.7.4