diff options
author | Mark Brand <mabrand@mabrand.nl> | 2012-02-10 03:08:36 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-15 02:36:33 +0100 |
commit | 7bced2878047840bb9bca58289fa1aa4119f034a (patch) | |
tree | a256d52c405ce1abd7f77748dc33cf9d867d0834 /src/sql/models/qsqltablemodel.cpp | |
parent | 434c46e8dc838cec0d2a2193701c52cc78ba0862 (diff) |
QSqlTableModel::submitAll(): avoid resubmiting successful changes
Consider what happens the 1st change succeeds and the 2nd fails. No
select will be done. When submitAll() is called again, the 1st will
still seem to be pending. It will fail or have unexpected effects if
the primary values were changed.
The solution is to avoid resubmitting successful changes. We leave
them in the cache so they stay visible. Submitted changes cannot
be reverted of course.
Change-Id: Ibf400555effa1c3801d02f8713b4b69856ede23a
Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>
Diffstat (limited to 'src/sql/models/qsqltablemodel.cpp')
-rw-r--r-- | src/sql/models/qsqltablemodel.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp index 12561ee189..b21a965c21 100644 --- a/src/sql/models/qsqltablemodel.cpp +++ b/src/sql/models/qsqltablemodel.cpp @@ -121,6 +121,11 @@ void QSqlTableModelPrivate::revertCachedRow(int row) { Q_Q(QSqlTableModel); ModifiedRow r = cache.value(row); + + // cannot revert a committed change + if (r.submitted()) + return; + switch (r.op()) { case QSqlTableModelPrivate::None: Q_ASSERT_X(false, "QSqlTableModelPrivate::revertCachedRow()", "Invalid entry in cache map"); @@ -373,6 +378,12 @@ bool QSqlTableModel::select() if (query.isEmpty()) return false; + // clear the submitted flags so revertAll can do its job + for (QSqlTableModelPrivate::CacheMap::Iterator it = d->cache.begin(); + it != d->cache.constEnd(); + ++it) + it.value().setSubmitted(false); + revertAll(); QSqlQuery qu(query, d->db); setQuery(qu); @@ -657,8 +668,11 @@ bool QSqlTableModel::submitAll() { Q_D(QSqlTableModel); - for (QSqlTableModelPrivate::CacheMap::ConstIterator it = d->cache.constBegin(); + for (QSqlTableModelPrivate::CacheMap::Iterator it = d->cache.begin(); it != d->cache.constEnd(); ++it) { + if (it.value().submitted()) + continue; + switch (it.value().op()) { case QSqlTableModelPrivate::Insert: if (!insertRowIntoTable(it.value().rec())) @@ -676,6 +690,7 @@ bool QSqlTableModel::submitAll() Q_ASSERT_X(false, "QSqlTableModel::submitAll()", "Invalid cache operation"); break; } + it.value().setSubmitted(true); } // all changes have been committed |