#include "TablesTableModel.h" #include "catalog/PgDatabaseCatalog.h" #include "catalog/PgClass.h" #include "catalog/PgClassContainer.h" #include "catalog/PgNamespace.h" #include "catalog/PgNamespaceContainer.h" #include "Pgsql_declare.h" #include "CustomDataRole.h" #include TablesTableModel::TablesTableModel(QObject *parent) : QAbstractTableModel(parent) {} void TablesTableModel::setNamespaceFilter(NamespaceFilter nsf) { m_namespaceFilter = nsf; reloadData(); } void TablesTableModel::setCatalog(std::shared_ptr cat) { m_catalog = cat; reloadData(); } void TablesTableModel::reloadData() { if (!m_catalog) return; beginResetModel(); // Later afscheiden naar filter functie auto classes = m_catalog->classes(); // How many? m_tables.clear(); for (const auto &e : *classes) { bool add = false; if (e.kind == RelKind::Table || e.kind == RelKind::View || e.kind == RelKind::MaterializedView || e.kind == RelKind::ForeignTable) { switch (m_namespaceFilter) { case TablesTableModel::User: add = !e.ns().isSystemCatalog(); break; case TablesTableModel::PgCatalog: add = e.ns().objectName() == "pg_catalog"; break; case TablesTableModel::InformationSchema: add = e.ns().objectName() == "information_schema"; break; } } if (add) 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.objectName() < r.objectName() || (l.objectName() == r.objectName() && l.nsName() < r.nsName()); } inline bool compareBySchema(PgClass l, PgClass r) { return l.nsName() < r.nsName() || (l.nsName() == r.nsName() && l.objectName() < r.objectName()); } } 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 { if (orientation == Qt::Horizontal) { if (role == Qt::DisplayRole) { switch (section) { case NameCol: return tr("Name"); case NamespaceCol: return tr("Schema"); case KindCol: return tr("Kind"); case OwnerCol: return tr("Owner"); case TablespaceCol: return tr("Tablespace"); case OptionsCol: return tr("Options"); case AclCol: return tr("ACL"); } } } return QVariant(); } // 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 KindCol: case OptionsCol: case AclCol: default: oid = Pgsql::varchar_oid; } return oid; } QVariant TablesTableModel::getData(const QModelIndex &index) const { const auto &t = m_tables[index.row()]; switch (index.column()) { case NameCol: return t.objectName(); case NamespaceCol: return t.nsName(); case KindCol: return t.typeName(); case OwnerCol: return t.ownerName(); case TablespaceCol: return getTablespaceDisplayString(*m_catalog, t.tablespace); case OptionsCol: break; case AclCol: return t.aclString(); } return QVariant(); } 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.objectName()); //} QVariant TablesTableModel::data(const QModelIndex &index, int role) const { if (role == Qt::DisplayRole) return getData(index); else if (role == CustomDataTypeRole) return getType(index.column()); return QVariant(); }