summaryrefslogtreecommitdiffstats
path: root/tests/auto/sql/models
diff options
context:
space:
mode:
authorMark Brand <mabrand@mabrand.nl>2012-09-17 14:22:29 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-09-24 21:27:51 +0200
commit7389c096379d63d956a023835646af1179ac6ea4 (patch)
tree2032bebc9aa51b69fe0025e295c0168eb59be52b /tests/auto/sql/models
parentcb2d87e8b862c99dcbd12c399da3ac5ec9c5dcad (diff)
QSqlTableModel::selectRow(): fix failure on uncached rows
This method was originally intended for refreshing rows after submitting changes. It should also work for refreshing rows that are unchanged (i.e., not cached), but did not because constructing the primary values depended on the cache. As a consequence, the WHERE clause for the query was not created. Fixed by deriving primary values for uncached rows from the query record. Note that the cache is still authoritative for rows it holds. This is important because the prmary values there may differ from the original query record due to changes to columns of the primary key. Includes new test. Change-Id: I41cca2cbf26019d4b495ffa6d876e2b55ec57803 Reviewed-by: Andy Shaw <andy.shaw@digia.com> Reviewed-by: Mark Brand <mabrand@mabrand.nl>
Diffstat (limited to 'tests/auto/sql/models')
-rw-r--r--tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
index 7f67f74a75..cbc9cd51c3 100644
--- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
+++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
@@ -75,6 +75,8 @@ private slots:
void select_data() { generic_data(); }
void select();
+ void selectRow_data() { generic_data(); }
+ void selectRow();
void insertColumns_data() { generic_data_with_strategies(); }
void insertColumns();
void submitAll_data() { generic_data(); }
@@ -311,6 +313,49 @@ void tst_QSqlTableModel::select()
QCOMPARE(model.data(model.index(3, 3)), QVariant());
}
+void tst_QSqlTableModel::selectRow()
+{
+ QFETCH(QString, dbName);
+ QSqlDatabase db = QSqlDatabase::database(dbName);
+ CHECK_DATABASE(db);
+
+ QString tbl = qTableName("pktest", __FILE__);
+ QSqlQuery q(db);
+ q.exec("DELETE FROM " + tbl);
+ q.exec("INSERT INTO " + tbl + " (id, a) VALUES (0, 'a')");
+ q.exec("INSERT INTO " + tbl + " (id, a) VALUES (1, 'b')");
+ q.exec("INSERT INTO " + tbl + " (id, a) VALUES (2, 'c')");
+
+ QSqlTableModel model(0, db);
+ model.setEditStrategy(QSqlTableModel::OnFieldChange);
+ model.setTable(tbl);
+ model.setSort(0, Qt::AscendingOrder);
+ QVERIFY_SQL(model, select());
+
+ QCOMPARE(model.rowCount(), 3);
+ QCOMPARE(model.columnCount(), 2);
+
+ QModelIndex idx = model.index(1, 1);
+
+ // Check if selectRow() refreshes an unchanged row.
+ // Row is not in cache yet.
+ q.exec("UPDATE " + tbl + " SET a = 'Qt' WHERE id = 1");
+ QCOMPARE(model.data(idx).toString(), QString("b"));
+ model.selectRow(1);
+ QCOMPARE(model.data(idx).toString(), QString("Qt"));
+
+ // Check if selectRow() refreshes a changed row.
+ // Row is already in the cache.
+ model.setData(idx, QString("b"));
+ QCOMPARE(model.data(idx).toString(), QString("b"));
+ q.exec("UPDATE " + tbl + " SET a = 'Qt' WHERE id = 1");
+ QCOMPARE(model.data(idx).toString(), QString("b"));
+ model.selectRow(1);
+ QCOMPARE(model.data(idx).toString(), QString("Qt"));
+
+ q.exec("DELETE FROM " + tbl);
+}
+
void tst_QSqlTableModel::insertColumns()
{
// Just like the select test, with extra stuff