summaryrefslogtreecommitdiffstats
path: root/src/sql
diff options
context:
space:
mode:
Diffstat (limited to 'src/sql')
-rw-r--r--src/sql/drivers/sqlite2/qsql_sqlite2.cpp4
-rw-r--r--src/sql/kernel/qsqlfield.cpp6
-rw-r--r--src/sql/models/qsqltablemodel.cpp99
3 files changed, 48 insertions, 61 deletions
diff --git a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp
index b42f82e800..2ffd88e8c5 100644
--- a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp
+++ b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp
@@ -53,7 +53,7 @@
#include <qstringlist.h>
#include <qvector.h>
-#if !defined Q_WS_WIN32
+#if !defined Q_OS_WIN
# include <unistd.h>
#endif
#include <sqlite.h>
@@ -208,7 +208,7 @@ bool QSQLite2ResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int
// keep trying while busy, wish I could implement this better.
while ((res = sqlite_step(currentMachine, &colNum, &fvals, &cnames)) == SQLITE_BUSY) {
// sleep instead requesting result again immidiately.
-#if defined Q_WS_WIN32
+#if defined Q_OS_WIN
Sleep(1000);
#else
sleep(1);
diff --git a/src/sql/kernel/qsqlfield.cpp b/src/sql/kernel/qsqlfield.cpp
index 5d01df1b8e..3160d25ef5 100644
--- a/src/sql/kernel/qsqlfield.cpp
+++ b/src/sql/kernel/qsqlfield.cpp
@@ -504,7 +504,6 @@ bool QSqlField::isValid() const
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QSqlField &f)
{
-#ifndef Q_BROKEN_DEBUG_STREAM
dbg.nospace() << "QSqlField(" << f.name() << ", " << QVariant::typeToName(f.type());
if (f.length() >= 0)
dbg.nospace() << ", length: " << f.length();
@@ -520,11 +519,6 @@ QDebug operator<<(QDebug dbg, const QSqlField &f)
dbg.nospace() << ", auto-value: \"" << f.defaultValue() << '\"';
dbg.nospace() << ')';
return dbg.space();
-#else
- qWarning("This compiler doesn't support streaming QSqlField to QDebug");
- return dbg;
- Q_UNUSED(f);
-#endif
}
#endif
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp
index 932bbbfd6b..571c28f515 100644
--- a/src/sql/models/qsqltablemodel.cpp
+++ b/src/sql/models/qsqltablemodel.cpp
@@ -378,13 +378,19 @@ bool QSqlTableModel::select()
if (query.isEmpty())
return false;
- // clear the submitted flags so revertAll can do its job
- for (QSqlTableModelPrivate::CacheMap::Iterator it = d->cache.begin();
- it != d->cache.constEnd();
- ++it)
- it.value().setSubmitted(false);
+ QSqlTableModelPrivate::CacheMap::Iterator it = d->cache.end();
+ while (it != d->cache.constBegin()) {
+ --it;
+ // rows must be accounted for
+ if (it.value().op() == QSqlTableModelPrivate::Insert) {
+ beginRemoveRows(QModelIndex(), it.key(), it.key());
+ it = d->cache.erase(it);
+ endRemoveRows();
+ } else {
+ it = d->cache.erase(it);
+ }
+ }
- revertAll();
QSqlQuery qu(query, d->db);
setQuery(qu);
@@ -439,13 +445,11 @@ QVariant QSqlTableModel::headerData(int section, Qt::Orientation orientation, in
{
Q_D(const QSqlTableModel);
if (orientation == Qt::Vertical && role == Qt::DisplayRole) {
- if (d->cache.contains(section)) {
- const QSqlTableModelPrivate::Op op = d->cache.value(section).op();
- if (op == QSqlTableModelPrivate::Insert)
- return QLatin1String("*");
- else if (op == QSqlTableModelPrivate::Delete)
- return QLatin1String("!");
- }
+ const QSqlTableModelPrivate::Op op = d->cache.value(section).op();
+ if (op == QSqlTableModelPrivate::Insert)
+ return QLatin1String("*");
+ else if (op == QSqlTableModelPrivate::Delete)
+ return QLatin1String("!");
}
return QSqlQueryModel::headerData(section, orientation, role);
}
@@ -463,23 +467,14 @@ bool QSqlTableModel::isDirty(const QModelIndex &index) const
if (!index.isValid())
return false;
- switch (d->strategy) {
- case OnFieldChange:
- return false;
- case OnRowChange: {
- const QSqlTableModelPrivate::ModifiedRow row = d->cache.value(index.row());
- return row.op() == QSqlTableModelPrivate::Update
- && row.rec().isGenerated(index.column());
- }
- case OnManualSubmit: {
- const QSqlTableModelPrivate::ModifiedRow row = d->cache.value(index.row());
- return row.op() == QSqlTableModelPrivate::Insert
- || row.op() == QSqlTableModelPrivate::Delete
- || (row.op() == QSqlTableModelPrivate::Update
- && row.rec().isGenerated(index.column()));
- }
- }
- return false;
+ const QSqlTableModelPrivate::ModifiedRow row = d->cache.value(index.row());
+ if (row.submitted())
+ return false;
+
+ return row.op() == QSqlTableModelPrivate::Insert
+ || row.op() == QSqlTableModelPrivate::Delete
+ || (row.op() == QSqlTableModelPrivate::Update
+ && row.rec().isGenerated(index.column()));
}
/*!
@@ -513,10 +508,9 @@ bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, in
QSqlTableModelPrivate::ModifiedRow &row = d->cache[index.row()];
- if (row.op() == QSqlTableModelPrivate::None) {
+ if (row.op() == QSqlTableModelPrivate::None)
row = QSqlTableModelPrivate::ModifiedRow(QSqlTableModelPrivate::Update,
d->rec);
- }
row.setValue(index.column(), value);
emit dataChanged(index, index);
@@ -659,7 +653,7 @@ bool QSqlTableModel::deleteRowFromTable(int row)
Note: In OnManualSubmit mode, already submitted changes won't
be cleared from the cache when submitAll() fails. This allows
- transactions to be rolled back and resubmitted again without
+ transactions to be rolled back and resubmitted without
losing data.
\sa revertAll(), lastError()
@@ -693,19 +687,6 @@ bool QSqlTableModel::submitAll()
it.value().setSubmitted(true);
}
- // all changes have been committed
-
- // clean up inserted rows
- QSqlTableModelPrivate::CacheMap::Iterator it = d->cache.end();
- while (it != d->cache.constBegin()) {
- --it;
- if (it.value().op() == QSqlTableModelPrivate::Insert) {
- beginRemoveRows(QModelIndex(), it.key(), it.key());
- it = d->cache.erase(it);
- endRemoveRows();
- }
- }
- d->clearCache();
return select();
}
@@ -1050,6 +1031,8 @@ bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent)
Returns false if the parameters are out of bounds; otherwise
returns true.
+ Does not submit rows, regardless of edit strategy, not even OnFieldChange.
+
\sa primeInsert(), insertRecord()
*/
bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent)
@@ -1097,7 +1080,11 @@ bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent)
Returns true if the record could be inserted, otherwise false.
- \sa insertRows(), removeRows()
+ Changes are submitted immediately for OnFieldChange and
+ OnRowChange. Note the contrast with setRecord() in respect to
+ OnRowChange.
+
+ \sa insertRows(), removeRows(), setRecord()
*/
bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record)
{
@@ -1210,9 +1197,15 @@ Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const
Returns true if all the values could be set; otherwise returns
false.
- \sa record()
+ The edit strategy affects automatic submitting.
+ With OnFieldChange, setRecord() commits its changed row.
+ With OnRowChange, setRecord() does not commit its changed row,
+ but making a change to another row causes previous changes to
+ be submitted.
+
+ \sa record(), editStrategy()
*/
-bool QSqlTableModel::setRecord(int row, const QSqlRecord &record)
+bool QSqlTableModel::setRecord(int row, const QSqlRecord &values)
{
Q_D(QSqlTableModel);
Q_ASSERT_X(row >= 0, "QSqlTableModel::setRecord()", "Cannot set a record to a row less than 0");
@@ -1230,9 +1223,9 @@ bool QSqlTableModel::setRecord(int row, const QSqlRecord &record)
// Check field names and remember mapping
typedef QMap<int, int> Map;
Map map;
- for (int i = 0; i < record.count(); ++i) {
- if (record.isGenerated(i)) {
- int idx = d->nameToIndex(record.fieldName(i));
+ for (int i = 0; i < values.count(); ++i) {
+ if (values.isGenerated(i)) {
+ int idx = d->nameToIndex(values.fieldName(i));
if (idx == -1)
return false;
map[i] = idx;
@@ -1247,7 +1240,7 @@ bool QSqlTableModel::setRecord(int row, const QSqlRecord &record)
Map::const_iterator i = map.constBegin();
const Map::const_iterator e = map.constEnd();
for ( ; i != e; ++i)
- mrow.setValue(i.value(), record.value(i.key()));
+ mrow.setValue(i.value(), values.value(i.key()));
if (columnCount())
emit dataChanged(createIndex(row, 0), createIndex(row, columnCount() - 1));