summaryrefslogtreecommitdiffstats
path: root/src/sql
diff options
context:
space:
mode:
authorMark Brand <mabrand@mabrand.nl>2013-03-21 11:34:03 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-04-02 14:31:59 +0200
commit8dfe1385b5f05b7242802a72897258a63af1ca1d (patch)
tree20dda6ac4482ab962f62b9c99eefe383364d1237 /src/sql
parent4131bfb2c28d0554805bbfcf009b422bda820c09 (diff)
QSqlTableModel: expose methods for getting primary values
These methods are very useful in subclasses. Change-Id: Ifdfee9d90cbdad97f349e46b587582f1d9e7cd7a Reviewed-by: Andy Shaw <andy.shaw@digia.com>
Diffstat (limited to 'src/sql')
-rw-r--r--src/sql/kernel/qsqlrecord.cpp15
-rw-r--r--src/sql/kernel/qsqlrecord.h1
-rw-r--r--src/sql/models/qsqltablemodel.cpp49
-rw-r--r--src/sql/models/qsqltablemodel.h1
-rw-r--r--src/sql/models/qsqltablemodel_p.h4
5 files changed, 41 insertions, 29 deletions
diff --git a/src/sql/kernel/qsqlrecord.cpp b/src/sql/kernel/qsqlrecord.cpp
index ad6505c096..4cac5028c3 100644
--- a/src/sql/kernel/qsqlrecord.cpp
+++ b/src/sql/kernel/qsqlrecord.cpp
@@ -524,4 +524,19 @@ QDebug operator<<(QDebug dbg, const QSqlRecord &r)
}
#endif
+/*!
+ \since 5.1
+ Returns a record containing the fields represented in \a keyFields set to values
+ that match by field name.
+*/
+QSqlRecord QSqlRecord::keyValues(const QSqlRecord &keyFields) const
+{
+ QSqlRecord retValues(keyFields);
+
+ for (int i = retValues.count() - 1; i >= 0; --i)
+ retValues.setValue(i, value(retValues.fieldName(i)));
+
+ return retValues;
+}
+
QT_END_NAMESPACE
diff --git a/src/sql/kernel/qsqlrecord.h b/src/sql/kernel/qsqlrecord.h
index bc8c6a8a57..7799b96588 100644
--- a/src/sql/kernel/qsqlrecord.h
+++ b/src/sql/kernel/qsqlrecord.h
@@ -95,6 +95,7 @@ public:
void clear();
void clearValues();
int count() const;
+ QSqlRecord keyValues(const QSqlRecord &keyFields) const;
private:
void detach();
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp
index 2e395b0a59..94623548ed 100644
--- a/src/sql/models/qsqltablemodel.cpp
+++ b/src/sql/models/qsqltablemodel.cpp
@@ -195,29 +195,6 @@ bool QSqlTableModelPrivate::exec(const QString &stmt, bool prepStatement,
return true;
}
-QSqlRecord QSqlTableModelPrivate::primaryValues(const QSqlRecord &rec, const QSqlRecord &pIndex)
-{
- QSqlRecord pValues(pIndex);
-
- for (int i = pValues.count() - 1; i >= 0; --i)
- pValues.setValue(i, rec.value(pValues.fieldName(i)));
-
- return pValues;
-}
-
-QSqlRecord QSqlTableModelPrivate::primaryValues(int row) const
-{
- Q_Q(const QSqlTableModel);
-
- const QSqlRecord &pIndex = primaryIndex.isEmpty() ? rec : primaryIndex;
-
- ModifiedRow mr = cache.value(row);
- if (mr.op() != None)
- return mr.primaryValues(pIndex);
- else
- return primaryValues(q->QSqlQueryModel::record(row), pIndex);
-}
-
/*!
\class QSqlTableModel
\brief The QSqlTableModel class provides an editable data model
@@ -432,7 +409,7 @@ bool QSqlTableModel::selectRow(int row)
const QString table_filter = d->filter;
d->filter = d->db.driver()->sqlStatement(QSqlDriver::WhereStatement,
d->tableName,
- d->primaryValues(row),
+ primaryValues(row),
false);
static const QString wh = Sql::where() + Sql::sp();
if (d->filter.startsWith(wh, Qt::CaseInsensitive))
@@ -652,7 +629,7 @@ bool QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values)
QSqlRecord rec(values);
emit beforeUpdate(row, rec);
- const QSqlRecord whereValues = d->primaryValues(row);
+ const QSqlRecord whereValues = primaryValues(row);
const bool prepStatement = d->db.driver()->hasFeature(QSqlDriver::PreparedQueries);
const QString stmt = d->db.driver()->sqlStatement(QSqlDriver::UpdateStatement, d->tableName,
rec, prepStatement);
@@ -718,7 +695,7 @@ bool QSqlTableModel::deleteRowFromTable(int row)
Q_D(QSqlTableModel);
emit beforeDelete(row);
- const QSqlRecord whereValues = d->primaryValues(row);
+ const QSqlRecord whereValues = primaryValues(row);
const bool prepStatement = d->db.driver()->hasFeature(QSqlDriver::PreparedQueries);
const QString stmt = d->db.driver()->sqlStatement(QSqlDriver::DeleteStatement,
d->tableName,
@@ -1439,4 +1416,24 @@ bool QSqlTableModel::setRecord(int row, const QSqlRecord &values)
return true;
}
+/*!
+ \since 5.1
+ Returns a record containing the fields represented in the primary key set to the values
+ at \a row. If no primary key is defined, the returned record will contain all fields.
+
+ \sa primaryKey()
+*/
+QSqlRecord QSqlTableModel::primaryValues(int row) const
+{
+ Q_D(const QSqlTableModel);
+
+ const QSqlRecord &pIndex = d->primaryIndex.isEmpty() ? d->rec : d->primaryIndex;
+
+ QSqlTableModelPrivate::ModifiedRow mr = d->cache.value(row);
+ if (mr.op() != QSqlTableModelPrivate::None)
+ return mr.primaryValues(pIndex);
+ else
+ return QSqlQueryModel::record(row).keyValues(pIndex);
+}
+
QT_END_NAMESPACE
diff --git a/src/sql/models/qsqltablemodel.h b/src/sql/models/qsqltablemodel.h
index 7a9ffebe8f..1a4ce9b914 100644
--- a/src/sql/models/qsqltablemodel.h
+++ b/src/sql/models/qsqltablemodel.h
@@ -134,6 +134,7 @@ protected:
void setPrimaryKey(const QSqlIndex &key);
void setQuery(const QSqlQuery &query);
QModelIndex indexInQuery(const QModelIndex &item) const;
+ QSqlRecord primaryValues(int row) const;
};
QT_END_NAMESPACE
diff --git a/src/sql/models/qsqltablemodel_p.h b/src/sql/models/qsqltablemodel_p.h
index 825490ea39..c02399166a 100644
--- a/src/sql/models/qsqltablemodel_p.h
+++ b/src/sql/models/qsqltablemodel_p.h
@@ -71,8 +71,6 @@ public:
busyInsertingRows(false)
{}
void clear();
- static QSqlRecord primaryValues(const QSqlRecord &rec, const QSqlRecord &pIndex);
- QSqlRecord primaryValues(int index) const;
virtual void clearCache();
QSqlRecord record(const QVector<QVariant> &values) const;
@@ -170,7 +168,7 @@ public:
if (m_op == None || m_op == Insert)
return QSqlRecord();
- return QSqlTableModelPrivate::primaryValues(m_db_values, pi);
+ return m_db_values.keyValues(pi);
}
private:
inline static void setGenerated(QSqlRecord& r, bool g)