summaryrefslogtreecommitdiffstats
path: root/src/sql
diff options
context:
space:
mode:
authorMark Brand <mabrand@mabrand.nl>2012-09-28 12:22:55 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-10-05 03:16:25 +0200
commit244eeae406b83227f08ea01f9417c07ecc3cf133 (patch)
treec442a81392b1e5f4cc55d7fc3c71d543a26e9833 /src/sql
parentc1f15c0485e6eedac6c6b4d949dbc7e2ed33091e (diff)
QSqlTableModel::selectRow(): don't expand cache if there is no change
Test added. Change-Id: Ibd72ef2aeee482abbd22991573460e55dc577457 Reviewed-by: Marc Mutz <marc.mutz@kdab.com> Reviewed-by: David Faure (fixes for KDE) <faure@kde.org>
Diffstat (limited to 'src/sql')
-rw-r--r--src/sql/models/qsqltablemodel.cpp30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp
index 29e9367cca..5feb3087b8 100644
--- a/src/sql/models/qsqltablemodel.cpp
+++ b/src/sql/models/qsqltablemodel.cpp
@@ -439,18 +439,40 @@ bool QSqlTableModel::selectRow(int row)
if (stmt.isEmpty())
return false;
+ bool exists;
+ QSqlRecord newValues;
+
{
QSqlQuery q(d->db);
q.setForwardOnly(true);
if (!q.exec(stmt))
return false;
- bool exists = q.next();
- d->cache[row].refresh(exists, q.record());
+ exists = q.next();
+ newValues = q.record();
+ }
+
+ bool needsAddingToCache = !exists || d->cache.contains(row);
+
+ if (!needsAddingToCache) {
+ const QSqlRecord curValues = record(row);
+ needsAddingToCache = curValues.count() != newValues.count();
+ if (!needsAddingToCache) {
+ // Look for changed values. Primary key fields are customarily first
+ // and probably change less often than other fields, so start at the end.
+ for (int f = curValues.count() - 1; f >= 0; --f) {
+ if (curValues.value(f) != newValues.value(f))
+ needsAddingToCache = true;
+ break;
+ }
+ }
}
- emit headerDataChanged(Qt::Vertical, row, row);
- emit dataChanged(createIndex(row, 0), createIndex(row, columnCount() - 1));
+ if (needsAddingToCache) {
+ d->cache[row].refresh(exists, newValues);
+ emit headerDataChanged(Qt::Vertical, row, row);
+ emit dataChanged(createIndex(row, 0), createIndex(row, columnCount() - 1));
+ }
return true;
}