diff options
author | Mark Brand <mabrand@mabrand.nl> | 2012-02-16 02:38:02 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-07 00:01:22 +0100 |
commit | 291e2c7d5416af4d16dc0a6e60df7980ba745a3d (patch) | |
tree | df0e4113ebed07a657a7acb6f96ba52eddc9ee51 /src/sql | |
parent | b979956ec46093e5668c2b264f9b68da3cbb0326 (diff) |
QSqlTableModel: long live selectRow()!
Change-Id: If26dbcc8a1e8ef1376ef7a688c946ce5270e5706
Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>
Diffstat (limited to 'src/sql')
-rw-r--r-- | src/sql/models/qsqltablemodel.cpp | 43 | ||||
-rw-r--r-- | src/sql/models/qsqltablemodel.h | 1 | ||||
-rw-r--r-- | src/sql/models/qsqltablemodel_p.h | 14 |
3 files changed, 58 insertions, 0 deletions
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp index 9ade5f14d5..40230c3043 100644 --- a/src/sql/models/qsqltablemodel.cpp +++ b/src/sql/models/qsqltablemodel.cpp @@ -392,6 +392,49 @@ bool QSqlTableModel::select() } /*! + Refreshes \a row in the model with values from the database table row matching + on primary key values. Without a primary key, all column values must match. If + no matching row is found, the model will show an empty row. + + Returns true if successful; otherwise returns false. + + \sa select() +*/ +bool QSqlTableModel::selectRow(int row) +{ + Q_D(QSqlTableModel); + + if (row < 0 || row >= rowCount()) + return false; + + const int table_sort_col = d->sortColumn; + d->sortColumn = -1; + const QString table_filter = d->filter; + d->filter = d->db.driver()->sqlStatement(QSqlDriver::WhereStatement, + d->tableName, + d->primaryValues(row), + false); + if (d->filter.startsWith(QLatin1String("WHERE "), Qt::CaseInsensitive)) + d->filter.remove(0, 6); + const QString stmt = selectStatement(); + d->sortColumn = table_sort_col; + d->filter = table_filter; + + QSqlQuery q(d->db); + q.setForwardOnly(true); + if (!q.exec(stmt)) + return false; + + bool exists = q.next(); + d->cache[row].refresh(exists, q.record()); + + emit headerDataChanged(Qt::Vertical, row, row); + emit dataChanged(createIndex(row, 0), createIndex(row, columnCount() - 1)); + + return true; +} + +/*! \reimp */ QVariant QSqlTableModel::data(const QModelIndex &index, int role) const diff --git a/src/sql/models/qsqltablemodel.h b/src/sql/models/qsqltablemodel.h index 38e92200c7..13316bc4ed 100644 --- a/src/sql/models/qsqltablemodel.h +++ b/src/sql/models/qsqltablemodel.h @@ -67,6 +67,7 @@ public: virtual ~QSqlTableModel(); virtual bool select(); + virtual bool selectRow(int row); virtual void setTable(const QString &tableName); QString tableName() const; diff --git a/src/sql/models/qsqltablemodel_p.h b/src/sql/models/qsqltablemodel_p.h index ba2fdf5df3..323964afe8 100644 --- a/src/sql/models/qsqltablemodel_p.h +++ b/src/sql/models/qsqltablemodel_p.h @@ -135,6 +135,20 @@ public: setGenerated(m_db_values, true); } } + inline void refresh(bool exists, const QSqlRecord& newvals) + { + m_submitted = true; + if (exists) { + m_op = Update; + m_db_values = newvals; + m_rec = newvals; + setGenerated(m_rec, false); + } else { + m_op = Delete; + m_rec.clear(); + m_db_values.clear(); + } + } inline bool insert() const { return m_insert; } inline void revert() { |