summaryrefslogtreecommitdiffstats
path: root/src/sql
diff options
context:
space:
mode:
authorMark Brand <mabrand@mabrand.nl>2012-02-16 02:38:02 +0100
committerQt by Nokia <qt-info@nokia.com>2012-03-07 00:01:22 +0100
commit291e2c7d5416af4d16dc0a6e60df7980ba745a3d (patch)
treedf0e4113ebed07a657a7acb6f96ba52eddc9ee51 /src/sql
parentb979956ec46093e5668c2b264f9b68da3cbb0326 (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.cpp43
-rw-r--r--src/sql/models/qsqltablemodel.h1
-rw-r--r--src/sql/models/qsqltablemodel_p.h14
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()
{