return true;
}
+QSqlRecord QSqlTableModelPrivate::primaryValues(const QSqlRecord &rec, const QSqlRecord &pIndex)
+{
+ QSqlRecord pValues(pIndex);
+
+ for (int i = pValues.count() - 1; i >= 0; --i)
+ pValues.setValue(i, rec.value(pValues.fieldName(i)));
+
+ return pValues;
+}
+
QSqlRecord QSqlTableModelPrivate::primaryValues(int row) const
{
- return cache.value(row).primaryValues(primaryIndex.isEmpty() ? rec : primaryIndex);
+ Q_Q(const QSqlTableModel);
+
+ const QSqlRecord &pIndex = primaryIndex.isEmpty() ? rec : primaryIndex;
+
+ ModifiedRow mr = cache.value(row);
+ if (mr.op() != None)
+ return mr.primaryValues(pIndex);
+ else
+ return primaryValues(q->QSqlQueryModel::record(row), pIndex);
}
/*!
busyInsertingRows(false)
{}
void clear();
+ static QSqlRecord primaryValues(const QSqlRecord &rec, const QSqlRecord &pIndex);
QSqlRecord primaryValues(int index) const;
virtual void clearCache();
QSqlRecord record(const QVector<QVariant> &values) const;
if (m_op == None || m_op == Insert)
return QSqlRecord();
- QSqlRecord values(pi);
-
- for (int i = values.count() - 1; i >= 0; --i)
- values.setValue(i, m_db_values.value(values.fieldName(i)));
-
- return values;
+ return QSqlTableModelPrivate::primaryValues(m_db_values, pi);
}
private:
inline static void setGenerated(QSqlRecord& r, bool g)
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(); }
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