diff options
Diffstat (limited to 'src/sql/models/qsqltablemodel.cpp')
-rw-r--r-- | src/sql/models/qsqltablemodel.cpp | 101 |
1 files changed, 43 insertions, 58 deletions
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp index d8d691fa0c..20d2be36e1 100644 --- a/src/sql/models/qsqltablemodel.cpp +++ b/src/sql/models/qsqltablemodel.cpp @@ -55,6 +55,8 @@ QT_BEGIN_NAMESPACE +typedef QSqlTableModelSql Sql; + /*! \internal Populates our record with values. */ @@ -84,12 +86,9 @@ int QSqlTableModelPrivate::insertCount(int maxRow) const int cnt = 0; CacheMap::ConstIterator i = cache.constBegin(); const CacheMap::ConstIterator e = cache.constEnd(); - for (; - i != e && (maxRow < 0 || i.key() <= maxRow); - ++i) { + for ( ; i != e && (maxRow < 0 || i.key() <= maxRow); ++i) if (i.value().insert()) ++cnt; - } return cnt; } @@ -175,14 +174,12 @@ bool QSqlTableModelPrivate::exec(const QString &stmt, bool prepStatement, } } int i; - for (i = 0; i < rec.count(); ++i) { + for (i = 0; i < rec.count(); ++i) if (rec.isGenerated(i)) editQuery.addBindValue(rec.value(i)); - } - for (i = 0; i < whereValues.count(); ++i) { + for (i = 0; i < whereValues.count(); ++i) if (whereValues.isGenerated(i) && !whereValues.isNull(i)) editQuery.addBindValue(whereValues.value(i)); - } if (!editQuery.exec()) { error = editQuery.lastError(); @@ -363,7 +360,7 @@ QString QSqlTableModel::tableName() const bool QSqlTableModel::select() { Q_D(QSqlTableModel); - QString query = selectStatement(); + const QString query = selectStatement(); if (query.isEmpty()) return false; @@ -416,8 +413,9 @@ bool QSqlTableModel::selectRow(int row) d->tableName, d->primaryValues(row), false); - if (d->filter.startsWith(QLatin1String("WHERE "), Qt::CaseInsensitive)) - d->filter.remove(0, 6); + static const QString wh = Sql::where() + Sql::sp(); + if (d->filter.startsWith(wh, Qt::CaseInsensitive)) + d->filter.remove(0, wh.length()); const QString stmt = selectStatement(); d->sortColumn = table_sort_col; d->filter = table_filter; @@ -593,20 +591,19 @@ bool QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values) emit beforeUpdate(row, rec); const QSqlRecord whereValues = d->primaryValues(row); - bool prepStatement = d->db.driver()->hasFeature(QSqlDriver::PreparedQueries); - QString stmt = d->db.driver()->sqlStatement(QSqlDriver::UpdateStatement, d->tableName, - rec, prepStatement); - QString where = d->db.driver()->sqlStatement(QSqlDriver::WhereStatement, d->tableName, - whereValues, prepStatement); + const bool prepStatement = d->db.driver()->hasFeature(QSqlDriver::PreparedQueries); + const QString stmt = d->db.driver()->sqlStatement(QSqlDriver::UpdateStatement, d->tableName, + rec, prepStatement); + const QString where = d->db.driver()->sqlStatement(QSqlDriver::WhereStatement, d->tableName, + whereValues, prepStatement); if (stmt.isEmpty() || where.isEmpty() || row < 0 || row >= rowCount()) { d->error = QSqlError(QLatin1String("No Fields to update"), QString(), QSqlError::StatementError); return false; } - stmt.append(QLatin1Char(' ')).append(where); - return d->exec(stmt, prepStatement, rec, whereValues); + return d->exec(Sql::concat(stmt, where), prepStatement, rec, whereValues); } @@ -629,9 +626,9 @@ bool QSqlTableModel::insertRowIntoTable(const QSqlRecord &values) QSqlRecord rec = values; emit beforeInsert(rec); - bool prepStatement = d->db.driver()->hasFeature(QSqlDriver::PreparedQueries); - QString stmt = d->db.driver()->sqlStatement(QSqlDriver::InsertStatement, d->tableName, - rec, prepStatement); + const bool prepStatement = d->db.driver()->hasFeature(QSqlDriver::PreparedQueries); + const QString stmt = d->db.driver()->sqlStatement(QSqlDriver::InsertStatement, d->tableName, + rec, prepStatement); if (stmt.isEmpty()) { d->error = QSqlError(QLatin1String("No Fields to update"), QString(), @@ -660,24 +657,23 @@ bool QSqlTableModel::deleteRowFromTable(int row) emit beforeDelete(row); const QSqlRecord whereValues = d->primaryValues(row); - bool prepStatement = d->db.driver()->hasFeature(QSqlDriver::PreparedQueries); - QString stmt = d->db.driver()->sqlStatement(QSqlDriver::DeleteStatement, - d->tableName, - QSqlRecord(), - prepStatement); - QString where = d->db.driver()->sqlStatement(QSqlDriver::WhereStatement, - d->tableName, - whereValues, - prepStatement); + const bool prepStatement = d->db.driver()->hasFeature(QSqlDriver::PreparedQueries); + const QString stmt = d->db.driver()->sqlStatement(QSqlDriver::DeleteStatement, + d->tableName, + QSqlRecord(), + prepStatement); + const QString where = d->db.driver()->sqlStatement(QSqlDriver::WhereStatement, + d->tableName, + whereValues, + prepStatement); if (stmt.isEmpty() || where.isEmpty()) { d->error = QSqlError(QLatin1String("Unable to delete row"), QString(), QSqlError::StatementError); return false; } - stmt.append(QLatin1Char(' ')).append(where); - return d->exec(stmt, prepStatement, QSqlRecord() /* no new values */, whereValues); + return d->exec(Sql::concat(stmt, where), prepStatement, QSqlRecord() /* no new values */, whereValues); } /*! @@ -838,9 +834,8 @@ void QSqlTableModel::revertAll() Q_D(QSqlTableModel); const QList<int> rows(d->cache.keys()); - for (int i = rows.size() - 1; i >= 0; --i) { + for (int i = rows.size() - 1; i >= 0; --i) revertRow(rows.value(i)); - } } /*! @@ -929,19 +924,16 @@ void QSqlTableModel::setSort(int column, Qt::SortOrder order) QString QSqlTableModel::orderByClause() const { Q_D(const QSqlTableModel); - QString s; QSqlField f = d->rec.field(d->sortColumn); if (!f.isValid()) - return s; - - QString table = d->tableName; + return QString(); + //we can safely escape the field because it would have been obtained from the database //and have the correct case QString field = d->db.driver()->escapeIdentifier(f.name(), QSqlDriver::FieldName); - s.append(QLatin1String("ORDER BY ")).append(table).append(QLatin1Char('.')).append(field); - s += d->sortOrder == Qt::AscendingOrder ? QLatin1String(" ASC") : QLatin1String(" DESC"); - - return s; + field.prepend(QLatin1Char('.')).prepend(d->tableName); + field = d->sortOrder == Qt::AscendingOrder ? Sql::asc(field) : Sql::desc(field); + return Sql::orderBy(field); } /*! @@ -964,34 +956,27 @@ int QSqlTableModel::fieldIndex(const QString &fieldName) const QString QSqlTableModel::selectStatement() const { Q_D(const QSqlTableModel); - QString query; if (d->tableName.isEmpty()) { d->error = QSqlError(QLatin1String("No table name given"), QString(), QSqlError::StatementError); - return query; + return QString(); } if (d->rec.isEmpty()) { d->error = QSqlError(QLatin1String("Unable to find table ") + d->tableName, QString(), QSqlError::StatementError); - return query; + return QString(); } - query = d->db.driver()->sqlStatement(QSqlDriver::SelectStatement, - d->tableName, - d->rec, - false); - if (query.isEmpty()) { + const QString stmt = d->db.driver()->sqlStatement(QSqlDriver::SelectStatement, + d->tableName, + d->rec, + false); + if (stmt.isEmpty()) { d->error = QSqlError(QLatin1String("Unable to select fields from table ") + d->tableName, QString(), QSqlError::StatementError); - return query; + return stmt; } - if (!d->filter.isEmpty()) - query.append(QLatin1String(" WHERE ")).append(d->filter); - QString orderBy(orderByClause()); - if (!orderBy.isEmpty()) - query.append(QLatin1Char(' ')).append(orderBy); - - return query; + return Sql::concat(Sql::concat(stmt, Sql::where(d->filter)), orderByClause()); } /*! |