diff --git a/pglab/ColumnTableModel.cpp b/pglab/ColumnTableModel.cpp index be1d67e..ff96c93 100644 --- a/pglab/ColumnTableModel.cpp +++ b/pglab/ColumnTableModel.cpp @@ -35,7 +35,7 @@ void ColumnTableModel::setData(std::shared_ptr cat, con m_table = table; m_catalog = cat; if (m_table) { - m_columns = cat->attributes()->getColumnsForRelation(table->oid); + m_columns = cat->attributes()->getColumnsForRelation(table->oid()); // hide system and dropped columns auto column_filter_pred = table->hasoids ? ColumnFilterWithOidsPred : ColumnFilterWithoutOidsPred; auto si = std::remove_if(m_columns.begin(), m_columns.end(), column_filter_pred); @@ -51,12 +51,12 @@ void ColumnTableModel::setData(std::shared_ptr cat, con if (m_table) { - m_indexes = m_catalog->indexes()->getIndexesForTable(table->oid); + 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); + || (l.isprimary == r.isprimary && l.oid() < r.oid()); }); } else @@ -109,7 +109,7 @@ QVariant ColumnTableModel::headerData(int section, Qt::Orientation orientation, if (section >= colCount) { const auto &tbl_idx = m_indexes[section - colCount]; //auto idx_cls = m_catalog->classes()->getByKey(tbl_idx.indexrelid); - auto idx_class_name = getClassDisplayString(*m_catalog, tbl_idx.indexrelid); + auto idx_class_name = tbl_idx.objectName(); // getClassDisplayString(*m_catalog, tbl_idx.indexrelid); QString s; if (tbl_idx.isprimary) s = tr("Primary key"); diff --git a/pglab/ConstraintModel.cpp b/pglab/ConstraintModel.cpp index e0a5698..da3051e 100644 --- a/pglab/ConstraintModel.cpp +++ b/pglab/ConstraintModel.cpp @@ -20,7 +20,7 @@ void ConstraintModel::setData(std::shared_ptr cat, cons m_table = table; m_catalog = cat; if (table) { - m_constraints = cat->constraints()->getConstraintsForRelation(table->oid); + m_constraints = cat->constraints()->getConstraintsForRelation(table->oid()); std::sort(m_constraints.begin(), m_constraints.end(), [] (auto &l, auto &r) { return l.type < r.type || diff --git a/pglab/CrudModel.cpp b/pglab/CrudModel.cpp index 5dd1537..b1937ab 100644 --- a/pglab/CrudModel.cpp +++ b/pglab/CrudModel.cpp @@ -38,7 +38,7 @@ void CrudModel::setConfig(std::shared_ptr db, const PgClass &table { m_database = db; m_table = table; - m_primaryKey = db->catalog()->constraints()->getPrimaryForRelation(table.oid); + m_primaryKey = db->catalog()->constraints()->getPrimaryForRelation(table.oid()); //cat->attributes()->getColumnsForRelation() callLoadData = true; auto dbconfig = m_database->config(); @@ -163,7 +163,7 @@ QVariant CrudModel::data(const QModelIndex &index, int role) const void CrudModel::loadData() { - QString table_name = genFQTableName(*m_database->catalog(), m_table); + QString table_name = m_table->fullyQualifiedQuotedObjectName(); // genFQTableName(*m_database->catalog(), *m_table); std::string q = "SELECT * FROM "; q += std::string(table_name.toUtf8().data()); m_dbConn.send(q, [this] (Expected> res, qint64) { @@ -295,7 +295,7 @@ std::tuple CrudModel::createUpdateQuery(const PKeyValues { Pgsql::Params params; auto data = pending_row.data(); - QString table_name = genFQTableName(*m_database->catalog(), m_table); + QString table_name = m_table->fullyQualifiedQuotedObjectName(); //genFQTableName(*m_database->catalog(), *m_table); QString buffer; QTextStream q(&buffer); q << "UPDATE " << table_name << " AS d\n SET "; @@ -329,12 +329,12 @@ std::tuple CrudModel::createInsertQuery(const PendingRow { Pgsql::Params params; auto data = pending_row.data(); - QString table_name = genFQTableName(*m_database->catalog(), m_table); + QString table_name = m_table->fullyQualifiedQuotedObjectName(); // genFQTableName(*m_database->catalog(), *m_table); QString buffer; QTextStream q(&buffer); q << "INSERT INTO " << table_name << "("; - auto columns = m_database->catalog()->attributes()->getColumnsForRelation(m_table.oid); + auto columns = m_database->catalog()->attributes()->getColumnsForRelation(m_table->oid()); bool first = true; for (auto e : data) { int num = e.first + 1; @@ -362,7 +362,7 @@ std::tuple CrudModel::createInsertQuery(const PendingRow std::tuple CrudModel::createDeleteStatement(const PKeyValues &pkey_values) { Pgsql::Params params; - QString table_name = genFQTableName(*m_database->catalog(), m_table); + QString table_name = m_table->fullyQualifiedQuotedObjectName(); // genFQTableName(*m_database->catalog(), *m_table); QString buffer; QTextStream q(&buffer); q << "DELETE FROM " << table_name; diff --git a/pglab/CrudModel.h b/pglab/CrudModel.h index 8a3f466..bec42ae 100644 --- a/pglab/CrudModel.h +++ b/pglab/CrudModel.h @@ -54,7 +54,7 @@ class CrudModel: public QAbstractTableModel { Q_OBJECT public: explicit CrudModel(ASyncWindow *async_win); - ~CrudModel(); + ~CrudModel() override; void setConfig(std::shared_ptr db, const PgClass &table); @@ -149,7 +149,7 @@ private: */ class PendingRow { public: - using ValueMap = std::map; + using ValueMap = std::map; explicit PendingRow(int row) : m_row(row) @@ -232,7 +232,7 @@ private: ASyncWindow * m_asyncWindow; std::shared_ptr m_database; - PgClass m_table; + std::optional m_table; std::optional m_primaryKey; ASyncDBConnection m_dbConn; diff --git a/pglab/CrudTab.h b/pglab/CrudTab.h index ec125ef..a210592 100644 --- a/pglab/CrudTab.h +++ b/pglab/CrudTab.h @@ -5,6 +5,7 @@ #include #include "PlgPage.h" #include +#include namespace Ui { class CrudTab; @@ -20,7 +21,7 @@ class CrudTab : public PlgPage public: explicit CrudTab(MainWindow *parent = 0); - ~CrudTab(); + ~CrudTab() override; void setConfig(std::shared_ptr db, const PgClass &table); @@ -33,7 +34,7 @@ private: MainWindow *m_window; std::shared_ptr m_db; - PgClass m_table; + std::optional m_table; CrudModel *m_crudModel = nullptr; std::vector actions; diff --git a/pglab/DatabasesTableModel.cpp b/pglab/DatabasesTableModel.cpp index 1966484..43bb7fe 100644 --- a/pglab/DatabasesTableModel.cpp +++ b/pglab/DatabasesTableModel.cpp @@ -112,7 +112,7 @@ QVariant DatabasesTableModel::getData(const QModelIndex &index) const const PgDatabase &db = m_databases->getByIdx(index.row()); switch (index.column()) { case NameCol: - v = db.name; + v = db.objectName(); break; case DbaCol: v = getRoleDisplayString(*m_catalog, db.dba); diff --git a/pglab/IndexModel.cpp b/pglab/IndexModel.cpp index 4a5c422..c6b16d1 100644 --- a/pglab/IndexModel.cpp +++ b/pglab/IndexModel.cpp @@ -13,7 +13,7 @@ void IndexModel::setData(std::shared_ptr cat, const std m_catalog = cat; m_table = table; if (table) - m_indexes = cat->indexes()->getIndexesForTable(table->oid); + m_indexes = cat->indexes()->getIndexesForTable(table->oid()); else m_indexes.clear(); } @@ -78,7 +78,7 @@ QVariant IndexModel::getData(const QModelIndex &index) const break; case NameCol: - v = getIndexDisplayString(*m_catalog, dat.indexrelid); + v = dat.objectName(); // getIndexDisplayString(*m_catalog, dat.indexrelid); break; case AmCol: diff --git a/pglab/MainWindow.cpp b/pglab/MainWindow.cpp index ffba2cb..60bb636 100644 --- a/pglab/MainWindow.cpp +++ b/pglab/MainWindow.cpp @@ -57,7 +57,7 @@ void MainWindow::newCrudPage(const PgClass &table) ct->setConfig(m_database, table); // ui->tabWidget->addTab(ct, table.name); // ui->tabWidget->setCurrentWidget(ct); - addPage(ct, table.name); + addPage(ct, table.objectName()); } void MainWindow::newCodeGenPage(QString query, std::shared_ptr dbres) diff --git a/pglab/NamespaceItemModel.cpp b/pglab/NamespaceItemModel.cpp index 332c9a4..6803a85 100644 --- a/pglab/NamespaceItemModel.cpp +++ b/pglab/NamespaceItemModel.cpp @@ -49,7 +49,7 @@ namespace NamespaceItemModel_impl { { QVariant v; if (role == Qt::DisplayRole) { - v = ns.name; + v = ns.objectName(); } else if (role == Qt::CheckStateRole) { v = getCheckState(); @@ -59,7 +59,7 @@ namespace NamespaceItemModel_impl { bool operator < (const LeafNode &rhs) const { - return ns.name < rhs.ns.name; + return ns.objectName() < rhs.ns.objectName(); } diff --git a/pglab/ProcTableModel.cpp b/pglab/ProcTableModel.cpp index ff9f9e0..ebb8731 100644 --- a/pglab/ProcTableModel.cpp +++ b/pglab/ProcTableModel.cpp @@ -78,8 +78,8 @@ QVariant ProcTableModel::getData(const QModelIndex &index) const { auto&& t = m_procs->getByIdx(index.row()); switch (index.column()) { - case NameCol: return t.name; - case NamespaceCol: return t.schemaOid(); + case NameCol: return t.objectName(); + case NamespaceCol: return t.nsName(); case OwnerCol: return t.owner; case LangCol: return t.lang; case AclCol: return t.acl; diff --git a/pglab/TablesPage.cpp b/pglab/TablesPage.cpp index be3a2b2..829cd0b 100644 --- a/pglab/TablesPage.cpp +++ b/pglab/TablesPage.cpp @@ -225,7 +225,7 @@ void TablesPage::indexesTable_modelReset() void TablesPage::on_tableListTable_doubleClicked(const QModelIndex &index) { PgClass table = m_tablesModel->getTable(index.row()); - if (table.oid != InvalidOid) { + if (table.oid() != InvalidOid) { m_window->newCrudPage(table); } diff --git a/pglab/TablesTableModel.cpp b/pglab/TablesTableModel.cpp index 52f9a7e..086cf59 100644 --- a/pglab/TablesTableModel.cpp +++ b/pglab/TablesTableModel.cpp @@ -23,12 +23,12 @@ void TablesTableModel::setCatalog(std::shared_ptr cat) // How many? int n = 0; for (const auto &e : *classes) - if (e.kind == RelKind::Table && !e.system_namespace) ++n; + if (e.kind == RelKind::Table && !e.ns().isSystemCatalog()) ++n; m_tables.clear(); m_tables.reserve(n); // reserve space for (const auto &e : *classes) { - if (e.kind == RelKind::Table && !e.system_namespace) { + if (e.kind == RelKind::Table && !e.ns().isSystemCatalog()) { m_tables.push_back(e); } } @@ -48,14 +48,14 @@ namespace { inline bool compareByName(PgClass l, PgClass r) { - return l.name < r.name - || (l.name == r.name && l.relnamespace_name < r.relnamespace_name); + return l.objectName() < r.objectName() + || (l.objectName() == r.objectName() && l.nsName() < r.nsName()); } inline bool compareBySchema(PgClass l, PgClass r) { - return l.relnamespace_name < r.relnamespace_name - || (l.relnamespace_name == r.relnamespace_name && l.name < r.name); + return l.nsName() < r.nsName() + || (l.nsName() == r.nsName() && l.objectName() < r.objectName()); } } @@ -138,9 +138,9 @@ QVariant TablesTableModel::getData(const QModelIndex &index) const { const auto &t = m_tables[index.row()]; switch (index.column()) { - case NameCol: return t.name; //formatTableName(t); - case NamespaceCol: return getNamespaceDisplayString(*m_catalog, t.relnamespace); - case OwnerCol: return getRoleDisplayString(*m_catalog, t.owner); + case NameCol: return t.objectName(); + case NamespaceCol: return t.nsName(); //getNamespaceDisplayString(*m_catalog, t.relnamespace); + case OwnerCol: return t.ownerName(); case TablespaceCol: return getTablespaceDisplayString(*m_catalog, t.tablespace); case OptionsCol: break; case AclCol: return t.acl; @@ -156,15 +156,15 @@ PgClass TablesTableModel::getTable(int row) const Oid TablesTableModel::getTableOid(int row) const { - return m_tables[row].oid; + 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.name); -} +//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 { diff --git a/pglab/TablesTableModel.h b/pglab/TablesTableModel.h index e1aa57f..c1d632d 100644 --- a/pglab/TablesTableModel.h +++ b/pglab/TablesTableModel.h @@ -46,7 +46,7 @@ private: Oid getType(int column) const; QVariant getData(const QModelIndex &index) const; - QString formatTableName(const PgClass &cls) const; +// QString formatTableName(const PgClass &cls) const; void doSort(int so); }; diff --git a/pglab/TriggerPage.cpp b/pglab/TriggerPage.cpp index e1d993c..f214fa9 100644 --- a/pglab/TriggerPage.cpp +++ b/pglab/TriggerPage.cpp @@ -47,7 +47,7 @@ void TriggerPage::setCatalog(std::shared_ptr cat) void TriggerPage::setFilter(const std::optional &cls) { - m_sortFilterProxy->setOidFilterTable(cls ? cls->oid : InvalidOid, FirstHiddenValue); + m_sortFilterProxy->setOidFilterTable(cls ? cls->oid() : InvalidOid, FirstHiddenValue); } diff --git a/pglab/TriggerTableModel.cpp b/pglab/TriggerTableModel.cpp index b1c7051..716d91a 100644 --- a/pglab/TriggerTableModel.cpp +++ b/pglab/TriggerTableModel.cpp @@ -85,7 +85,7 @@ QVariant TriggerTableModel::getData(const QModelIndex &index) const { auto&& t = m_triggers->getByIdx(index.row()); switch (index.column()) { - case NameCol: return t.name; + case NameCol: return t.objectName(); case EventsCol: return t.eventAbbr(); case WhenCol: return t.typeFireWhen(); case DeferrableCol: return t.deferrable; diff --git a/pglablib/PgClass.cpp b/pglablib/PgClass.cpp index 3be7f23..c4f799e 100644 --- a/pglablib/PgClass.cpp +++ b/pglablib/PgClass.cpp @@ -1,5 +1,6 @@ #include "PgClass.h" + void operator<<(RelPersistence &s, const Pgsql::Value &v) { //s = static_cast(v); @@ -48,3 +49,8 @@ void operator<<(RelKind &s, const Pgsql::Value &v) break; } } + +//QString PgClass::objectName() const +//{ +// return name; +//} diff --git a/pglablib/PgClass.h b/pglablib/PgClass.h index 5497f1f..662ef8b 100644 --- a/pglablib/PgClass.h +++ b/pglablib/PgClass.h @@ -2,6 +2,8 @@ #define PGCLASS_H #include "Pgsql_Value.h" +#include "PgNamespaceObject.h" +#include "PgOwnedObject.h" #include #include @@ -27,17 +29,17 @@ enum class RelKind { void operator<<(RelKind &s, const Pgsql::Value &v); -class PgClass { +class PgClass: public PgNamespaceObject, public PgOwnedObject { public: - Oid oid = InvalidOid; - QString name; - Oid relnamespace = InvalidOid; - QString relnamespace_name; // Transient, cached value from relnamespace - bool system_namespace = false; // Transient, cached value from relnamespace +// Oid oid = InvalidOid; +// QString name; +// Oid relnamespace = InvalidOid; +// QString relnamespace_name; // Transient, cached value from relnamespace +// bool system_namespace = false; // Transient, cached value from relnamespace Oid type = InvalidOid; Oid oftype = InvalidOid; - Oid owner = InvalidOid; + //Oid owner = InvalidOid; Oid am = InvalidOid; Oid filenode = InvalidOid; Oid tablespace = InvalidOid; @@ -54,10 +56,14 @@ public: QString acl; std::vector options; - 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; } - bool operator<(const PgClass &rhs) const { return oid < rhs.oid; } + using PgNamespaceObject::PgNamespaceObject; + +// virtual QString objectName() const override; + +// 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 PgClass &rhs) const { return oid < rhs.oid; } private: }; diff --git a/pglablib/PgClassContainer.cpp b/pglablib/PgClassContainer.cpp index ae05791..b0cc48b 100644 --- a/pglablib/PgClassContainer.cpp +++ b/pglablib/PgClassContainer.cpp @@ -18,17 +18,22 @@ std::string PgClassContainer::getLoadQuery() const PgClass PgClassContainer::loadElem(const Pgsql::Row &row) { Pgsql::Col col(row); - PgClass v; - col >> v.oid >> v.name >> v.relnamespace >> v.type >> v.oftype - >> v.owner >> v.am >> v.filenode >> v.tablespace >> v.pages_est + Oid class_oid = col.nextValue(); + QString name = col.nextValue(); + Oid schema_oid = col.nextValue(); + + PgClass v(m_catalog, class_oid, name, schema_oid); + Oid owner ; + col >> v.type >> v.oftype + >> owner >> v.am >> v.filenode >> v.tablespace >> v.pages_est >> v.tuples_est >> v.toastrelid >> v.isshared >> v.persistence >> v.kind >> v.hasoids >> v.ispopulated >> v.frozenxid >> v.minmxid >> v.acl >> v.options; - - auto&& ns = m_catalog.namespaces()->getByKey(v.relnamespace); - if (ns) { - v.relnamespace_name = ns->name; - v.system_namespace = ns->isSystemCatalog(); - } + v.setOwnerOid(m_catalog, owner); +// auto&& ns = m_catalog.namespaces()->getByKey(v.relnamespace); +// if (ns) { +// v.relnamespace_name = ns->objectName(); +// v.system_namespace = ns->isSystemCatalog(); +// } return v; } diff --git a/pglablib/PgDatabase.cpp b/pglablib/PgDatabase.cpp index 604d39f..3961c25 100644 --- a/pglablib/PgDatabase.cpp +++ b/pglablib/PgDatabase.cpp @@ -1,6 +1,2 @@ -#include "PgDatabase.h" +#include "PgDatabase.h" -PgDatabase::PgDatabase() -{ - -} diff --git a/pglablib/PgDatabase.h b/pglablib/PgDatabase.h index 679c0dd..fd8916e 100644 --- a/pglablib/PgDatabase.h +++ b/pglablib/PgDatabase.h @@ -1,15 +1,15 @@ #ifndef PGDATABASE_H #define PGDATABASE_H +#include "PgServerObject.h" #include #include -class PgDatabase { +class PgDatabase: public PgServerObject { public: - PgDatabase(); - Oid oid = InvalidOid; - QString name; +// Oid oid = InvalidOid; +// QString name; Oid dba; // owner? int encoding; QString collate; @@ -20,12 +20,14 @@ public: Oid tablespace; QString acl;//"ARRAY";"YES" - bool isValid() const { return oid != InvalidOid; } + using PgServerObject::PgServerObject; - 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; } - bool operator<(const PgDatabase &rhs) const { return oid < rhs.oid; } + 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(); } }; #endif // PGDATABASE_H diff --git a/pglablib/PgDatabaseCatalog.cpp b/pglablib/PgDatabaseCatalog.cpp index d02022d..d51374d 100644 --- a/pglablib/PgDatabaseCatalog.cpp +++ b/pglablib/PgDatabaseCatalog.cpp @@ -47,7 +47,7 @@ QString getNamespaceDisplayString(const PgDatabaseCatalog &cat, Oid oid) auto nss = cat.namespaces(); auto ns = nss->getByKey(oid); if (ns) - result = ns->name; //QString("ns %1").arg(oid); + result = ns->objectName(); //QString("ns %1").arg(oid); return result; } @@ -57,7 +57,7 @@ QString getClassDisplayString(const PgDatabaseCatalog &cat, Oid oid) auto l = cat.classes(); auto e = l->getByKey(oid); if (e) - result = e->name; + result = e->objectName(); return result; } @@ -146,25 +146,29 @@ void PgDatabaseCatalog::loadAll(Pgsql::Connection &conn, int n = 0; if (progress_callback && !progress_callback(++n, count)) return; - load2(m_namespaces, conn); + + // First load server objects + load2(m_authIds, conn); if (progress_callback && !progress_callback(++n, count)) return; load2(m_tablespaces, conn); + if (progress_callback && !progress_callback(++n, count)) + return; + load2(m_databases, conn); + if (progress_callback && !progress_callback(++n, count)) + return; + + // Load database objects + load2(m_namespaces, conn); if (progress_callback && !progress_callback(++n, count)) return; load2(m_classes, conn); // needs namespaces if (progress_callback && !progress_callback(++n, count)) return; load2(m_attributes, conn); - if (progress_callback && !progress_callback(++n, count)) - return; - load2(m_authIds, conn); if (progress_callback && !progress_callback(++n, count)) return; load2(m_constraints, conn); - if (progress_callback && !progress_callback(++n, count)) - return; - load2(m_databases, conn); if (progress_callback && !progress_callback(++n, count)) return; load2(m_indexes, conn); diff --git a/pglablib/PgDatabaseContainer.cpp b/pglablib/PgDatabaseContainer.cpp index 26d5f22..f001bcd 100644 --- a/pglablib/PgDatabaseContainer.cpp +++ b/pglablib/PgDatabaseContainer.cpp @@ -10,8 +10,11 @@ std::string PgDatabaseContainer::getLoadQuery() const PgDatabase PgDatabaseContainer::loadElem(const Pgsql::Row &row) { Pgsql::Col col(row); - PgDatabase v; - col >> v.oid >> v.name >> v.dba >> v.encoding >> v.collate >> v.ctype >> v.isTemplate + + Oid oid = col.nextValue(); + QString name = col.nextValue(); + PgDatabase v(m_catalog, oid, name); + col >> v.dba >> v.encoding >> v.collate >> v.ctype >> v.isTemplate >> v.allowConn >> v.connLimit >> v.tablespace >> v.acl; return v; } diff --git a/pglablib/PgIndex.cpp b/pglablib/PgIndex.cpp index 975c58d..b39da03 100644 --- a/pglablib/PgIndex.cpp +++ b/pglablib/PgIndex.cpp @@ -7,16 +7,11 @@ QString PgIndex::getAm() const { auto&& cat = catalog(); QString result; - auto idxcls = cat.classes()->getByKey(indexrelid); + auto idxcls = cat.classes()->getByKey(oid()); if (idxcls) { auto am = cat.ams()->getByKey(idxcls->am); if (am) - result = am->name; + result = am->name; // objectName(); } return result; } - -QString PgIndex::objectName() const -{ - return getAm(); -} diff --git a/pglablib/PgIndex.h b/pglablib/PgIndex.h index 267cb56..c167235 100644 --- a/pglablib/PgIndex.h +++ b/pglablib/PgIndex.h @@ -1,15 +1,15 @@ #ifndef PGINDEX_H #define PGINDEX_H -#include "PgSchemaObject.h" +#include "PgNamespaceObject.h" #include "Pgsql_declare.h" #include #include -class PgIndex : public PgSchemaObject { +class PgIndex : public PgNamespaceObject { public: - Oid indexrelid = InvalidOid; // oid of pg_class for this index +// Oid indexrelid = InvalidOid; // oid of pg_class for this index Oid relid = InvalidOid; // oid of table (pg_class) where this is an index on int16_t natts = 0; bool isunique = false; @@ -30,14 +30,13 @@ public: QString pred; QString definition; - using PgSchemaObject::PgSchemaObject; + using PgNamespaceObject::PgNamespaceObject; QString getAm() const; - virtual QString objectName() const override; - bool operator==(Oid _oid) const { return indexrelid == _oid; } - //bool operator==(const QString &n) const { return name == n; } - bool operator<(Oid _oid) const { return indexrelid < _oid; } - bool operator<(const PgIndex &rhs) const { return indexrelid < rhs.indexrelid; } +// bool operator==(Oid _oid) const { return indexrelid == _oid; } +// //bool operator==(const QString &n) const { return name == n; } +// bool operator<(Oid _oid) const { return indexrelid < _oid; } +// bool operator<(const PgIndex &rhs) const { return indexrelid < rhs.indexrelid; } }; #endif // PGINDEX_H diff --git a/pglablib/PgIndexContainer.cpp b/pglablib/PgIndexContainer.cpp index a645a78..c0da0e4 100644 --- a/pglablib/PgIndexContainer.cpp +++ b/pglablib/PgIndexContainer.cpp @@ -1,4 +1,5 @@ #include "PgIndexContainer.h" +#include "PgClassContainer.h" #include "PgDatabaseCatalog.h" #include "Pgsql_Col.h" #include @@ -21,8 +22,13 @@ SELECT indexrelid, indrelid, indnatts, indisunique, indisprimary, PgIndex PgIndexContainer::loadElem(const Pgsql::Row &row) { Pgsql::Col col(row); - PgIndex v(m_catalog); - col >> v.indexrelid >> v.relid >> v.natts >> v.isunique + Oid indexrelid = col.nextValue(); + auto&& cls = m_catalog.classes()->getByKey(indexrelid); + auto&& name = cls->objectName(); + auto&& nsoid = cls->nsOid(); + + PgIndex v(m_catalog, indexrelid, name, nsoid); + col >> v.relid >> v.natts >> v.isunique >> v.isprimary >> v.isexclusion >> v.immediate >> v.isclustered >> v.isvalid >> v.checkxmin >> v.isready >> v.islive; col.getAsVector(std::back_inserter(v.key)); diff --git a/pglablib/PgNamespace.cpp b/pglablib/PgNamespace.cpp index 90b4017..d2e3677 100644 --- a/pglablib/PgNamespace.cpp +++ b/pglablib/PgNamespace.cpp @@ -1,9 +1,8 @@ #include "PgNamespace.h" -PgNamespace::PgNamespace() = default; - bool PgNamespace::isSystemCatalog() const { - return name.startsWith("pg_") - || name == "information_schema"; + auto&& n = objectName(); + return n.startsWith("pg_") + || n == "information_schema"; } diff --git a/pglablib/PgNamespace.h b/pglablib/PgNamespace.h index c642778..2431748 100644 --- a/pglablib/PgNamespace.h +++ b/pglablib/PgNamespace.h @@ -1,22 +1,26 @@ #ifndef PGNAMESPACE_H #define PGNAMESPACE_H +#include "PgDatabaseObject.h" #include #include -class PgNamespace { -public: - PgNamespace(); - Oid oid = InvalidOid; - QString name; +/// Object representing a namespace within a database +class PgNamespace: public PgDatabaseObject { +public: + +// Oid oid = InvalidOid; +// QString name; Oid owner = InvalidOid; QString acl; - 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; } - bool operator<(const PgNamespace &rhs) const { return oid < rhs.oid; } + 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; }; diff --git a/pglablib/PgNamespaceContainer.cpp b/pglablib/PgNamespaceContainer.cpp index 56b8de9..1b6a05f 100644 --- a/pglablib/PgNamespaceContainer.cpp +++ b/pglablib/PgNamespaceContainer.cpp @@ -11,8 +11,11 @@ std::string PgNamespaceContainer::getLoadQuery() const PgNamespace PgNamespaceContainer::loadElem(const Pgsql::Row &row) { Pgsql::Col col(row); - PgNamespace v; - col >> v.oid >> v.name >> v.owner >> v.acl; + + Oid oid = col.nextValue(); + QString name = col.nextValue(); + PgNamespace v(m_catalog, oid, name); + col >> v.owner >> v.acl; return v; } diff --git a/pglablib/PgNamespaceObject.cpp b/pglablib/PgNamespaceObject.cpp new file mode 100644 index 0000000..c8d94b0 --- /dev/null +++ b/pglablib/PgNamespaceObject.cpp @@ -0,0 +1,40 @@ +#include "PgNamespaceObject.h" +#include "PgDatabaseCatalog.h" +#include "PgNamespace.h" +#include "PgNamespaceContainer.h" +#include "SqlFormattingUtils.h" + +PgNamespaceObject::PgNamespaceObject(PgDatabaseCatalog& cat, Oid oid, const QString &name, Oid schema_oid) + : PgDatabaseObject(cat, oid, name) + , m_schemaOid(schema_oid) +{} + +Oid PgNamespaceObject::nsOid() const +{ + return m_schemaOid; +} + +//void PgSchemaObject::setSchemaOid(Oid oid) +//{ +// m_schemaOid = oid; +//} + +QString PgNamespaceObject::nsName() const +{ + return ns().objectName(); +} + +QString PgNamespaceObject::quotedNsName() const +{ + return quoteIdent(nsName()); +} + +QString PgNamespaceObject::fullyQualifiedQuotedObjectName() const +{ + return quotedNsName() + "." + quotedObjectName(); +} + +const PgNamespace& PgNamespaceObject::ns() const +{ + return *catalog().namespaces()->getByKey(m_schemaOid); +} diff --git a/pglablib/PgSchemaObject.h b/pglablib/PgNamespaceObject.h similarity index 64% rename from pglablib/PgSchemaObject.h rename to pglablib/PgNamespaceObject.h index 66fe5a6..af156d5 100644 --- a/pglablib/PgSchemaObject.h +++ b/pglablib/PgNamespaceObject.h @@ -8,13 +8,15 @@ class PgNamespace; /// Base class for database objects that are part of a specific schema -class PgSchemaObject: public PgDatabaseObject { +class PgNamespaceObject: public PgDatabaseObject { public: - using PgDatabaseObject::PgDatabaseObject; - Oid schemaOid() const; - void setSchemaOid(Oid oid); - QString quotedSchemaName() const; + PgNamespaceObject(PgDatabaseCatalog& cat, Oid oid, const QString &name, Oid schema_oid); + + Oid nsOid() const; +// void setSchemaOid(Oid oid); + QString nsName() const; + QString quotedNsName() const; /// Returns the schema name and object name with proper quotes QString fullyQualifiedQuotedObjectName() const; diff --git a/pglablib/PgObject.cpp b/pglablib/PgObject.cpp index 75cb839..951ef7c 100644 --- a/pglablib/PgObject.cpp +++ b/pglablib/PgObject.cpp @@ -1,13 +1,25 @@ #include "PgObject.h" #include "SqlFormattingUtils.h" -PgObject::PgObject(PgDatabaseCatalog& cat) +PgObject::PgObject(PgDatabaseCatalog& cat, Oid oid, const QString &name) : m_catalog(&cat) + , m_oid(oid) + , m_name(name) {} PgObject::~PgObject() {} +Oid PgObject::oid() const +{ + return m_oid; +} + +const QString& PgObject::objectName() const +{ + return m_name; +} + QString PgObject::quotedObjectName() const { return quoteIdent(objectName()); @@ -17,3 +29,8 @@ const PgDatabaseCatalog& PgObject::catalog() const { return *m_catalog; } + +void test(PgObject a, PgObject b) +{ + a = b; +} diff --git a/pglablib/PgObject.h b/pglablib/PgObject.h index 11c6958..08860f5 100644 --- a/pglablib/PgObject.h +++ b/pglablib/PgObject.h @@ -1,25 +1,32 @@ #ifndef PGOBJECT_H #define PGOBJECT_H +#include #include class PgDatabaseCatalog; class PgObject { public: - explicit PgObject(PgDatabaseCatalog& cat); + explicit PgObject(PgDatabaseCatalog& cat, Oid oid, const QString &name); virtual ~PgObject(); - virtual QString objectName() const = 0; + Oid oid() const; + const QString& objectName() const; /// Default implementation uses objectName and add quotes when needed. virtual QString quotedObjectName() const; + bool operator==(Oid _oid) const { return m_oid == _oid; } + bool operator==(const QString &n) const { return m_name == n; } + bool operator<(Oid _oid) const { return m_oid < _oid; } + bool operator<(const PgObject &rhs) const { return m_oid < rhs.m_oid; } protected: const PgDatabaseCatalog& catalog() const; private: PgDatabaseCatalog* m_catalog; - + Oid m_oid; + QString m_name; }; #endif // PGOBJECT_H diff --git a/pglablib/PgOwnedObject.cpp b/pglablib/PgOwnedObject.cpp new file mode 100644 index 0000000..5fabf66 --- /dev/null +++ b/pglablib/PgOwnedObject.cpp @@ -0,0 +1,25 @@ +#include "PgOwnedObject.h" +#include "PgAuthId.h" +#include "PgAuthIdContainer.h" +#include "PgDatabaseCatalog.h" + +void PgOwnedObject::setOwnerOid(PgDatabaseCatalog& cat, Oid oid) +{ + m_ownerOid = oid; + m_owner = cat.authIds()->getByKey(oid); +} + +Oid PgOwnedObject::ownerOid() const +{ + return m_ownerOid; +} + +QString PgOwnedObject::ownerName() const +{ + return m_owner->name; +} + +const PgAuthId* PgOwnedObject::owner() const +{ + return m_owner; +} diff --git a/pglablib/PgOwnedObject.h b/pglablib/PgOwnedObject.h new file mode 100644 index 0000000..8cc54fe --- /dev/null +++ b/pglablib/PgOwnedObject.h @@ -0,0 +1,22 @@ +#ifndef PGOWNEDOBJECT_H +#define PGOWNEDOBJECT_H + +#include +#include +#include + +class PgDatabaseCatalog; +class PgAuthId; +class PgOwnedObject { +public: + void setOwnerOid(PgDatabaseCatalog& cat, Oid oid); + + Oid ownerOid() const; + QString ownerName() const; + const PgAuthId* owner() const; +private: + Oid m_ownerOid = InvalidOid; + const PgAuthId * m_owner; +}; + +#endif // PGOWNEDOBJECT_H diff --git a/pglablib/PgProc.cpp b/pglablib/PgProc.cpp index 32540e5..269e882 100644 --- a/pglablib/PgProc.cpp +++ b/pglablib/PgProc.cpp @@ -74,11 +74,6 @@ namespace { } -QString PgProc::objectName() const -{ - return name; -} - void PgProc::setArgs( std::vector argtypes, std::vector allargtypes, diff --git a/pglablib/PgProc.h b/pglablib/PgProc.h index e99c0ee..2fdfac4 100644 --- a/pglablib/PgProc.h +++ b/pglablib/PgProc.h @@ -1,7 +1,7 @@ #ifndef PGPROC_H #define PGPROC_H -#include "PgSchemaObject.h" +#include "PgNamespaceObject.h" #include #include #include "Pgsql_Value.h" @@ -24,12 +24,12 @@ public: }; -class PgProc: public PgSchemaObject { +class PgProc: public PgNamespaceObject { public: - using PgSchemaObject::PgSchemaObject; + using PgNamespaceObject::PgNamespaceObject; - Oid oid = InvalidOid; // oid - QString name; // name +// Oid oid = InvalidOid; // oid +// QString name; // name // Oid pronamespace = InvalidOid; // oid, namespace Oid owner = InvalidOid; // oid Oid lang = InvalidOid; // oid @@ -65,12 +65,10 @@ public: ); const std::vector& args() const; - 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; } - bool operator<(const PgProc &rhs) const { return oid < rhs.oid; } - - virtual QString objectName() 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; } +// bool operator<(const PgProc &rhs) const { return oid < rhs.oid; } QString createSql() const; QString argListWithNames(bool multiline = false) const; diff --git a/pglablib/PgProcContainer.cpp b/pglablib/PgProcContainer.cpp index bb5f0c9..ca37025 100644 --- a/pglablib/PgProcContainer.cpp +++ b/pglablib/PgProcContainer.cpp @@ -26,23 +26,26 @@ std::string PgProcContainer::getLoadQuery() const PgProc PgProcContainer::loadElem(const Pgsql::Row &row) { Pgsql::Col col(row); - PgProc v(m_catalog); - Oid namespace_oid; + Oid oid = col.nextValue(); + QString name = col.nextValue(); + Oid namespace_oid = col.nextValue(); + + PgProc v(m_catalog, oid, name, namespace_oid); + + col >> v.owner >> 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; + std::vector argtypes; // oid[] std::vector allargtypes; // oid[] std::vector argmodes; // char[] std::vector argnames; // text[] std::optional argdefaults; // pg_node_tree - - col >> v.oid >> v.name >> namespace_oid >> v.owner >> 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; col.getAsVector(std::back_inserter(argtypes)); col >> allargtypes >> argmodes >> argnames >> argdefaults >> v.src >> v.bin >> v.config >> v.acl; - v.setSchemaOid(namespace_oid); v.setArgs(argtypes, allargtypes, argmodes, argnames, argdefaults); if (minimumVersion(90500)) { diff --git a/pglablib/PgSchemaObject.cpp b/pglablib/PgSchemaObject.cpp deleted file mode 100644 index a56dbe0..0000000 --- a/pglablib/PgSchemaObject.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "PgSchemaObject.h" -#include "PgDatabaseCatalog.h" -#include "PgNamespace.h" -#include "PgNamespaceContainer.h" -#include "SqlFormattingUtils.h" - -Oid PgSchemaObject::schemaOid() const -{ - return m_schemaOid; -} - -void PgSchemaObject::setSchemaOid(Oid oid) -{ - m_schemaOid = oid; -} - -QString PgSchemaObject::quotedSchemaName() const -{ - return quoteIdent(ns().name); -} - -QString PgSchemaObject::fullyQualifiedQuotedObjectName() const -{ - return quotedSchemaName() + "." + quotedObjectName(); -} - -const PgNamespace& PgSchemaObject::ns() const -{ - return *catalog().namespaces()->getByKey(m_schemaOid); -} diff --git a/pglablib/PgTrigger.cpp b/pglablib/PgTrigger.cpp index 8bb4763..d593e4e 100644 --- a/pglablib/PgTrigger.cpp +++ b/pglablib/PgTrigger.cpp @@ -5,16 +5,11 @@ #include "SqlFormattingUtils.h" #include -QString PgTrigger::objectName() const -{ - return name; -} - QString PgTrigger::dropSql() { if (m_dropSql.isEmpty()) { - auto&& fqtablename = genFQTableName(catalog(), *catalog().classes()->getByKey(relid)); - m_dropSql = "DROP TRIGGER " % quoteIdent(name) + auto&& fqtablename = catalog().classes()->getByKey(relid)->fullyQualifiedQuotedObjectName(); // genFQTableName(catalog(), *catalog().classes()->getByKey(relid)); + m_dropSql = "DROP TRIGGER " % quotedObjectName() % " ON " % fqtablename % ";"; } return m_dropSql; @@ -23,8 +18,8 @@ QString PgTrigger::dropSql() QString PgTrigger::createSql() { if (m_createSql.isEmpty()) { - auto&& fqtablename = genFQTableName(catalog(), *catalog().classes()->getByKey(relid)); - auto&& triggername = quoteIdent(name); + auto&& fqtablename = catalog().classes()->getByKey(relid)->fullyQualifiedQuotedObjectName(); //genFQTableName(catalog(), *catalog().classes()->getByKey(relid)); + auto&& triggername = quotedObjectName(); if (constraint != InvalidOid) m_createSql += "CREATE CONSTRAINT TRIGGER "; diff --git a/pglablib/PgTrigger.h b/pglablib/PgTrigger.h index a938542..acbae73 100644 --- a/pglablib/PgTrigger.h +++ b/pglablib/PgTrigger.h @@ -1,18 +1,18 @@ #ifndef PGTRIGGER_H #define PGTRIGGER_H -#include "PgSchemaObject.h" +#include "PgNamespaceObject.h" #include "Pgsql_Value.h" #include #include class PgDatabaseCatalog; -class PgTrigger: public PgSchemaObject { +class PgTrigger: public PgNamespaceObject { public: - Oid oid = InvalidOid; +// Oid oid = InvalidOid; Oid relid; - QString name; +// QString name; Oid foid; int16_t type; char enabled; @@ -29,15 +29,15 @@ public: QString oldtable; // >= 10.0 QString newtable; // >= 10.0 - using PgSchemaObject::PgSchemaObject; + using PgNamespaceObject::PgNamespaceObject; - virtual QString objectName() const override; +// virtual QString objectName() 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; } - bool operator<(const PgTrigger &rhs) const { return oid < rhs.oid; } +// 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; } +// bool operator<(const PgTrigger &rhs) const { return oid < rhs.oid; } static constexpr int TriggerTypeRow = (1 << 0); static constexpr int TriggerTypeBefore = (1 << 1); diff --git a/pglablib/PgTriggerContainer.cpp b/pglablib/PgTriggerContainer.cpp index 71fd02b..fb32a4f 100644 --- a/pglablib/PgTriggerContainer.cpp +++ b/pglablib/PgTriggerContainer.cpp @@ -7,7 +7,7 @@ std::string PgTriggerContainer::getLoadQuery() const { std::string q = - "SELECT oid, tgrelid, tgname, tgfoid, tgtype, tgenabled, tgisinternal, tgconstrrelid, \n" + "SELECT oid, tgname, tgrelid, tgfoid, tgtype, tgenabled, tgisinternal, tgconstrrelid, \n" " tgconstrindid, tgconstraint, tgdeferrable, tginitdeferred, tgnargs, tgattr, \n" " tgargs, COALESCE(substring(pg_get_triggerdef(oid), 'WHEN (.*) EXECUTE PROCEDURE'), substring(pg_get_triggerdef(oid), 'WHEN (.*) \\$trigger')) AS whenclause"; if (minimumVersion(90600)) { @@ -23,8 +23,10 @@ PgTrigger PgTriggerContainer::loadElem(const Pgsql::Row &row) { Pgsql::Col col(row); - PgTrigger v(m_catalog); - col >> v.oid >> v.relid >> v.name >> v.foid >> v.type >> v.enabled >> v.isinternal >> v.constrrelid + Oid oid = col.nextValue(); + QString name = col.nextValue(); + PgTrigger v(m_catalog, oid, name, InvalidOid); + col >> v.relid >> v.foid >> v.type >> v.enabled >> v.isinternal >> v.constrrelid >> v.constrindid >> v.constraint >> v.deferrable >> v.initdeferred >> v.nargs >> v.attr; const unsigned char * args_bytea = reinterpret_cast(col.nextValue().c_str()); if (args_bytea) { diff --git a/pglablib/QueryGenerator.cpp b/pglablib/QueryGenerator.cpp index 51189c4..2dda1ca 100644 --- a/pglablib/QueryGenerator.cpp +++ b/pglablib/QueryGenerator.cpp @@ -18,5 +18,5 @@ UpdatePtr QueryGeneratorFactory::update(QString ns, QString table_name, QString UpdatePtr QueryGeneratorFactory::update(const PgClass &table_class, QString alias) { //QString nsname = m_catalog->namespaces()->getByKey(table_class.relnamespace_name) - return update(table_class.relnamespace_name, table_class.name, alias); + return update(table_class.nsName(), table_class.objectName(), alias); } diff --git a/pglablib/SqlFormattingUtils.cpp b/pglablib/SqlFormattingUtils.cpp index 7df5fa5..6757785 100644 --- a/pglablib/SqlFormattingUtils.cpp +++ b/pglablib/SqlFormattingUtils.cpp @@ -244,26 +244,26 @@ QString dollarQuoteString(const QString &value) -QString genSchemaPrefix(const PgNamespace &ns) -{ - QString str; - if (!ns.name.isEmpty()) { - str = quoteIdent(ns.name) % QString::fromUtf16(u"."); - } - return str; -} +//QString genSchemaPrefix(const PgNamespace &ns) +//{ +// QString str; +// if (!ns.name.isEmpty()) { +// str = quoteIdent(ns.name) % QString::fromUtf16(u"."); +// } +// return str; +//} -QString genFQTableName(const PgDatabaseCatalog &catalog, const PgClass &cls) -{ - auto ns = catalog.namespaces()->getByKey(cls.relnamespace); - - return genSchemaPrefix(*ns) % quoteIdent(cls.name); -} +//QString genFQTableName(const PgDatabaseCatalog &catalog, const PgClass &cls) +//{ +// auto ns = catalog.namespaces()->getByKey(cls.relnamespace); +////cls.fullyQualifiedQuotedObjectName() +// return ns->quotedObjectName() % "." % cls.quotedObjectName(); +//} QString genAlterTable(const PgDatabaseCatalog &catalog, const PgClass &cls) { - return "ALTER TABLE " % genFQTableName(catalog, cls); + return "ALTER TABLE " % cls.fullyQualifiedQuotedObjectName(); // genFQTableName(catalog, cls); } QString getDropConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint) @@ -312,7 +312,7 @@ QString getForeignKeyConstraintDefinition(const PgDatabaseCatalog &catalog, cons return "\n FOREIGN KEY (" % getColumnNameList(catalog, constraint.relid, constraint.key) % ")\n REFERENCES " - % genFQTableName(catalog, *fcls) % " (" + % fcls->fullyQualifiedQuotedObjectName() % " (" % getColumnNameList(catalog, constraint.frelid, constraint.fkey) % ")\n MATCH " % ForeignKeyMatchToString(constraint.fmatchtype) % " ON UPDATE " % ForeignKeyActionToString(constraint.fupdtype) @@ -332,7 +332,7 @@ QString getForeignKeyConstraintReferences(const PgDatabaseCatalog &catalog, cons } return "REFERENCES " - % genFQTableName(catalog, *fcls) % " (" + % fcls->fullyQualifiedQuotedObjectName() % " (" % getColumnNameList(catalog, constraint.frelid, constraint.fkey) % ") MATCH " % ForeignKeyMatchToString(constraint.fmatchtype) % " ON UPDATE " % ForeignKeyActionToString(constraint.fupdtype) @@ -356,7 +356,7 @@ QString getForeignKeyConstraintReferencesShort(const PgDatabaseCatalog &catalog, QString on_delete = constraint.fdeltype == ForeignKeyAction::NoAction ? QString() : " ON DELETE " % ForeignKeyActionToString(constraint.fdeltype); QString match_type = constraint.fmatchtype == ForeignKeyMatch::Simple ? QString() : " MATCH " % ForeignKeyMatchToString(constraint.fmatchtype); - return genFQTableName(catalog, *fcls) % " (" + return fcls->fullyQualifiedQuotedObjectName() % " (" % getColumnNameList(catalog, constraint.frelid, constraint.fkey) % ")" % match_type % on_update @@ -406,7 +406,7 @@ QString getConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstr return result; } -QString getIndexDefinition(const PgDatabaseCatalog &catalog, const PgIndex &index) +QString getIndexDefinition(const PgDatabaseCatalog &, const PgIndex &index) { // const PgClass *table_class = catalog.classes()->getByKey(index.relid); // const PgClass *index_class = catalog.classes()->getByKey(index.indexrelid); @@ -464,40 +464,8 @@ QString getDropIndexDefinition(const PgDatabaseCatalog &catalog, const PgIndex & QString result; result = "DROP INDEX " - % quoteIdent(getIndexDisplayString(catalog, index.indexrelid)) + % index.fullyQualifiedQuotedObjectName() // quoteIdent(getIndexDisplayString(catalog, index.indexrelid)) % ";"; -// % quoteIdent(index_class.name) -// % "\n ON " % genFQTableName(catalog, table_class); -//// % "\n USING " % index_class.am lookup in pg_am table return result; } - -/* -wxString sql; - -sql = wxT("(") + GetQuotedFkColumns() - + wxT(")\n REFERENCES ") + GetQuotedSchemaPrefix(GetRefSchema()) + qtIdent(GetReferences()) - + wxT(" (") + GetQuotedRefColumns() - + wxT(")"); - -if (GetDatabase()->BackendMinimumVersion(7, 4) || GetMatch() == wxT("FULL")) - sql += wxT(" MATCH ") + GetMatch(); - -sql += wxT("\n ON UPDATE ") + GetOnUpdate() - + wxT(" ON DELETE ") + GetOnDelete(); -if (GetDeferrable()) -{ - sql += wxT(" DEFERRABLE INITIALLY "); - if (GetDeferred()) - sql += wxT("DEFERRED"); - else - sql += wxT("IMMEDIATE"); -} - -if (GetDatabase()->BackendMinimumVersion(9, 1) && !GetValid()) - sql += wxT("\n NOT VALID"); - -return sql; -*/ - diff --git a/pglablib/SqlFormattingUtils.h b/pglablib/SqlFormattingUtils.h index 48b805f..7809f87 100644 --- a/pglablib/SqlFormattingUtils.h +++ b/pglablib/SqlFormattingUtils.h @@ -18,7 +18,7 @@ QString quoteIdent(QString ident); QString dollarQuoteString(const QString &value); -QString genFQTableName(const PgDatabaseCatalog &catalog, const PgClass &cls); +//QString genFQTableName(const PgDatabaseCatalog &catalog, const PgClass &cls); QString getDropConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint); QString getConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint); QString getIndexDefinition(const PgDatabaseCatalog &catalog, const PgIndex &index); diff --git a/pglablib/pglablib.pro b/pglablib/pglablib.pro index ce2fa6f..7926bb4 100644 --- a/pglablib/pglablib.pro +++ b/pglablib/pglablib.pro @@ -68,9 +68,10 @@ codebuilder/StructureTemplate.cpp \ PgTriggerContainer.cpp \ PgProc.cpp \ PgProcContainer.cpp \ - PgSchemaObject.cpp \ PgDatabaseObject.cpp \ - PgServerObject.cpp + PgServerObject.cpp \ + PgOwnedObject.cpp \ + PgNamespaceObject.cpp HEADERS += \ Pglablib.h \ @@ -121,9 +122,10 @@ codebuilder/StructureTemplate.h \ PgTriggerContainer.h \ PgProc.h \ PgProcContainer.h \ - PgSchemaObject.h \ PgDatabaseObject.h \ - PgServerObject.h + PgServerObject.h \ + PgOwnedObject.h \ + PgNamespaceObject.h unix { target.path = /usr/lib