summaryrefslogtreecommitdiffstats
path: root/src/sql/models
diff options
context:
space:
mode:
Diffstat (limited to 'src/sql/models')
-rw-r--r--src/sql/models/qsqlquerymodel.cpp85
-rw-r--r--src/sql/models/qsqlquerymodel.h2
-rw-r--r--src/sql/models/qsqlquerymodel_p.h3
-rw-r--r--src/sql/models/qsqltablemodel.cpp17
4 files changed, 57 insertions, 50 deletions
diff --git a/src/sql/models/qsqlquerymodel.cpp b/src/sql/models/qsqlquerymodel.cpp
index 7b884edab8..85869e41ac 100644
--- a/src/sql/models/qsqlquerymodel.cpp
+++ b/src/sql/models/qsqlquerymodel.cpp
@@ -78,9 +78,11 @@ void QSqlQueryModelPrivate::prefetch(int limit)
atEnd = true; // this is the end.
}
if (newBottom.row() >= 0 && newBottom.row() > bottom.row()) {
- q->beginInsertRows(QModelIndex(), bottom.row() + 1, newBottom.row());
+ if (!resetting)
+ q->beginInsertRows(QModelIndex(), bottom.row() + 1, newBottom.row());
bottom = newBottom;
- q->endInsertRows();
+ if (!resetting)
+ q->endInsertRows();
} else {
bottom = newBottom;
}
@@ -208,6 +210,28 @@ bool QSqlQueryModel::canFetchMore(const QModelIndex &parent) const
return (!parent.isValid() && !d->atEnd);
}
+/*! \reimp
+ */
+void QSqlQueryModel::beginResetModel()
+{
+ Q_D(QSqlQueryModel);
+ if (!d->resetting) {
+ QAbstractTableModel::beginResetModel();
+ d->resetting = true;
+ }
+}
+
+/*! \reimp
+ */
+void QSqlQueryModel::endResetModel()
+{
+ Q_D(QSqlQueryModel);
+ if (d->resetting) {
+ d->resetting = false;
+ QAbstractTableModel::endResetModel();
+ }
+}
+
/*! \fn int QSqlQueryModel::rowCount(const QModelIndex &parent) const
\since 4.1
@@ -317,60 +341,47 @@ void QSqlQueryModel::queryChange()
void QSqlQueryModel::setQuery(const QSqlQuery &query)
{
Q_D(QSqlQueryModel);
+ beginResetModel();
+
QSqlRecord newRec = query.record();
bool columnsChanged = (newRec != d->rec);
- bool hasQuerySize = query.driver()->hasFeature(QSqlDriver::QuerySize);
- bool hasNewData = (newRec != QSqlRecord()) || !query.lastError().isValid();
if (d->colOffsets.size() != newRec.count() || columnsChanged)
d->initColOffsets(newRec.count());
- bool mustClearModel = d->bottom.isValid();
- if (mustClearModel) {
- d->atEnd = true;
- beginRemoveRows(QModelIndex(), 0, qMax(d->bottom.row(), 0));
- d->bottom = QModelIndex();
- }
-
+ d->bottom = QModelIndex();
d->error = QSqlError();
d->query = query;
d->rec = newRec;
+ d->atEnd = true;
- if (mustClearModel)
- endRemoveRows();
-
- d->atEnd = false;
-
- if (columnsChanged && hasNewData)
- reset();
+ if (query.isForwardOnly()) {
+ d->error = QSqlError(QLatin1String("Forward-only queries "
+ "cannot be used in a data model"),
+ QString(), QSqlError::ConnectionError);
+ endResetModel();
+ return;
+ }
- if (!query.isActive() || query.isForwardOnly()) {
- d->atEnd = true;
- d->bottom = QModelIndex();
- if (query.isForwardOnly())
- d->error = QSqlError(QLatin1String("Forward-only queries "
- "cannot be used in a data model"),
- QString(), QSqlError::ConnectionError);
- else
- d->error = query.lastError();
+ if (!query.isActive()) {
+ d->error = query.lastError();
+ endResetModel();
return;
}
- QModelIndex newBottom;
- if (hasQuerySize && d->query.size() > 0) {
- newBottom = createIndex(d->query.size() - 1, d->rec.count() - 1);
- beginInsertRows(QModelIndex(), 0, qMax(0, newBottom.row()));
- d->bottom = createIndex(d->query.size() - 1, columnsChanged ? 0 : d->rec.count() - 1);
- d->atEnd = true;
- endInsertRows();
+
+ if (query.driver()->hasFeature(QSqlDriver::QuerySize) && d->query.size() > 0) {
+ d->bottom = createIndex(d->query.size() - 1, d->rec.count() - 1);
} else {
- newBottom = createIndex(-1, d->rec.count() - 1);
+ d->bottom = createIndex(-1, d->rec.count() - 1);
+ d->atEnd = false;
}
- d->bottom = newBottom;
- queryChange();
// fetchMore does the rowsInserted stuff for incremental models
fetchMore();
+
+ endResetModel();
+ queryChange();
}
/*! \overload
diff --git a/src/sql/models/qsqlquerymodel.h b/src/sql/models/qsqlquerymodel.h
index b5e1a7a746..89b72c8222 100644
--- a/src/sql/models/qsqlquerymodel.h
+++ b/src/sql/models/qsqlquerymodel.h
@@ -90,6 +90,8 @@ public:
bool canFetchMore(const QModelIndex &parent = QModelIndex()) const;
protected:
+ void beginResetModel();
+ void endResetModel();
virtual void queryChange();
virtual QModelIndex indexInQuery(const QModelIndex &item) const;
diff --git a/src/sql/models/qsqlquerymodel_p.h b/src/sql/models/qsqlquerymodel_p.h
index 6e0349f032..3288d311a4 100644
--- a/src/sql/models/qsqlquerymodel_p.h
+++ b/src/sql/models/qsqlquerymodel_p.h
@@ -67,7 +67,7 @@ class QSqlQueryModelPrivate: public QAbstractItemModelPrivate
{
Q_DECLARE_PUBLIC(QSqlQueryModel)
public:
- QSqlQueryModelPrivate() : atEnd(false) {}
+ QSqlQueryModelPrivate() : atEnd(false), resetting(false) {}
~QSqlQueryModelPrivate();
void prefetch(int);
@@ -80,6 +80,7 @@ public:
uint atEnd : 1;
QVector<QHash<int, QVariant> > headers;
QVarLengthArray<int, 56> colOffsets; // used to calculate indexInQuery of columns
+ bool resetting;
};
// helpers for building SQL expressions
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp
index f7198978dd..40315da204 100644
--- a/src/sql/models/qsqltablemodel.cpp
+++ b/src/sql/models/qsqltablemodel.cpp
@@ -364,18 +364,9 @@ bool QSqlTableModel::select()
if (query.isEmpty())
return false;
- QSqlTableModelPrivate::CacheMap::Iterator it = d->cache.end();
- while (it != d->cache.constBegin()) {
- --it;
- // rows must be accounted for
- if (it.value().insert()) {
- beginRemoveRows(QModelIndex(), it.key(), it.key());
- it = d->cache.erase(it);
- endRemoveRows();
- } else {
- it = d->cache.erase(it);
- }
- }
+ beginResetModel();
+
+ d->clearCache();
QSqlQuery qu(query, d->db);
setQuery(qu);
@@ -383,8 +374,10 @@ bool QSqlTableModel::select()
if (!qu.isActive() || lastError().isValid()) {
// something went wrong - revert to non-select state
d->initRecordAndPrimaryIndex();
+ endResetModel();
return false;
}
+ endResetModel();
return true;
}