diff options
author | Dheerendra Purohit <[email protected]> | 2024-11-05 20:14:44 +0530 |
---|---|---|
committer | Dheerendra Purohit <[email protected]> | 2024-11-20 10:05:10 +0530 |
commit | 18ec9c7b62f6f1a57cd544bbd2d3e9187f8cd990 (patch) | |
tree | 6550939dd4041913f8d7a21025cad1968b7c435f | |
parent | 365dd7d14c2e0718568352ea4c5faa2c04f4fb58 (diff) |
QSqlQueryModel: New method to re-execute the current query
Add refreshQuery() and refreshQuery(const QSqlDatabase &db) to refresh the model data.
[ChangeLog][QtSql][QSqlQueryModel] Added refreshQuery() and
refreshQuery(const QSqlDatabase &db) to refresh the model data.
Fixes: QTBUG-123603
Change-Id: I6738006dd8ca2fc82f3b4ad88b663c7b353a09f6
Reviewed-by: Christian Ehrlicher <[email protected]>
-rw-r--r-- | src/sql/models/qsqlquerymodel.cpp | 29 | ||||
-rw-r--r-- | src/sql/models/qsqlquerymodel.h | 2 | ||||
-rw-r--r-- | tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp | 59 |
3 files changed, 89 insertions, 1 deletions
diff --git a/src/sql/models/qsqlquerymodel.cpp b/src/sql/models/qsqlquerymodel.cpp index 1aae088c64a..fb338d16dfa 100644 --- a/src/sql/models/qsqlquerymodel.cpp +++ b/src/sql/models/qsqlquerymodel.cpp @@ -470,6 +470,35 @@ void QSqlQueryModel::setQuery(const QString &query, const QSqlDatabase &db) } /*! + \since 6.9 + Re-executes the current query to fetch the data from the same database connection. + + \note \c refreshQuery() is not applicable when the query contains bound values. + + \sa setQuery(QSqlQuery &&query), QSqlQuery::boundValue() +*/ +void QSqlQueryModel::refreshQuery() +{ + Q_D(QSqlQueryModel); + setQuery(d->query.executedQuery()); +} + +/*! + \overload + \since 6.9 + Re-executes the current query to fetch the data from the given database connection \a db. + + \note \c refreshQuery(const QSqlDatabase &db) is not applicable when the query contains bound values. + + \sa setQuery(const QString &query, const QSqlDatabase &db), QSqlQuery::boundValue() +*/ +void QSqlQueryModel::refreshQuery(const QSqlDatabase &db) +{ + Q_D(QSqlQueryModel); + setQuery(d->query.executedQuery(), db); +} + +/*! Clears the model and releases any acquired resource. */ void QSqlQueryModel::clear() diff --git a/src/sql/models/qsqlquerymodel.h b/src/sql/models/qsqlquerymodel.h index 73308b79e84..f9fddbb9752 100644 --- a/src/sql/models/qsqlquerymodel.h +++ b/src/sql/models/qsqlquerymodel.h @@ -46,6 +46,8 @@ public: #endif void setQuery(QSqlQuery &&query); void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase()); + void refreshQuery(); + void refreshQuery(const QSqlDatabase &db); #if QT_SQL_REMOVED_SINCE(6, 5) QSqlQuery query() const; #endif diff --git a/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp b/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp index eeafef15fa9..dbe1f998cf2 100644 --- a/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp +++ b/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp @@ -59,7 +59,10 @@ private slots: void task_180617(); void task_180617_data() { generic_data(); } void task_QTBUG_4963_setHeaderDataWithProxyModel(); - + void refreshQuery_data() { generic_data(); } + void refreshQuery(); + void refreshQueryWithBoundValues_data() { generic_data(); } + void refreshQueryWithBoundValues(); private: void generic_data(const QString &engine = QString()); void dropTestTables(const QSqlDatabase &db); @@ -660,5 +663,59 @@ void tst_QSqlQueryModel::task_QTBUG_4963_setHeaderDataWithProxyModel() // And it should not crash. } +void tst_QSqlQueryModel::refreshQuery() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + QSqlQueryModel model; + + model.setQuery("SELECT * FROM " + qTableName("test", __FILE__, db), db); + QCOMPARE(model.rowCount(), 2); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); + QCOMPARE(model.data(model.index(0, 2)).toInt(), 1); + + QSqlQuery(db).exec("UPDATE " + qTableName("test", __FILE__, QSqlDatabase::database(dbName)) + + " SET name = 'updated_harry' WHERE id = 1"); + model.refreshQuery(db); + QCOMPARE(model.rowCount(), 2); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("updated_harry")); + QCOMPARE(model.data(model.index(0, 2)).toInt(), 1); + + // Resetting the name to "harry" in the table + QSqlQuery(db).exec("UPDATE " + qTableName("test", __FILE__, QSqlDatabase::database(dbName)) + + " SET name = 'harry' WHERE id = 1"); +} + +void tst_QSqlQueryModel::refreshQueryWithBoundValues() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + QSqlQueryModel model; + + QSqlQuery query(db); + query.prepare("SELECT name FROM " + qTableName("test", __FILE__, db) + " WHERE id = :id"); + query.bindValue(":id", 1); + query.exec(); + model.setQuery(query); + + QCOMPARE(model.rowCount(), 1); + QCOMPARE(model.data(model.index(0, 0)).toString(), QString("harry")); + + QSqlQuery(db).exec("UPDATE " + qTableName("test", __FILE__, QSqlDatabase::database(dbName)) + + " SET name = 'updated_harry' WHERE id = 1"); + model.refreshQuery(db); + QCOMPARE(model.rowCount(), 0); + QCOMPARE_NE(model.data(model.index(0, 0)).toString(), QString("updated_harry")); + QCOMPARE(model.data(model.index(0, 0)).toString(), QString("")); + + // Resetting the name to "harry" in the table + QSqlQuery(db).exec("UPDATE " + qTableName("test", __FILE__, QSqlDatabase::database(dbName)) + + " SET name = 'harry' WHERE id = 1"); +} + + + QTEST_MAIN(tst_QSqlQueryModel) #include "tst_qsqlquerymodel.moc" |