diff options
author | Mark Brand <mabrand@mabrand.nl> | 2013-01-30 00:39:53 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-02-06 07:57:28 +0100 |
commit | 33c212b7d25726b78c4bf630548a76feaab872f0 (patch) | |
tree | 33a9a44ae9f59e9444b321b97ddda7d1781df9a9 /tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp | |
parent | a694b9f8d204d6555caf4e30dbd18f536859c5bd (diff) |
QSqlTableModel::setData(): fix non-change detection
Commit 10ff9de91bedf93852f13a58287afd8831644759 introduced the
optimization of ignoring non-changes, but it overshot the mark.
It neglected to consider that QVariant's equality operator does not
compare the null flag. It also failed to consider that setData() has
a useful side effect of setting the generated flag in a column of a
pending INSERT. This is important when the application actually wants
a NULL to be inserted into the column.
Task-number: QTBUG-29217
Change-Id: I1368f7acc21eebfeb5a8d23746fc38f6f30fd395
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
Reviewed-by: Mark Brand <mabrand@mabrand.nl>
Diffstat (limited to 'tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp')
-rw-r--r-- | tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp index e4223ae53a..8a1ff8a24a 100644 --- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp +++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp @@ -83,6 +83,8 @@ private slots: void insertColumns(); void submitAll_data() { generic_data(); } void submitAll(); + void setData_data() { generic_data(); } + void setData(); void setRecord_data() { generic_data(); } void setRecord(); void setRecordReimpl_data() { generic_data(); } @@ -501,6 +503,77 @@ void tst_QSqlTableModel::insertColumns() QCOMPARE(model.data(model.index(3, 5)), QVariant()); } +void tst_QSqlTableModel::setData() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + CHECK_DATABASE(db); + + QSqlTableModel model(0, db); + model.setEditStrategy(QSqlTableModel::OnManualSubmit); + model.setTable(test); + model.setSort(0, Qt::AscendingOrder); + QVERIFY_SQL(model, select()); + + // initial state + QModelIndex idx = model.index(0, 0); + QVariant val = model.data(idx); + QVERIFY(val == int(1)); + QVERIFY(!val.isNull()); + QFAIL_SQL(model, isDirty()); + + // change 1 to 0 + idx = model.index(0, 0); + QVERIFY_SQL(model, setData(idx, int(0))); + val = model.data(idx); + QVERIFY(val == int(0)); + QVERIFY(!val.isNull()); + QVERIFY_SQL(model, isDirty(idx)); + QVERIFY_SQL(model, submitAll()); + + // change 0 to NULL + idx = model.index(0, 0); + QVERIFY_SQL(model, setData(idx, QVariant(QVariant::Int))); + val = model.data(idx); + QVERIFY(val == QVariant(QVariant::Int)); + QVERIFY(val.isNull()); + QVERIFY_SQL(model, isDirty(idx)); + QVERIFY_SQL(model, submitAll()); + + // change NULL to 0 + idx = model.index(0, 0); + QVERIFY_SQL(model, setData(idx, int(0))); + val = model.data(idx); + QVERIFY(val == int(0)); + QVERIFY(!val.isNull()); + QVERIFY_SQL(model, isDirty(idx)); + QVERIFY_SQL(model, submitAll()); + + // ignore unchanged 0 to 0 + idx = model.index(0, 0); + QVERIFY_SQL(model, setData(idx, int(0))); + val = model.data(idx); + QVERIFY(val == int(0)); + QVERIFY(!val.isNull()); + QFAIL_SQL(model, isDirty(idx)); + + // pending INSERT + QVERIFY_SQL(model, insertRow(0)); + // initial state + idx = model.index(0, 0); + QSqlRecord rec = model.record(0); + QVERIFY(rec.value(0) == QVariant(QVariant::Int)); + QVERIFY(rec.isNull(0)); + QVERIFY(!rec.isGenerated(0)); + // unchanged value, but causes column to be included in INSERT + QVERIFY_SQL(model, setData(idx, QVariant(QVariant::Int))); + rec = model.record(0); + QVERIFY(rec.value(0) == QVariant(QVariant::Int)); + QVERIFY(rec.isNull(0)); + QVERIFY(rec.isGenerated(0)); + QVERIFY_SQL(model, submitAll()); +} + void tst_QSqlTableModel::setRecord() { QFETCH(QString, dbName); |