diff options
author | Mark Brand <mabrand@mabrand.nl> | 2012-09-28 12:22:55 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-10-05 03:16:25 +0200 |
commit | 244eeae406b83227f08ea01f9417c07ecc3cf133 (patch) | |
tree | c442a81392b1e5f4cc55d7fc3c71d543a26e9833 /src/sql | |
parent | c1f15c0485e6eedac6c6b4d949dbc7e2ed33091e (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.cpp | 30 |
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; } |