From 3f337b2cca67caf274b0e52ac425d565a0ac3153 Mon Sep 17 00:00:00 2001 From: eelke Date: Mon, 24 Dec 2018 11:31:56 +0100 Subject: [PATCH] Added typeName function to PgObject as it might be useful for building generic functions. --- pglablib/catalog/PgClass.cpp | 15 +++++++++++++++ pglablib/catalog/PgClass.h | 1 + pglablib/catalog/PgCollation.cpp | 5 +++++ pglablib/catalog/PgCollation.h | 1 + pglablib/catalog/PgConstraint.cpp | 5 +++++ pglablib/catalog/PgConstraint.h | 2 ++ pglablib/catalog/PgDatabase.cpp | 4 ++++ pglablib/catalog/PgDatabase.h | 7 +------ pglablib/catalog/PgIndex.cpp | 5 +++++ pglablib/catalog/PgIndex.h | 2 ++ pglablib/catalog/PgLanguage.cpp | 5 +++++ pglablib/catalog/PgLanguage.h | 1 + pglablib/catalog/PgNamespace.cpp | 5 +++++ pglablib/catalog/PgNamespace.h | 9 +-------- pglablib/catalog/PgObject.h | 1 + pglablib/catalog/PgProc.cpp | 14 ++++++++++++++ pglablib/catalog/PgProc.h | 2 +- pglablib/catalog/PgTrigger.cpp | 5 +++++ pglablib/catalog/PgTrigger.h | 2 ++ pglablib/catalog/PgType.cpp | 5 +++++ pglablib/catalog/PgType.h | 2 ++ 21 files changed, 83 insertions(+), 15 deletions(-) diff --git a/pglablib/catalog/PgClass.cpp b/pglablib/catalog/PgClass.cpp index e1339f9..2415bee 100644 --- a/pglablib/catalog/PgClass.cpp +++ b/pglablib/catalog/PgClass.cpp @@ -73,6 +73,21 @@ QString PgClass::createSql() const return createSqlCache; } +QString PgClass::typeName() const +{ + switch (kind) { + case RelKind::Table: return "TABLE"; + case RelKind::Index: return "INDEX"; + case RelKind::Sequence: return "SEQUENCE"; + case RelKind::View: return "VIEW"; + case RelKind::MaterializedView: return "MATERIALIZED VIEW"; + case RelKind::Composite: return "COMPOSITE"; + case RelKind::Toast: return "TOAST"; + case RelKind::ForeignTable: return "FOREIGN TABLE"; + } + throw std::runtime_error("Unexpected value in PgClass::typeName()"); +} + QString PgClass::createTableSql() const { QString sql; diff --git a/pglablib/catalog/PgClass.h b/pglablib/catalog/PgClass.h index 246487d..28d4680 100644 --- a/pglablib/catalog/PgClass.h +++ b/pglablib/catalog/PgClass.h @@ -66,6 +66,7 @@ public: // bool operator<(const PgClass &rhs) const { return oid < rhs.oid; } QString createSql() const; + QString typeName() const override; private: mutable QString createSqlCache; diff --git a/pglablib/catalog/PgCollation.cpp b/pglablib/catalog/PgCollation.cpp index 447437c..b36f21d 100644 --- a/pglablib/catalog/PgCollation.cpp +++ b/pglablib/catalog/PgCollation.cpp @@ -1,2 +1,7 @@ #include "PgCollation.h" +QString PgCollation::typeName() const +{ + return "COLLATION"; +} + diff --git a/pglablib/catalog/PgCollation.h b/pglablib/catalog/PgCollation.h index bb4a1b2..6e806a8 100644 --- a/pglablib/catalog/PgCollation.h +++ b/pglablib/catalog/PgCollation.h @@ -20,6 +20,7 @@ public: QString collcollate; // name QString collctype; // name + QString typeName() const override; }; #endif // PGCOLLATION_H diff --git a/pglablib/catalog/PgConstraint.cpp b/pglablib/catalog/PgConstraint.cpp index 85bf8bb..0c8f75b 100644 --- a/pglablib/catalog/PgConstraint.cpp +++ b/pglablib/catalog/PgConstraint.cpp @@ -167,3 +167,8 @@ QString ForeignKeyMatchToString(ForeignKeyMatch fkm) //{ //} + +QString PgConstraint::typeName() const +{ + return "CONSTRAINT"; +} diff --git a/pglablib/catalog/PgConstraint.h b/pglablib/catalog/PgConstraint.h index 8345e28..e27508e 100644 --- a/pglablib/catalog/PgConstraint.h +++ b/pglablib/catalog/PgConstraint.h @@ -75,6 +75,8 @@ public: QString definition; using PgNamespaceObject::PgNamespaceObject; + + QString typeName() const override; }; diff --git a/pglablib/catalog/PgDatabase.cpp b/pglablib/catalog/PgDatabase.cpp index 3961c25..3c1bffe 100644 --- a/pglablib/catalog/PgDatabase.cpp +++ b/pglablib/catalog/PgDatabase.cpp @@ -1,2 +1,6 @@ #include "PgDatabase.h" +QString PgDatabase::typeName() const +{ + return "DATABASE"; +} diff --git a/pglablib/catalog/PgDatabase.h b/pglablib/catalog/PgDatabase.h index fd8916e..862a900 100644 --- a/pglablib/catalog/PgDatabase.h +++ b/pglablib/catalog/PgDatabase.h @@ -8,8 +8,6 @@ class PgDatabase: public PgServerObject { public: -// Oid oid = InvalidOid; -// QString name; Oid dba; // owner? int encoding; QString collate; @@ -24,10 +22,7 @@ public: bool isValid() const { return oid() != InvalidOid; } -// bool operator==(Oid _oid) const { return oid() == _oid; } -// bool operator==(const QString &n) const { return objectName() == n; } -// bool operator<(Oid _oid) const { return oid() < _oid; } -// bool operator<(const PgDatabase &rhs) const { return oid() < rhs.oid(); } + QString typeName() const override; }; #endif // PGDATABASE_H diff --git a/pglablib/catalog/PgIndex.cpp b/pglablib/catalog/PgIndex.cpp index 55717a9..17e8426 100644 --- a/pglablib/catalog/PgIndex.cpp +++ b/pglablib/catalog/PgIndex.cpp @@ -75,3 +75,8 @@ QString PgIndex::dropSql() const % ";"; return result; } + +QString PgIndex::typeName() const +{ + return "INDEX"; +} diff --git a/pglablib/catalog/PgIndex.h b/pglablib/catalog/PgIndex.h index 93b3926..3823b23 100644 --- a/pglablib/catalog/PgIndex.h +++ b/pglablib/catalog/PgIndex.h @@ -40,6 +40,8 @@ public: QString createSql() const; QString dropSql() const; + + QString typeName() const override; }; #endif // PGINDEX_H diff --git a/pglablib/catalog/PgLanguage.cpp b/pglablib/catalog/PgLanguage.cpp index 3778f05..cd9dd4f 100644 --- a/pglablib/catalog/PgLanguage.cpp +++ b/pglablib/catalog/PgLanguage.cpp @@ -9,3 +9,8 @@ QString PgLanguage::dropSql() const { throw std::exception("PgLanguage::dropSql() not implemented"); } + +QString PgLanguage::typeName() const +{ + return "LANGUAGE"; +} diff --git a/pglablib/catalog/PgLanguage.h b/pglablib/catalog/PgLanguage.h index 3178bc8..1360a6d 100644 --- a/pglablib/catalog/PgLanguage.h +++ b/pglablib/catalog/PgLanguage.h @@ -30,6 +30,7 @@ public: bool isPlpgsql() const { return objectName() == "plpgsql"; } bool isSql() const { return objectName() == "sql"; } + QString typeName() const override; }; #endif // PGLANGUAGE_H diff --git a/pglablib/catalog/PgNamespace.cpp b/pglablib/catalog/PgNamespace.cpp index d2e3677..424e829 100644 --- a/pglablib/catalog/PgNamespace.cpp +++ b/pglablib/catalog/PgNamespace.cpp @@ -6,3 +6,8 @@ bool PgNamespace::isSystemCatalog() const return n.startsWith("pg_") || n == "information_schema"; } + +QString PgNamespace::typeName() const +{ + return "SCHEMA"; +} diff --git a/pglablib/catalog/PgNamespace.h b/pglablib/catalog/PgNamespace.h index 2431748..beaf7e0 100644 --- a/pglablib/catalog/PgNamespace.h +++ b/pglablib/catalog/PgNamespace.h @@ -9,20 +9,13 @@ /// Object representing a namespace within a database class PgNamespace: public PgDatabaseObject { public: - -// Oid oid = InvalidOid; -// QString name; Oid owner = InvalidOid; QString acl; using PgDatabaseObject::PgDatabaseObject; -// bool operator==(Oid _oid) const { return oid == _oid; } -// bool operator==(const QString &n) const { return objectName() == n; } -// bool operator<(Oid _oid) const { return oid < _oid; } -// bool operator<(const PgNamespace &rhs) const { return oid < rhs.oid; } - bool isSystemCatalog() const; + QString typeName() const override; }; #endif // PGNAMESPACE_H diff --git a/pglablib/catalog/PgObject.h b/pglablib/catalog/PgObject.h index 08860f5..e30635c 100644 --- a/pglablib/catalog/PgObject.h +++ b/pglablib/catalog/PgObject.h @@ -15,6 +15,7 @@ public: const QString& objectName() const; /// Default implementation uses objectName and add quotes when needed. virtual QString quotedObjectName() const; + virtual QString typeName() const = 0; bool operator==(Oid _oid) const { return m_oid == _oid; } bool operator==(const QString &n) const { return m_name == n; } diff --git a/pglablib/catalog/PgProc.cpp b/pglablib/catalog/PgProc.cpp index ee635bf..bf67e10 100644 --- a/pglablib/catalog/PgProc.cpp +++ b/pglablib/catalog/PgProc.cpp @@ -370,3 +370,17 @@ QString PgProc::volatility() const } return ""; } + +QString PgProc::typeName() const +{ + switch (kind) { + case ProcKind::Function: + case ProcKind::Window: + return "FUNCTION"; + case ProcKind::Procedure: + return "PROCEDURE"; + case ProcKind::Aggregate: + return "AGGREGATE"; + } + throw std::runtime_error("Unexpected kind in PgProc::typeName()"); +} diff --git a/pglablib/catalog/PgProc.h b/pglablib/catalog/PgProc.h index 040c0e7..5d3a9da 100644 --- a/pglablib/catalog/PgProc.h +++ b/pglablib/catalog/PgProc.h @@ -90,7 +90,6 @@ public: const QString& createSql() const; QString argListWithNames(bool multiline = false) const; QString argSigList(const bool forScript = false) const; - QString volatility() const; bool isFunction() const { return kind == ProcKind::Function; } @@ -98,6 +97,7 @@ public: bool isAggregate() const { return kind == ProcKind::Aggregate; } bool isWindow() const { return kind == ProcKind::Window; } + QString typeName() const override; // bool isTrigger() const // { // return typname == wxT("\"trigger\"") || typname == wxT("trigger") || typname == wxT("event_trigger") || typname == wxT("\"event_trigger\"")) diff --git a/pglablib/catalog/PgTrigger.cpp b/pglablib/catalog/PgTrigger.cpp index d593e4e..067ef43 100644 --- a/pglablib/catalog/PgTrigger.cpp +++ b/pglablib/catalog/PgTrigger.cpp @@ -154,3 +154,8 @@ QString PgTrigger::arguments() const } return output; } + +QString PgTrigger::typeName() const +{ + return "TRIGGER"; +} diff --git a/pglablib/catalog/PgTrigger.h b/pglablib/catalog/PgTrigger.h index acbae73..108d67c 100644 --- a/pglablib/catalog/PgTrigger.h +++ b/pglablib/catalog/PgTrigger.h @@ -63,6 +63,8 @@ public: //} QString arguments() const; + + QString typeName() const override; private: mutable QString m_dropSql; // cache mutable QString m_createSql; // cache diff --git a/pglablib/catalog/PgType.cpp b/pglablib/catalog/PgType.cpp index cda0cef..d5dd466 100644 --- a/pglablib/catalog/PgType.cpp +++ b/pglablib/catalog/PgType.cpp @@ -50,3 +50,8 @@ void operator<<(TypCategory &s, const Pgsql::Value &v) break; } } + +QString PgType::typeName() const +{ + return "TYPE"; +} diff --git a/pglablib/catalog/PgType.h b/pglablib/catalog/PgType.h index cd0dd7b..c64a762 100644 --- a/pglablib/catalog/PgType.h +++ b/pglablib/catalog/PgType.h @@ -65,6 +65,8 @@ public: using PgNamespaceObject::PgNamespaceObject; + QString typeName() const override; + // bool operator==(Oid _oid) const { return oid == _oid; } // bool operator==(const QString &n) const { return name == n; } // bool operator<(Oid _oid) const { return oid < _oid; }