QSqlTableModel: long live selectRow()!
authorMark Brand <mabrand@mabrand.nl>
Thu, 16 Feb 2012 01:38:02 +0000 (02:38 +0100)
committerQt by Nokia <qt-info@nokia.com>
Tue, 6 Mar 2012 23:01:22 +0000 (00:01 +0100)
Change-Id: If26dbcc8a1e8ef1376ef7a688c946ce5270e5706
Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>
src/sql/models/qsqltablemodel.cpp
src/sql/models/qsqltablemodel.h
src/sql/models/qsqltablemodel_p.h

index 9ade5f1..40230c3 100644 (file)
@@ -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
index 38e9220..13316bc 100644 (file)
@@ -67,6 +67,7 @@ public:
     virtual ~QSqlTableModel();
 
     virtual bool select();
+    virtual bool selectRow(int row);
 
     virtual void setTable(const QString &tableName);
     QString tableName() const;
index ba2fdf5..323964a 100644 (file)
@@ -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()
         {