summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/sql/models/qsqltablemodel.cpp14
-rw-r--r--tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp10
2 files changed, 20 insertions, 4 deletions
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp
index 51c717062d..cbb0496447 100644
--- a/src/sql/models/qsqltablemodel.cpp
+++ b/src/sql/models/qsqltablemodel.cpp
@@ -669,7 +669,6 @@ bool QSqlTableModel::submitAll()
case QSqlTableModelPrivate::Insert:
if (!insertRowIntoTable(it.value().rec()))
return false;
- d->bottom = d->bottom.sibling(d->bottom.row() + 1, d->bottom.column());
break;
case QSqlTableModelPrivate::Update:
if (!updateRowInTable(it.key(), it.value().rec()))
@@ -684,6 +683,19 @@ bool QSqlTableModel::submitAll()
break;
}
}
+
+ // all changes have been committed
+
+ // clean up inserted rows
+ QSqlTableModelPrivate::CacheMap::Iterator it = d->cache.end();
+ while (it != d->cache.constBegin()) {
+ --it;
+ if (it.value().op() == QSqlTableModelPrivate::Insert) {
+ beginRemoveRows(QModelIndex(), it.key(), it.key());
+ it = d->cache.erase(it);
+ endRemoveRows();
+ }
+ }
d->clearCache();
return select();
}
diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
index c0bdfae8b7..270de8292b 100644
--- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
+++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
@@ -1199,9 +1199,13 @@ void tst_QSqlTableModel::insertRecordsInLoop()
model.submitAll(); // submitAll() calls select() which clears and repopulates the table
int firstRowIndex = 0, lastRowIndex = 12;
- QCOMPARE(spyRowsRemoved.count(), 1);
- QCOMPARE(spyRowsRemoved.at(0).at(1).toInt(), firstRowIndex);
- QCOMPARE(spyRowsRemoved.at(0).at(2).toInt(), lastRowIndex);
+ QCOMPARE(spyRowsRemoved.count(), 11);
+ // QSqlTableModel emits 10 signals for its 10 inserted rows
+ QCOMPARE(spyRowsRemoved.at(0).at(1).toInt(), lastRowIndex);
+ QCOMPARE(spyRowsRemoved.at(9).at(1).toInt(), firstRowIndex + 3);
+ // QSqlQueryModel emits 1 signal for its 3 rows
+ QCOMPARE(spyRowsRemoved.at(10).at(1).toInt(), firstRowIndex);
+ QCOMPARE(spyRowsRemoved.at(10).at(2).toInt(), firstRowIndex + 2);
QCOMPARE(spyRowsInserted.at(10).at(1).toInt(), firstRowIndex);
QCOMPARE(spyRowsInserted.at(10).at(2).toInt(), lastRowIndex);