#include "TablesTableModel.h" #include "PgDatabaseCatalog.h" #include "PgClass.h" #include "PgClassContainer.h" #include "PgNamespace.h" #include "PgNamespaceContainer.h" #include "Pgsql_declare.h" #include TablesTableModel::TablesTableModel(QObject *parent) : BaseTableModel(parent) { } void TablesTableModel::setCatalog(std::shared_ptr cat) { beginResetModel(); m_catalog = cat; // Later afscheiden naar filter functie auto classes = cat->classes(); // How many? int n = 0; for (const auto &e : *classes) if (e.kind == RelKind::Table && !e.system_namespace) ++n; m_tables.clear(); m_tables.reserve(n); // reserve space for (const auto &e : *classes) { if (e.kind == RelKind::Table && !e.system_namespace) { m_tables.push_back(e); } } doSort(1); endResetModel(); } void TablesTableModel::setSortOrder(int so) { beginResetModel(); doSort(so); endResetModel(); } namespace { inline bool compareByName(PgClass l, PgClass r) { return l.name < r.name || (l.name == r.name && l.relnamespace_name < r.relnamespace_name); } inline bool compareBySchema(PgClass l, PgClass r) { return l.relnamespace_name < r.relnamespace_name || (l.relnamespace_name == r.relnamespace_name && l.name < r.name); } } void TablesTableModel::sort(int column, Qt::SortOrder order) { if (column == NameCol) { if (order == Qt::AscendingOrder) std::sort(m_tables.begin(), m_tables.end(), compareByName); else std::sort(m_tables.begin(), m_tables.end(), [] (auto l, auto r) { return !compareByName(l, r); }); } else if (column == NamespaceCol) { if (order == Qt::AscendingOrder) std::sort(m_tables.begin(), m_tables.end(), compareBySchema); else std::sort(m_tables.begin(), m_tables.end(), [] (auto l, auto r) { return !compareBySchema(l, r); }); } emit layoutChanged(); } void TablesTableModel::doSort(int ) { // if (so == 1) // std::sort(m_tables.begin(), m_tables.end(), // [] (auto l, auto r) -> bool { return l.relnamespace_name < r.relnamespace_name // || (l.relnamespace_name == r.relnamespace_name && l.name < r.name); }); // else // std::sort(m_tables.begin(), m_tables.end(), // [] (auto l, auto r) -> bool { return l.name < r.name; }); } QVariant TablesTableModel::headerData(int section, Qt::Orientation orientation, int role) const { QVariant v; if (orientation == Qt::Horizontal) { if (role == Qt::DisplayRole) { switch (section) { case NameCol: v = tr("Name"); break; case NamespaceCol: v = tr("Schema"); break; case OwnerCol: v = tr("Owner"); break; case TablespaceCol: v = tr("Tablespace"); break; case OptionsCol: v = tr("Options"); break; // case AclCol: // v = tr("ACL"); // break; } } } return v; } // Basic functionality: int TablesTableModel::rowCount(const QModelIndex &) const { return m_tables.size(); } int TablesTableModel::columnCount(const QModelIndex &) const { return colCount; } Oid TablesTableModel::getType(int column) const { Oid oid; switch (column) { case TablespaceCol: case OwnerCol: case NameCol: case NamespaceCol: case OptionsCol: // case AclCol: default: oid = Pgsql::VARCHAROID; } return oid; } QVariant TablesTableModel::getData(const QModelIndex &index) const { QVariant v; const auto &t = m_tables[index.row()]; switch (index.column()) { case NameCol: v = t.name; //formatTableName(t); break; case NamespaceCol: v = getNamespaceDisplayString(*m_catalog, t.relnamespace); break; case OwnerCol: v = getRoleDisplayString(*m_catalog, t.owner); break; case TablespaceCol: v = getTablespaceDisplayString(*m_catalog, t.tablespace); break; case OptionsCol: v = t.options; break; // case AclCol: // v = t.acl; // break; } return v; } PgClass TablesTableModel::getTable(int row) const { return m_tables[row]; } Oid TablesTableModel::getTableOid(int row) const { return m_tables[row].oid; } QString TablesTableModel::formatTableName(const PgClass &cls) const { const char * format = "%2 (%1)"; QString ns_name = getNamespaceDisplayString(*m_catalog, cls.relnamespace); return QString(format).arg(ns_name).arg(cls.name); } QVariant TablesTableModel::data(const QModelIndex &index, int role) const { if (role == Qt::ForegroundRole) { const auto &t = m_tables[index.row()]; auto ns = m_catalog->namespaces()->getByKey(t.relnamespace); if (ns.isSystemCatalog()) { switch (index.column()) { case NameCol: case NamespaceCol: return QBrush(Qt::blue); break; } } } return BaseTableModel::data(index, role); }