The tablespage now has a namespace filter allowing it to be used for

a pg_catalog and information_schema tab.
This commit is contained in:
eelke 2018-12-29 10:56:24 +01:00
parent d129876d06
commit a0579538df
5 changed files with 60 additions and 9 deletions

View file

@ -109,6 +109,16 @@ void DatabaseWindow::catalogLoaded()
tt->setCatalog(m_database->catalog()); tt->setCatalog(m_database->catalog());
ui->tabWidget->addTab(tt, "Tables"); ui->tabWidget->addTab(tt, "Tables");
auto pg_cat_tables = new TablesPage(this);
pg_cat_tables->setNamespaceFilter(TablesTableModel::PgCatalog);
pg_cat_tables->setCatalog(m_database->catalog());
ui->tabWidget->addTab(pg_cat_tables, "pg_catalog");
auto info_schema_tables = new TablesPage(this);
info_schema_tables->setNamespaceFilter(TablesTableModel::InformationSchema);
info_schema_tables->setCatalog(m_database->catalog());
ui->tabWidget->addTab(info_schema_tables, "information_schema");
auto functions_page = new FunctionsPage(this); auto functions_page = new FunctionsPage(this);
functions_page->setCatalog(m_database->catalog()); functions_page->setCatalog(m_database->catalog());
ui->tabWidget->addTab(functions_page, "Functions"); ui->tabWidget->addTab(functions_page, "Functions");

View file

@ -16,7 +16,6 @@
#include "ResultTableModelUtil.h" #include "ResultTableModelUtil.h"
#include "SqlFormattingUtils.h" #include "SqlFormattingUtils.h"
#include "SqlSyntaxHighlighter.h" #include "SqlSyntaxHighlighter.h"
#include "TablesTableModel.h"
#include "TriggerPage.h" #include "TriggerPage.h"
#include "UserConfiguration.h" #include "UserConfiguration.h"
#include "SqlCodePreview.h" #include "SqlCodePreview.h"
@ -57,6 +56,8 @@ TablesPage::TablesPage(DatabaseWindow *parent)
ui->indexSqlEdit->setFont(code_font); ui->indexSqlEdit->setFont(code_font);
// Connect signals // Connect signals
// --------------- // ---------------
// Table selection // Table selection
@ -142,6 +143,11 @@ void TablesPage::setCatalog(std::shared_ptr<PgDatabaseCatalog> cat)
highlighter->setTypes(*cat->types()); highlighter->setTypes(*cat->types());
} }
void TablesPage::setNamespaceFilter(TablesTableModel::NamespaceFilter filter)
{
m_tablesModel->setNamespaceFilter(filter);
}
void TablesPage::tableListTable_currentRowChanged(const QModelIndex &current, const QModelIndex &previous) void TablesPage::tableListTable_currentRowChanged(const QModelIndex &current, const QModelIndex &previous)
{ {

View file

@ -5,6 +5,7 @@
#include <memory> #include <memory>
#include <optional> #include <optional>
#include <QItemSelection> #include <QItemSelection>
#include "TablesTableModel.h"
namespace Ui { namespace Ui {
class TablesPage; class TablesPage;
@ -32,6 +33,7 @@ public:
~TablesPage(); ~TablesPage();
void setCatalog(std::shared_ptr<PgDatabaseCatalog> cat); void setCatalog(std::shared_ptr<PgDatabaseCatalog> cat);
void setNamespaceFilter(TablesTableModel::NamespaceFilter filter);
private: private:
Ui::TablesPage *ui; Ui::TablesPage *ui;
DatabaseWindow *m_window; DatabaseWindow *m_window;

View file

@ -12,25 +12,49 @@ TablesTableModel::TablesTableModel(QObject *parent)
: QAbstractTableModel(parent) : QAbstractTableModel(parent)
{} {}
void TablesTableModel::setNamespaceFilter(NamespaceFilter nsf)
{
m_namespaceFilter = nsf;
reloadData();
}
void TablesTableModel::setCatalog(std::shared_ptr<const PgDatabaseCatalog> cat) void TablesTableModel::setCatalog(std::shared_ptr<const PgDatabaseCatalog> cat)
{ {
beginResetModel();
m_catalog = cat; m_catalog = cat;
reloadData();
}
void TablesTableModel::reloadData()
{
if (!m_catalog)
return;
beginResetModel();
// Later afscheiden naar filter functie // Later afscheiden naar filter functie
auto classes = cat->classes(); auto classes = m_catalog->classes();
// How many? // How many?
int n = 0;
for (const auto &e : *classes)
if (e.kind == RelKind::Table && !e.ns().isSystemCatalog()) ++n;
m_tables.clear(); m_tables.clear();
m_tables.reserve(n); // reserve space
for (const auto &e : *classes) { for (const auto &e : *classes) {
if (e.kind == RelKind::Table && !e.ns().isSystemCatalog()) { bool add = false;
m_tables.push_back(e); if (e.kind == RelKind::Table) {
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); doSort(1);

View file

@ -9,6 +9,8 @@
class PgClass; class PgClass;
class PgDatabaseCatalog; class PgDatabaseCatalog;
class TablesTableModel: public QAbstractTableModel { class TablesTableModel: public QAbstractTableModel {
public: public:
enum e_Columns : int { enum e_Columns : int {
@ -22,6 +24,10 @@ public:
TablesTableModel(QObject *parent); TablesTableModel(QObject *parent);
enum NamespaceFilter {
User, PgCatalog, InformationSchema
};
void setNamespaceFilter(NamespaceFilter nsf);
void setCatalog(std::shared_ptr<const PgDatabaseCatalog> cat); void setCatalog(std::shared_ptr<const PgDatabaseCatalog> cat);
virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
@ -42,8 +48,11 @@ private:
using t_Tables = std::vector<PgClass>; using t_Tables = std::vector<PgClass>;
std::shared_ptr<const PgDatabaseCatalog> m_catalog; std::shared_ptr<const PgDatabaseCatalog> m_catalog;
NamespaceFilter m_namespaceFilter = User;
t_Tables m_tables; t_Tables m_tables;
void reloadData();
Oid getType(int column) const; Oid getType(int column) const;
QVariant getData(const QModelIndex &index) const; QVariant getData(const QModelIndex &index) const;
// QString formatTableName(const PgClass &cls) const; // QString formatTableName(const PgClass &cls) const;