From 33c212b7d25726b78c4bf630548a76feaab872f0 Mon Sep 17 00:00:00 2001 From: Mark Brand Date: Wed, 30 Jan 2013 00:39:53 +0100 Subject: 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 Reviewed-by: Mark Brand --- .../models/qsqltablemodel/tst_qsqltablemodel.cpp | 73 ++++++++++++++++++++++ 1 file changed, 73 insertions(+) (limited to 'tests') 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); -- cgit v1.2.3