diff --git a/pglab/ApplicationWindow.cpp b/pglab/ApplicationWindow.cpp new file mode 100644 index 0000000..dd1c511 --- /dev/null +++ b/pglab/ApplicationWindow.cpp @@ -0,0 +1,14 @@ +#include "ApplicationWindow.h" +#include "ui_ApplicationWindow.h" + +ApplicationWindow::ApplicationWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::ApplicationWindow) +{ + ui->setupUi(this); +} + +ApplicationWindow::~ApplicationWindow() +{ + delete ui; +} diff --git a/pglab/ApplicationWindow.h b/pglab/ApplicationWindow.h new file mode 100644 index 0000000..b65d4e4 --- /dev/null +++ b/pglab/ApplicationWindow.h @@ -0,0 +1,22 @@ +#ifndef APPLICATIONWINDOW_H +#define APPLICATIONWINDOW_H + +#include + +namespace Ui { +class ApplicationWindow; +} + +class ApplicationWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit ApplicationWindow(QWidget *parent = 0); + ~ApplicationWindow(); + +private: + Ui::ApplicationWindow *ui; +}; + +#endif // APPLICATIONWINDOW_H diff --git a/pglab/ApplicationWindow.ui b/pglab/ApplicationWindow.ui new file mode 100644 index 0000000..b6faa92 --- /dev/null +++ b/pglab/ApplicationWindow.ui @@ -0,0 +1,145 @@ + + + ApplicationWindow + + + + 0 + 0 + 314 + 672 + + + + MainWindow + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 1 + 1 + + + + false + + + + + + + ... + + + + + + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + + + 0 + 0 + 314 + 25 + + + + + + + + diff --git a/pglab/ColumnTableModel.cpp b/pglab/ColumnTableModel.cpp index 33941a2..8809de8 100644 --- a/pglab/ColumnTableModel.cpp +++ b/pglab/ColumnTableModel.cpp @@ -83,7 +83,8 @@ QVariant ColumnTableModel::headerData(int section, Qt::Orientation orientation, else if (role == Qt::ToolTipRole) { if (section >= colCount) { const auto &tbl_idx = m_indexes[section - colCount]; - auto idx_cls = m_catalog->classes()->getByKey(tbl_idx.indexrelid); + //auto idx_cls = m_catalog->classes()->getByKey(tbl_idx.indexrelid); + auto idx_class_name = getClassDisplayString(*m_catalog, tbl_idx.indexrelid); QString s; if (tbl_idx.isprimary) s = tr("Primary key"); @@ -91,7 +92,7 @@ QVariant ColumnTableModel::headerData(int section, Qt::Orientation orientation, s = tr("Unique index"); else s = tr("Index"); - s += "\n" + idx_cls.name; + s += "\n" + idx_class_name; v = s; } else { diff --git a/pglab/ConnectionManagerWindow.ui b/pglab/ConnectionManagerWindow.ui index 225e2af..ea3fd3d 100644 --- a/pglab/ConnectionManagerWindow.ui +++ b/pglab/ConnectionManagerWindow.ui @@ -201,7 +201,7 @@ 0 0 800 - 24 + 25 @@ -217,6 +217,18 @@ toolBar + + QToolBar { + border-top: 1px solid rgb(192, 192, 192); + border-bottom: 1px solid rgb(192, 192, 192); + padding: 4px; + +} + +QToolButton { + border: none; +} + false diff --git a/pglab/ConstraintModel.cpp b/pglab/ConstraintModel.cpp new file mode 100644 index 0000000..933a158 --- /dev/null +++ b/pglab/ConstraintModel.cpp @@ -0,0 +1,168 @@ +#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 PgClass &table) +{ + beginResetModel(); + SCOPE_EXIT { endResetModel(); }; + + m_table = table; + m_catalog = cat; + 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); + }); + +// // hide system columns +// auto si = table.hasoids +// ? std::remove_if(m_columns.begin(), m_columns.end(), +// [](PgAttribute &e) { return e.num <= 0 && e.name != "oid"; }) +// : std::remove_if(m_columns.begin(), m_columns.end(), +// [](PgAttribute &e) { return e.num <= 0; }); +// // move columns to end and remove them +// m_columns.erase(si, m_columns.end()); + +// // sort remaining columns by order in table +// std::sort(m_columns.begin(), m_columns.end(), +// [] (auto &l, auto &r) -> bool { return l.num < r.num; }); + +// m_indexes = m_catalog->indexes()->getIndexesForTable(table.oid); +// std::sort(m_indexes.begin(), m_indexes.end(), +// [] (const auto &l, const auto &r) -> bool +// { +// return l.isprimary > r.isprimary +// || (l.isprimary == r.isprimary && l.indexrelid < r.indexrelid); +// }); + +} + +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 &parent) const +{ + return m_constraints.size(); +} + +int ConstraintModel::columnCount(const QModelIndex &parent) 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 column) 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; +} diff --git a/pglab/ConstraintModel.h b/pglab/ConstraintModel.h new file mode 100644 index 0000000..10e6029 --- /dev/null +++ b/pglab/ConstraintModel.h @@ -0,0 +1,51 @@ +#ifndef CONSTRAINTMODEL_H +#define CONSTRAINTMODEL_H + +#include "BaseTableModel.h" +#include "PgClass.h" +#include "PgConstraint.h" +#include +#include + +class PgDatabaseCatalog; + +class ConstraintModel : public BaseTableModel { + Q_OBJECT +public: + + enum e_Columns : int { + TypeCol, + NameCol, /// + NsCol, /// + SupportingIndexCol, + DefinitionCol, + colCount }; + + explicit ConstraintModel(QObject *parent = nullptr); + + void setData(std::shared_ptr cat, const PgClass &table); + + + // Header: + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + + // Basic functionality: + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + + //QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + +protected: + + virtual Oid getType(int column) const override; + virtual QVariant getData(const QModelIndex &index) const override; + +private: + std::shared_ptr m_catalog; + PgClass m_table; + + using t_Constraints = std::vector; + t_Constraints m_constraints; +}; + +#endif // CONSTRAINTMODEL_H diff --git a/pglab/IconColumnDelegate.cpp b/pglab/IconColumnDelegate.cpp new file mode 100644 index 0000000..7788c33 --- /dev/null +++ b/pglab/IconColumnDelegate.cpp @@ -0,0 +1,59 @@ +#include "IconColumnDelegate.h" +#include + +IconColumnDelegate::IconColumnDelegate(QWidget *parent) + : QStyledItemDelegate(parent) +{ +} + +IconColumnDelegate::~IconColumnDelegate() +{ + clearCache(); +} + +void IconColumnDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + if (index.data().canConvert()) { + QString icon_name = qvariant_cast(index.data()); + + + QIcon* icon = IconColumnDelegate::getIcon(icon_name); + if (icon) { + if (option.state & QStyle::State_Selected) + painter->fillRect(option.rect, option.palette.highlight()); + icon->paint(painter, option.rect); + } + else + QStyledItemDelegate::paint(painter, option, index); + + } else { + QStyledItemDelegate::paint(painter, option, index); + } +} + +QSize IconColumnDelegate::sizeHint(const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + return QSize(16, 16); +} + + +void IconColumnDelegate::clearCache() +{ + for (auto &e : m_Icons) + delete e. + second; + m_Icons.clear(); +} + +QIcon* IconColumnDelegate::getIcon(const QString &name) const +{ + auto fr = m_Icons.find(name); + if (fr == m_Icons.end()) { + // load and insert icon + QIcon *icon = new QIcon(name); + fr = m_Icons.emplace(name, icon).first; + } + return fr->second; +} diff --git a/pglab/IconColumnDelegate.h b/pglab/IconColumnDelegate.h new file mode 100644 index 0000000..9d09e94 --- /dev/null +++ b/pglab/IconColumnDelegate.h @@ -0,0 +1,29 @@ +#ifndef ICONCOLUMNDELEGATE_H +#define ICONCOLUMNDELEGATE_H + +#include +#include + +/** This class asumes that the string values supplies for the column data + * can be Resolved by QIcon to an actual icon. Icons are cached and reused. + * + */ +class IconColumnDelegate: public QStyledItemDelegate { +public: + IconColumnDelegate(QWidget *parent = nullptr); + ~IconColumnDelegate(); + + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + QSize sizeHint(const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + + void clearCache(); +private: + using t_IconCache = std::map; + + mutable t_IconCache m_Icons; + + QIcon* getIcon(const QString &name) const; +}; + +#endif // ICONCOLUMNDELEGATE_H diff --git a/pglab/QueryTab.cpp b/pglab/QueryTab.cpp index 5bab123..2646e68 100644 --- a/pglab/QueryTab.cpp +++ b/pglab/QueryTab.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -399,7 +400,10 @@ void QueryTab::explain_ready(ExplainRoot::SPtr explain) ui->explainTreeView->setColumnWidth(5, 80); ui->explainTreeView->setColumnWidth(6, 600); ui->tabWidget->setCurrentWidget(ui->explainTab); -// statusBar()->showMessage(tr("Explain ready.")); + + auto w = dynamic_cast(this->window()); + if (w) + w->statusBar()->showMessage(tr("Explain ready.")); } else { addLog("Explain no result"); diff --git a/pglab/TablesPage.cpp b/pglab/TablesPage.cpp index 7595664..77e1ca5 100644 --- a/pglab/TablesPage.cpp +++ b/pglab/TablesPage.cpp @@ -6,7 +6,9 @@ #include "TablesTableModel.h" #include "ResultTableModelUtil.h" #include "ColumnTableModel.h" +#include "ConstraintModel.h" #include "NamespaceFilterWidget.h" +#include "IconColumnDelegate.h" TablesPage::TablesPage(QWidget *parent) : QWidget(parent), @@ -22,6 +24,13 @@ TablesPage::TablesPage(QWidget *parent) : m_columnsModel = new ColumnTableModel(this); ui->columnsTable->setModel(m_columnsModel); + SetTableViewDefault(ui->constraintsTable); + m_constraintModel = new ConstraintModel(this); + auto delegate = new IconColumnDelegate(this); + + ui->constraintsTable->setModel(m_constraintModel); + ui->constraintsTable->setItemDelegateForColumn(0, delegate); + m_namespaceFilterWidget = new NamespaceFilterWidget(this); ui->verticalLayoutTableView->addWidget(m_namespaceFilterWidget); @@ -50,5 +59,8 @@ void TablesPage::on_tableListTable_currentRowChanged(const QModelIndex ¤t, PgClass table = m_tablesModel->getTable(current.row()); m_columnsModel->setData(m_catalog, table); ui->columnsTable->resizeColumnsToContents(); + + m_constraintModel->setData(m_catalog, table); + ui->constraintsTable->resizeColumnsToContents(); } } diff --git a/pglab/TablesPage.h b/pglab/TablesPage.h index c0ba1bf..d999c8b 100644 --- a/pglab/TablesPage.h +++ b/pglab/TablesPage.h @@ -10,6 +10,7 @@ class TablesPage; class TablesTableModel; class ColumnTableModel; +class ConstraintModel; class PgDatabaseCatalog; class NamespaceFilterWidget; @@ -27,6 +28,7 @@ private: std::shared_ptr m_catalog; TablesTableModel* m_tablesModel = nullptr; ColumnTableModel* m_columnsModel = nullptr; + ConstraintModel* m_constraintModel = nullptr; NamespaceFilterWidget* m_namespaceFilterWidget; private slots: diff --git a/pglab/TablesPage.ui b/pglab/TablesPage.ui index df90551..4253595 100644 --- a/pglab/TablesPage.ui +++ b/pglab/TablesPage.ui @@ -38,7 +38,7 @@ - 0 + 2 @@ -50,6 +50,26 @@ + + + Constraints + + + + + + + + + + Indexes + + + + + + + Properties diff --git a/pglab/TablesTableModel.cpp b/pglab/TablesTableModel.cpp index 5499f35..8376f36 100644 --- a/pglab/TablesTableModel.cpp +++ b/pglab/TablesTableModel.cpp @@ -104,7 +104,7 @@ QVariant TablesTableModel::getData(const QModelIndex &index) const v = t.name; //formatTableName(t); break; case NamespaceCol: - v = getNamespaceDisplayString(*m_catalog, t.relnamespace); + v = getNamespaceDisplayString(*m_catalog, t.relnamespace); break; case OwnerCol: v = getRoleDisplayString(*m_catalog, t.owner); diff --git a/pglab/icons/constraints/check.png b/pglab/icons/constraints/check.png new file mode 100644 index 0000000..9d1d2a0 Binary files /dev/null and b/pglab/icons/constraints/check.png differ diff --git a/pglab/icons/constraints/foreignkey.png b/pglab/icons/constraints/foreignkey.png new file mode 100644 index 0000000..b360550 Binary files /dev/null and b/pglab/icons/constraints/foreignkey.png differ diff --git a/pglab/icons/constraints/primarykey.png b/pglab/icons/constraints/primarykey.png new file mode 100644 index 0000000..b57f597 Binary files /dev/null and b/pglab/icons/constraints/primarykey.png differ diff --git a/pglab/icons/constraints/unique.png b/pglab/icons/constraints/unique.png new file mode 100644 index 0000000..e828572 Binary files /dev/null and b/pglab/icons/constraints/unique.png differ diff --git a/pglab/pglab.pro b/pglab/pglab.pro index 34f192d..3170aac 100644 --- a/pglab/pglab.pro +++ b/pglab/pglab.pro @@ -62,7 +62,10 @@ SOURCES += main.cpp\ TablesTableModel.cpp \ ColumnTableModel.cpp \ NamespaceFilterWidget.cpp \ - NamespaceItemModel.cpp + NamespaceItemModel.cpp \ + ApplicationWindow.cpp \ + ConstraintModel.cpp \ + IconColumnDelegate.cpp HEADERS += \ QueryResultModel.h \ @@ -96,7 +99,10 @@ HEADERS += \ TablesTableModel.h \ ColumnTableModel.h \ NamespaceFilterWidget.h \ - NamespaceItemModel.h + NamespaceItemModel.h \ + ApplicationWindow.h \ + ConstraintModel.h \ + IconColumnDelegate.h FORMS += mainwindow.ui \ ConnectionManagerWindow.ui \ @@ -107,7 +113,8 @@ FORMS += mainwindow.ui \ ServerWindow.ui \ ProcessStdioWidget.ui \ TablesPage.ui \ - NamespaceFilterWidget.ui + NamespaceFilterWidget.ui \ + ApplicationWindow.ui RESOURCES += \ resources.qrc diff --git a/pglab/resources.qrc b/pglab/resources.qrc index 2c4d54e..149bed8 100644 --- a/pglab/resources.qrc +++ b/pglab/resources.qrc @@ -23,5 +23,9 @@ icons/delete_connection.png icons/open_query_window.png icons/manage_server.png + icons/constraints/check.png + icons/constraints/foreignkey.png + icons/constraints/primarykey.png + icons/constraints/unique.png diff --git a/pglabAll.pro b/pglabAll.pro index 7c43973..4371034 100644 --- a/pglabAll.pro +++ b/pglabAll.pro @@ -8,7 +8,11 @@ SUBDIRS += core \ pgsql \ pglablib \ pglab - + +pglab.depends = core ctk pgsql pglablib +pgsql.depends = core +pglablib.depends = core pgsql + CONFIG(debug, debug|release) { SUBDIRS += tests diff --git a/pglablib/PgConstraint.cpp b/pglablib/PgConstraint.cpp index af88095..e212aa7 100644 --- a/pglablib/PgConstraint.cpp +++ b/pglablib/PgConstraint.cpp @@ -25,6 +25,64 @@ void operator<<(ConstraintType &s, const Pgsql::Value &v) } } +QString ShortNameForConstraintType(ConstraintType ct) +{ + QString s; + switch (ct) { + case ConstraintType::Check: + s = "C"; + break; + case ConstraintType::ForeignKey: + s = "FK"; + break; + case ConstraintType::PrimaryKey: + s = "PK"; + break; + case ConstraintType::Unique: + s = "U"; + break; + case ConstraintType::ConstraintTrigger: + s = "CT"; + break; + case ConstraintType::ExclusionConstraint: + s = "XC"; + break; + default: + s = "?"; + break; + } + return s; +} + +QString LongNameForConstraintType(ConstraintType ct) +{ + QString s; + switch (ct) { + case ConstraintType::Check: + s = "check"; + break; + case ConstraintType::ForeignKey: + s = "foreign key"; + break; + case ConstraintType::PrimaryKey: + s = "primary key"; + break; + case ConstraintType::Unique: + s = "unique"; + break; + case ConstraintType::ConstraintTrigger: + s = "constraint trigger"; + break; + case ConstraintType::ExclusionConstraint: + s = "exclusion constraint"; + break; + default: + s = "?"; + break; + } + return s; +} + void operator<<(ForeignKeyAction &s, const Pgsql::Value &v) { const char *c = v.c_str(); @@ -64,6 +122,7 @@ void operator<<(ForeignKeyMatch &s, const Pgsql::Value &v) } + PgConstraint::PgConstraint() { diff --git a/pglablib/PgConstraint.h b/pglablib/PgConstraint.h index cd2c5f7..603adac 100644 --- a/pglablib/PgConstraint.h +++ b/pglablib/PgConstraint.h @@ -9,16 +9,19 @@ #include enum class ConstraintType { - Check, // c - ForeignKey, // f PrimaryKey, // p + ForeignKey, // f Unique, // u + Check, // c ConstraintTrigger, // t ExclusionConstraint, // x }; void operator<<(ConstraintType &s, const Pgsql::Value &v); +QString ShortNameForConstraintType(ConstraintType ct); +QString LongNameForConstraintType(ConstraintType ct); + enum class ForeignKeyAction { NoAction, // a diff --git a/pglablib/PgConstraintContainer.cpp b/pglablib/PgConstraintContainer.cpp index e753654..33983e5 100644 --- a/pglablib/PgConstraintContainer.cpp +++ b/pglablib/PgConstraintContainer.cpp @@ -63,3 +63,12 @@ const PgConstraint* PgConstraintContainer::getFKeyForTableColumn(Oid relid, int1 // }); return result; } + +std::vector PgConstraintContainer::getConstraintsForRelation(Oid relid) const +{ + std::vector result; + for (const auto &e : m_container) + if (e.relid == relid) + result.push_back(e); + return result; +} diff --git a/pglablib/PgConstraintContainer.h b/pglablib/PgConstraintContainer.h index 89eb0cc..fdab087 100644 --- a/pglablib/PgConstraintContainer.h +++ b/pglablib/PgConstraintContainer.h @@ -13,6 +13,8 @@ public: virtual std::string getLoadQuery() const override; //std::vector getIndexesForTable(Oid table_oid) const; const PgConstraint* getFKeyForTableColumn(Oid relid, int16_t attnum) const; + + std::vector getConstraintsForRelation(Oid relid) const; protected: virtual PgConstraint loadElem(const Pgsql::Row &row) override; }; diff --git a/pglablib/PgDatabaseCatalog.cpp b/pglablib/PgDatabaseCatalog.cpp index 0784af5..8f12e99 100644 --- a/pglablib/PgDatabaseCatalog.cpp +++ b/pglablib/PgDatabaseCatalog.cpp @@ -38,19 +38,31 @@ QString getRoleDisplayString(const PgDatabaseCatalog &cat, Oid oid) QString getNamespaceDisplayString(const PgDatabaseCatalog &cat, Oid oid) { - //QString name; + QString result; auto nss = cat.namespaces(); auto ns = nss->getByKey(oid); -// if (auth_ids) { -// const PgAuthId& auth_id = auth_ids->getByOid(oid); -// if (auth_id.valid()) { -// name = auth_id.name; -// } -// } - //return name; - // TODO load list and lookup name - return ns.name; //QString("ns %1").arg(oid); + result = ns.name; //QString("ns %1").arg(oid); + return result; +} +QString getClassDisplayString(const PgDatabaseCatalog &cat, Oid oid) +{ + QString result; + auto l = cat.classes(); + auto e = l->getByKey(oid); + result = e.name; + return result; + +} + +QString getIndexDisplayString(const PgDatabaseCatalog &cat, Oid oid) +{ + QString result; +// auto l = cat.indexes(); +// auto e = l->getByKey(oid); +// if (e) + result = getClassDisplayString(cat, oid); + return result; } QString getTablespaceDisplayString(const PgDatabaseCatalog &cat, Oid oid) diff --git a/pglablib/PgDatabaseCatalog.h b/pglablib/PgDatabaseCatalog.h index 955bce6..3818bb3 100644 --- a/pglablib/PgDatabaseCatalog.h +++ b/pglablib/PgDatabaseCatalog.h @@ -74,6 +74,8 @@ QString getRoleDisplayString(const PgDatabaseCatalog &cat, Oid oid); QString getNamespaceDisplayString(const PgDatabaseCatalog &cat, Oid oid); QString getTablespaceDisplayString(const PgDatabaseCatalog &cat, Oid oid); QString getTypeDisplayString(const PgDatabaseCatalog &cat, Oid oid, int32_t typmod = -1); +QString getIndexDisplayString(const PgDatabaseCatalog &cat, Oid oid); +QString getClassDisplayString(const PgDatabaseCatalog &cat, Oid oid); #endif // PGSQLDATABASECATALOGUE_H