summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dist/changes-5.0.05
-rw-r--r--src/sql/models/qsqltablemodel.cpp34
2 files changed, 27 insertions, 12 deletions
diff --git a/dist/changes-5.0.0 b/dist/changes-5.0.0
index d2e8dde9de..996bdf4b0b 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 dd4629662b..9e1cfe3051 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<int, int> 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;
}