diff --git a/pglab/ProcTableModel.cpp b/pglab/ProcTableModel.cpp index 71ed71a..ba8c5aa 100644 --- a/pglab/ProcTableModel.cpp +++ b/pglab/ProcTableModel.cpp @@ -1,6 +1,7 @@ #include "ProcTableModel.h" #include "catalog/PgDatabaseCatalog.h" #include "catalog/PgProcContainer.h" +#include "catalog/PgLanguageContainer.h" #include "CustomDataRole.h" ProcTableModel::ProcTableModel(QObject *parent) @@ -80,8 +81,12 @@ QVariant ProcTableModel::getData(const QModelIndex &index) const switch (index.column()) { case NameCol: return t.objectName(); case NamespaceCol: return t.nsName(); - case OwnerCol: return t.owner; - case LangCol: return t.lang; + case OwnerCol: return t.ownerName(); + case LangCol: { + auto lan = m_catalog->languages()->getByKey(t.lang); + if (lan) return lan->objectName(); + return t.lang; + } case AclCol: return t.acl; } return QVariant(); diff --git a/pglablib/catalog/PgDatabaseCatalog.cpp b/pglablib/catalog/PgDatabaseCatalog.cpp index fbc6152..68290d4 100644 --- a/pglablib/catalog/PgDatabaseCatalog.cpp +++ b/pglablib/catalog/PgDatabaseCatalog.cpp @@ -15,6 +15,7 @@ #include "PgProcContainer.h" #include "PgCollationContainer.h" #include "PgInheritsContainer.h" +#include "PgLanguageContainer.h" #include "Pgsql_Connection.h" #include "Pgsql_oids.h" @@ -151,6 +152,9 @@ void PgDatabaseCatalog::loadAll(Pgsql::Connection &conn, return; // Load database objects + load2(m_languages, conn); + if (progress_callback && !progress_callback(++n, count)) + return; load2(m_namespaces, conn); if (progress_callback && !progress_callback(++n, count)) return; @@ -302,3 +306,8 @@ std::shared_ptr PgDatabaseCatalog::inherits() const { return m_inherits; } + +std::shared_ptr PgDatabaseCatalog::languages() const +{ + return m_languages; +} diff --git a/pglablib/catalog/PgDatabaseCatalog.h b/pglablib/catalog/PgDatabaseCatalog.h index 02b23e6..28a556b 100644 --- a/pglablib/catalog/PgDatabaseCatalog.h +++ b/pglablib/catalog/PgDatabaseCatalog.h @@ -29,7 +29,7 @@ class PgTypeContainer; class PgProcContainer; class PgCollationContainer; class PgInheritsContainer; - +class PgLanguageContainer; class PgDatabaseCatalog: public QObject, public std::enable_shared_from_this { Q_OBJECT @@ -62,6 +62,7 @@ public: std::shared_ptr procs() const; std::shared_ptr collations() const; std::shared_ptr inherits() const; + std::shared_ptr languages() const; enum RefreshFlag { Attributes = 1, @@ -101,6 +102,7 @@ private: std::shared_ptr m_procs; std::shared_ptr m_collations; std::shared_ptr m_inherits; + std::shared_ptr m_languages; template void load2(std::shared_ptr &ptr, Pgsql::Connection &conn) diff --git a/pglablib/catalog/PgLanguage.cpp b/pglablib/catalog/PgLanguage.cpp new file mode 100644 index 0000000..3778f05 --- /dev/null +++ b/pglablib/catalog/PgLanguage.cpp @@ -0,0 +1,11 @@ +#include "PgLanguage.h" + +QString PgLanguage::createSql() const +{ + throw std::exception("PgLanguage::createSql() not implemented"); +} + +QString PgLanguage::dropSql() const +{ + throw std::exception("PgLanguage::dropSql() not implemented"); +} diff --git a/pglablib/catalog/PgLanguage.h b/pglablib/catalog/PgLanguage.h new file mode 100644 index 0000000..fe4a1a4 --- /dev/null +++ b/pglablib/catalog/PgLanguage.h @@ -0,0 +1,29 @@ +#ifndef PGLANGUAGE_H +#define PGLANGUAGE_H + +#include "PgDatabaseObject.h" +#include "PgOwnedObject.h" +#include +#include +//#include "Pgsql_Value.h" + +class PgLanguage: public PgDatabaseObject, public PgOwnedObject { +public: + +// Oid oid; +// QString name; +// Oid owner; + bool ispl; // true "user installable language" language like plpgsql perl en pythong, false for internal, c and sql + bool pltrusted; + Oid plcallfoid; + Oid inline_; + Oid validator; + QString acl; + + using PgDatabaseObject::PgDatabaseObject; + + QString createSql() const; + QString dropSql() const; +}; + +#endif // PGLANGUAGE_H diff --git a/pglablib/catalog/PgLanguageContainer.cpp b/pglablib/catalog/PgLanguageContainer.cpp new file mode 100644 index 0000000..bb6aa0c --- /dev/null +++ b/pglablib/catalog/PgLanguageContainer.cpp @@ -0,0 +1,22 @@ +#include "PgLanguageContainer.h" +#include "Pgsql_Connection.h" +#include "Pgsql_Col.h" + +std::string PgLanguageContainer::getLoadQuery() const +{ + return + "SELECT oid, lanname, lanowner, lanispl, lanpltrusted, lanplcallfoid, laninline, lanvalidator, lanacl \n" + " FROM pg_language"; +} + +PgLanguage PgLanguageContainer::loadElem(const Pgsql::Row &row) +{ + Pgsql::Col col(row); + Oid lan_oid = col.nextValue(); + QString name = col.nextValue(); + Oid owner = col.nextValue(); + PgLanguage v(m_catalog, lan_oid, name); + col >> v.ispl >> v.pltrusted >> v.plcallfoid >> v.inline_ >> v.validator >> v.acl; + v.setOwnerOid(m_catalog, owner); + return v; +} diff --git a/pglablib/catalog/PgLanguageContainer.h b/pglablib/catalog/PgLanguageContainer.h new file mode 100644 index 0000000..a259c22 --- /dev/null +++ b/pglablib/catalog/PgLanguageContainer.h @@ -0,0 +1,25 @@ +#ifndef PGLANGUAGECONTAINER_H +#define PGLANGUAGECONTAINER_H + +#include "PgLanguage.h" +#include "PgContainer.h" + +namespace Pgsql { + + class Result; + +} + +class PgLanguageContainer: public PgContainer { +public: + using PgContainer::PgContainer; + + virtual std::string getLoadQuery() const override; + +protected: + virtual PgLanguage loadElem(const Pgsql::Row &row) override; +private: +}; + + +#endif // PGLANGUAGECONTAINER_H diff --git a/pglablib/catalog/PgProc.h b/pglablib/catalog/PgProc.h index 2fdfac4..3ad9158 100644 --- a/pglablib/catalog/PgProc.h +++ b/pglablib/catalog/PgProc.h @@ -2,6 +2,7 @@ #define PGPROC_H #include "PgNamespaceObject.h" +#include "PgOwnedObject.h" #include #include #include "Pgsql_Value.h" @@ -24,14 +25,14 @@ public: }; -class PgProc: public PgNamespaceObject { +class PgProc: public PgNamespaceObject, public PgOwnedObject { public: using PgNamespaceObject::PgNamespaceObject; // Oid oid = InvalidOid; // oid // QString name; // name // Oid pronamespace = InvalidOid; // oid, namespace - Oid owner = InvalidOid; // oid +// Oid owner = InvalidOid; // oid Oid lang = InvalidOid; // oid float cost = 0.f; // float4 float rows = 0.f; // float4 diff --git a/pglablib/catalog/PgProcContainer.cpp b/pglablib/catalog/PgProcContainer.cpp index ca37025..fa1cb99 100644 --- a/pglablib/catalog/PgProcContainer.cpp +++ b/pglablib/catalog/PgProcContainer.cpp @@ -29,10 +29,11 @@ PgProc PgProcContainer::loadElem(const Pgsql::Row &row) Oid oid = col.nextValue(); QString name = col.nextValue(); Oid namespace_oid = col.nextValue(); + Oid owner_oid = col.nextValue(); PgProc v(m_catalog, oid, name, namespace_oid); - - col >> v.owner >> v.lang >> v.cost >> v.rows + v.setOwnerOid(m_catalog, owner_oid); + col >> v.lang >> v.cost >> v.rows >> v.variadic >> v.transform >> v.isagg >> v.iswindow >> v.secdef >> v.leakproof >> v.isstrict >> v.retset >> v.provolatile >> v.nargs >> v.nargdefaults >> v.rettype; diff --git a/pglablib/catalog/PgTypeContainer.h b/pglablib/catalog/PgTypeContainer.h index e70693b..d1125ee 100644 --- a/pglablib/catalog/PgTypeContainer.h +++ b/pglablib/catalog/PgTypeContainer.h @@ -16,18 +16,9 @@ public: virtual std::string getLoadQuery() const override; - /** Searches for the type matching the specified oid. - * - * \return Returns the matching type or if it is not found a default constructed PgType (oid == InvalidOid). - */ -// const PgType& getTypeByOid(Oid oid) const; -// const PgType& getTypeByName(const QString &name) const; -// const PgType& getTypeByIdx(int idx) const; protected: virtual PgType loadElem(const Pgsql::Row &row) override; private: -// PgType m_invalidType; ///< default constructed object for when a non existent type is being retrieved. -// t_Types m_types; // Keep sorted by Oid }; #endif // PGTYPECONTAINER_H diff --git a/pglablib/pglablib.pro b/pglablib/pglablib.pro index 37a15af..1b13b78 100644 --- a/pglablib/pglablib.pro +++ b/pglablib/pglablib.pro @@ -80,7 +80,9 @@ SOURCES += \ model/TypeSelectionItemModel.cpp \ catalog/PgAmContainer.cpp \ model/CollationModel.cpp \ - model/CollationModelFactory.cpp + model/CollationModelFactory.cpp \ + catalog/PgLanguageContainer.cpp \ + catalog/PgLanguage.cpp HEADERS += \ Pglablib.h \ @@ -145,7 +147,9 @@ HEADERS += \ catalog/PgAm.h \ catalog/PgAmContainer.h \ model/CollationModel.h \ - model/CollationModelFactory.h + model/CollationModelFactory.h \ + catalog/PgLanguageContainer.h \ + catalog/PgLanguage.h unix { target.path = /usr/lib