#include "ConstraintModel.h" #include "ScopeGuard.h" #include "PgDatabaseCatalog.h" #include "PgConstraintContainer.h" #include "Pgsql_oids.h" ConstraintModel::ConstraintModel(QObject *parent) : BaseTableModel(parent) { } void ConstraintModel::setData(std::shared_ptr cat, const std::optional &table) { beginResetModel(); SCOPE_EXIT { endResetModel(); }; m_table = table; m_catalog = cat; if (table) { m_constraints = cat->constraints()->getConstraintsForRelation(table->oid()); std::sort(m_constraints.begin(), m_constraints.end(), [] (auto &l, auto &r) { return l.type < r.type || (l.type == r.type && l.name < r.name); }); } else m_constraints.clear(); } QVariant ConstraintModel::headerData(int section, Qt::Orientation orientation, int role) const { QVariant v; if (orientation == Qt::Horizontal) { if (role == Qt::DisplayRole) { QString c; switch (section) { case TypeCol: c = tr("Type"); break; case NameCol: c = tr("Name"); break; case NsCol: c = tr("Schema"); break; case SupportingIndexCol: c = tr("Supporting index"); break; // case DefinitionCol: // c = tr("Definition"); // break; } v = c; } } return v; } int ConstraintModel::rowCount(const QModelIndex &) const { return m_constraints.size(); } int ConstraintModel::columnCount(const QModelIndex &) const { return colCount; } //QVariant ConstraintModel::data(const QModelIndex &index, int role) const //{ // QVariant v; // if (!index.isValid()) // return QVariant(); // // FIXME: Implement me! // return v; //} Oid ConstraintModel::getType(int ) const { Oid oid = Pgsql::varchar_oid; return oid; } QString IconForConstraintType(ConstraintType ct) { QString s = ":/icons/constraints/"; switch (ct) { case ConstraintType::Check: s += "check.png"; break; case ConstraintType::ForeignKey: s += "foreignkey.png"; break; case ConstraintType::PrimaryKey: s += "primarykey.png"; break; case ConstraintType::Unique: s += "unique.png"; break; case ConstraintType::ConstraintTrigger: s = "CT"; break; case ConstraintType::ExclusionConstraint: s = "XC"; break; default: s = "?"; break; } return s; } QVariant ConstraintModel::getData(const QModelIndex &index) const { QVariant v; const int row = index.row(); const auto &t = m_constraints[row]; const int col = index.column(); QString s; switch (col) { case TypeCol: s = IconForConstraintType(t.type); break; case NameCol: s = t.name; break; case NsCol: s = getNamespaceDisplayString(*m_catalog, t.connamespace); break; case SupportingIndexCol: s = getIndexDisplayString(*m_catalog, t.indid); break; // case DefinitionCol: // s = t.definition; // break; } v = s; return v; } const PgConstraint& ConstraintModel::constraint(int row) { return m_constraints[row]; }