pgLab/pglab/ConstraintModel.cpp

155 lines
2.8 KiB
C++
Raw Normal View History

#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<const PgDatabaseCatalog> cat, const std::optional<PgClass> &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];
}