// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QSQLTABLEMODEL_P_H #define QSQLTABLEMODEL_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of qsql*model.h . This header file may change from version to version // without notice, or even be removed. // // We mean it. // #include #include "private/qsqlquerymodel_p.h" #include "QtSql/qsqlindex.h" #include "QtCore/qmap.h" QT_REQUIRE_CONFIG(sqlmodel); QT_BEGIN_NAMESPACE class Q_AUTOTEST_EXPORT QSqlTableModelPrivate: public QSqlQueryModelPrivate { Q_DECLARE_PUBLIC(QSqlTableModel) public: QSqlTableModelPrivate() : sortColumn(-1), sortOrder(Qt::AscendingOrder), strategy(QSqlTableModel::OnRowChange), busyInsertingRows(false) {} ~QSqlTableModelPrivate(); void clear(); virtual void clearCache(); QSqlRecord record(const QList &values) const; bool exec(const QString &stmt, bool prepStatement, const QSqlRecord &rec, const QSqlRecord &whereValues); virtual void revertCachedRow(int row); virtual int nameToIndex(const QString &name) const; QString strippedFieldName(const QString &name) const; int insertCount(int maxRow = -1) const; void initRecordAndPrimaryIndex(); QSqlDatabase db; int sortColumn; Qt::SortOrder sortOrder; QSqlTableModel::EditStrategy strategy; bool busyInsertingRows; QSqlQuery editQuery = { QSqlQuery(nullptr) }; QSqlIndex primaryIndex; QString tableName; QString filter; QString autoColumn; enum Op { None, Insert, Update, Delete }; class ModifiedRow { public: inline ModifiedRow(Op o = None, const QSqlRecord &r = QSqlRecord()) : m_op(None), m_db_values(r), m_insert(o == Insert) { setOp(o); } inline Op op() const { return m_op; } inline void setOp(Op o) { if (o == None) m_submitted = true; if (o == m_op) return; m_submitted = (o != Insert && o != Delete); m_op = o; m_rec = m_db_values; setGenerated(m_rec, m_op == Delete); } inline const QSqlRecord &rec() const { return m_rec; } inline QSqlRecord& recRef() { return m_rec; } inline void setValue(int c, const QVariant &v) { m_submitted = false; m_rec.setValue(c, v); m_rec.setGenerated(c, true); } inline bool submitted() const { return m_submitted; } inline void setSubmitted() { m_submitted = true; setGenerated(m_rec, false); if (m_op == Delete) { m_rec.clearValues(); } else { m_op = Update; m_db_values = m_rec; 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() { if (m_submitted) return; if (m_op == Delete) m_op = Update; m_rec = m_db_values; setGenerated(m_rec, false); m_submitted = true; } inline QSqlRecord primaryValues(const QSqlRecord& pi) const { if (m_op == None || m_op == Insert) return QSqlRecord(); return m_db_values.keyValues(pi); } private: inline static void setGenerated(QSqlRecord& r, bool g) { for (int i = r.count() - 1; i >= 0; --i) r.setGenerated(i, g); } Op m_op; QSqlRecord m_rec; QSqlRecord m_db_values; bool m_submitted; bool m_insert; }; typedef QMap CacheMap; CacheMap cache; }; class QSqlTableModelSql: public QSqlQueryModelSql { public: }; QT_END_NAMESPACE #endif // QSQLTABLEMODEL_P_H