diff options
-rw-r--r-- | src/sql/models/qsqltablemodel.cpp | 77 |
1 files changed, 37 insertions, 40 deletions
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp index 8f63ee3910..79149a0d26 100644 --- a/src/sql/models/qsqltablemodel.cpp +++ b/src/sql/models/qsqltablemodel.cpp @@ -1203,52 +1203,49 @@ bool QSqlTableModel::setRecord(int row, const QSqlRecord &record) if (row >= rowCount()) return false; - bool isOk = true; - switch (d->strategy) { - case OnFieldChange: - case OnRowChange: { - EditStrategy oldStrategy = d->strategy; - - // FieldChange strategy makes no sense when setting an entire row - if (d->strategy == OnFieldChange) - d->strategy = OnRowChange; - for (int i = 0; i < record.count(); ++i) { - int idx = d->nameToIndex(record.fieldName(i)); - if (idx == -1) - continue; - QModelIndex cIndex = createIndex(row, idx); - QVariant value = record.value(i); - QVariant oldValue = data(cIndex); - if (oldValue.isNull() || oldValue != value) - isOk &= setData(cIndex, value, Qt::EditRole); - } - if (isOk && oldStrategy == OnFieldChange) - submitAll(); - d->strategy = oldStrategy; + if (d->strategy == OnFieldChange && d->cache.value(row).op != QSqlTableModelPrivate::Insert) + d->cache.clear(); + else if (d->strategy == OnRowChange && !d->cache.isEmpty() && !d->cache.contains(row)) + submit(); - return isOk; - } - case OnManualSubmit: { - 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())); - for (int i = 0; i < record.count(); ++i) { - int idx = d->nameToIndex(record.fieldName(i)); - if (idx == -1) { - isOk = false; - } else { + 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 if (d->strategy != OnManualSubmit) { + // historical bug: this could all be simple like OnManualSubmit, but isn't + const QModelIndex cIndex = createIndex(row, idx); + // historical bug: comparing EditRole with DisplayRole values here + const QVariant oldValue = data(cIndex); + const QVariant value = record.value(i); + // historical bug: it's a bad idea to check for change here + // historical bug: should test oldValue.isNull() != value.isNull() + if (oldValue.isNull() || oldValue != value) { + // historical bug: dataChanged() is suppressed for Insert. See also setData(). mrow.setValue(idx, record.value(i)); + if (mrow.op != QSqlTableModelPrivate::Insert) + emit dataChanged(cIndex, cIndex); } + } else { + mrow.setValue(idx, record.value(i)); } + } - if (isOk) - emit dataChanged(createIndex(row, 0), createIndex(row, columnCount() - 1)); + if (d->strategy == OnManualSubmit && isOk) + emit dataChanged(createIndex(row, 0), createIndex(row, columnCount() - 1)); + else if (d->strategy == OnFieldChange) + return submitAll(); + else if (d->strategy == OnManualSubmit) return isOk; - } - } - return false; + + return true; } QT_END_NAMESPACE |