From 498233d58c608870dd648b3813b856711cc1fc08 Mon Sep 17 00:00:00 2001 From: eelke Date: Fri, 30 Nov 2018 18:41:38 +0100 Subject: [PATCH] WIP: SQL for creating table and related objects --- pglab/ConstraintModel.cpp | 6 +-- pglab/TablesPage.cpp | 65 ++++++++++++++++++++--- pglab/TablesPage.h | 3 ++ pglab/TablesTableModel.cpp | 2 +- pglablib/PgClass.cpp | 64 +++++++++++++++++++++++ pglablib/PgClass.h | 5 ++ pglablib/PgConstraint.cpp | 6 +-- pglablib/PgConstraint.h | 12 ++--- pglablib/PgConstraintContainer.cpp | 18 ++----- pglablib/PgDatabaseCatalog.cpp | 10 ---- pglablib/PgDatabaseCatalog.h | 1 - pglablib/PgIndex.cpp | 60 +++++++++++++++++++++ pglablib/PgIndex.h | 3 ++ pglablib/SqlFormattingUtils.cpp | 84 +++++------------------------- pglablib/SqlFormattingUtils.h | 3 +- 15 files changed, 221 insertions(+), 121 deletions(-) diff --git a/pglab/ConstraintModel.cpp b/pglab/ConstraintModel.cpp index da3051e..05d6f97 100644 --- a/pglab/ConstraintModel.cpp +++ b/pglab/ConstraintModel.cpp @@ -24,7 +24,7 @@ void ConstraintModel::setData(std::shared_ptr cat, cons 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); + (l.type == r.type && l.objectName() < r.objectName()); }); } else @@ -131,10 +131,10 @@ QVariant ConstraintModel::getData(const QModelIndex &index) const s = IconForConstraintType(t.type); break; case NameCol: - s = t.name; + s = t.objectName(); break; case NsCol: - s = getNamespaceDisplayString(*m_catalog, t.connamespace); + s = t.nsName(); break; case SupportingIndexCol: s = getIndexDisplayString(*m_catalog, t.indid); diff --git a/pglab/TablesPage.cpp b/pglab/TablesPage.cpp index d50cd36..8c2abfa 100644 --- a/pglab/TablesPage.cpp +++ b/pglab/TablesPage.cpp @@ -9,6 +9,7 @@ #include "IconColumnDelegate.h" #include "IndexModel.h" #include "MainWindow.h" +#include "PgIndexContainer.h" #include "PgLabItemDelegate.h" #include "PropertiesPage.h" #include "ResultTableModelUtil.h" @@ -17,6 +18,7 @@ #include "TablesTableModel.h" #include "TriggerPage.h" #include "UserConfiguration.h" +#include "SqlCodePreview.h" #include #include @@ -86,7 +88,6 @@ TablesPage::TablesPage(MainWindow *parent) m_propertiesPage = new PropertiesPage(this); m_propertiesPage->setSourceModel(m_tablesModel); ui->twDetails->addTab(m_propertiesPage, ""); - connect(ui->tableListTable->selectionModel(), &QItemSelectionModel::currentRowChanged, m_propertiesPage, &PropertiesPage::setActiveRow); @@ -94,6 +95,10 @@ TablesPage::TablesPage(MainWindow *parent) m_triggerPage = new TriggerPage(this); ui->twDetails->addTab(m_triggerPage, ""); + // SQL tab + m_sqlCodePreview = new SqlCodePreview(this); + ui->twDetails->addTab(m_sqlCodePreview, ""); + retranslateUi(false); } @@ -103,9 +108,15 @@ void TablesPage::retranslateUi(bool all) if (all) ui->retranslateUi(this); - ui->twDetails->setTabText(ui->twDetails->indexOf(m_columnsPage), QApplication::translate("TablesPage", "Columns", nullptr)); - ui->twDetails->setTabText(ui->twDetails->indexOf(m_propertiesPage), QApplication::translate("TablesPage", "Properties", nullptr)); - ui->twDetails->setTabText(ui->twDetails->indexOf(m_triggerPage), QApplication::translate("TablesPage", "Triggers", nullptr)); + auto set_tabtext = [this] (QWidget *widget, QString translation) { + ui->twDetails->setTabText(ui->twDetails->indexOf(widget), translation); + }; + + set_tabtext(m_columnsPage, QApplication::translate("TablesPage", "Columns", nullptr)); + set_tabtext(m_propertiesPage, QApplication::translate("TablesPage", "Properties", nullptr)); + set_tabtext(m_triggerPage, QApplication::translate("TablesPage", "Triggers", nullptr)); + set_tabtext(m_sqlCodePreview, QApplication::translate("TablesPage", "SQL", nullptr)); + } TablesPage::~TablesPage() @@ -166,8 +177,9 @@ void TablesPage::selectedTableChanged(const std::optional &table) ui->indexesTable->resizeColumnsToContents(); m_triggerPage->setFilter(table); -} + updateSqlTab(table); +} void TablesPage::constraintsTable_selectionChanged(const QItemSelection &/*selected*/, const QItemSelection &/*deselected*/) { @@ -181,7 +193,7 @@ void TablesPage::constraintsTable_selectionChanged(const QItemSelection &/*selec for (auto rij : rijen) { const PgConstraint constraint = m_constraintModel->constraint(rij); drops += getDropConstraintDefinition(*m_catalog, constraint) % "\n"; - creates += getConstraintDefinition(*m_catalog, constraint) % "\n"; + creates += getAlterTableConstraintDefinition(*m_catalog, constraint) % "\n"; } ui->constraintSqlEdit->setPlainText(drops % "\n" % creates); } @@ -202,8 +214,8 @@ void TablesPage::indexesTable_selectionChanged(const QItemSelection &/*selected* QString creates; for (auto rij : rijen) { const PgIndex index = m_indexModel->getIndex(rij); - drops += getDropIndexDefinition(*m_catalog, index) % "\n"; - creates += getIndexDefinition(*m_catalog, index) % "\n"; + drops += index.dropSql() % "\n"; + creates += index.createSql() % "\n"; } ui->indexSqlEdit->setPlainText(drops % "\n" % creates); @@ -222,3 +234,40 @@ void TablesPage::on_tableListTable_doubleClicked(const QModelIndex &index) } } + +void TablesPage::updateSqlTab(const std::optional &table) +{ + if (!table.has_value()) { + m_sqlCodePreview->clear(); + return; + } + + QString drop_sql; + QString create_sql; + // create table + create_sql += table->createSql(); + // - columns + // - constraints + // table details (inherits etc) + + // Indexes + drop_sql += "-- drop Indexes\n"; + create_sql += "-- create Indexes\n"; + auto && indexes = m_catalog->indexes()->getIndexesForTable(table->oid()); + for (auto && index : indexes) { + drop_sql += index.dropSql() % "\n"; + create_sql += index.createSql() % "\n"; + } + + // Triggers + drop_sql += "-- drop Triggers\n"; + create_sql += "-- create Triggers\n"; + + // Privileges + create_sql += "-- set Privileges\n"; + + // Comments + create_sql += "-- set Comments table + columns\n"; + // + m_sqlCodePreview->setPlainText(drop_sql % "\n\n" % create_sql); +} diff --git a/pglab/TablesPage.h b/pglab/TablesPage.h index 413de8d..892e922 100644 --- a/pglab/TablesPage.h +++ b/pglab/TablesPage.h @@ -21,6 +21,7 @@ class MainWindow; class PropertiesPage; class TriggerPage; class PgClass; +class SqlCodePreview; class TablesPage : public QWidget { @@ -40,6 +41,7 @@ private: PropertiesPage *m_propertiesPage; // QWidget *m_triggerTab; TriggerPage *m_triggerPage; + SqlCodePreview *m_sqlCodePreview; std::shared_ptr m_catalog; TablesTableModel* m_tablesModel = nullptr; ColumnTableModel* m_columnsModel = nullptr; @@ -51,6 +53,7 @@ private: // QWidget* addDetailTab(QWidget *contents, bool infront = false); void selectedTableChanged(const std::optional &table); + void updateSqlTab(const std::optional &table); private slots: void tableListTable_currentRowChanged(const QModelIndex ¤t, const QModelIndex &previous); diff --git a/pglab/TablesTableModel.cpp b/pglab/TablesTableModel.cpp index 086cf59..2b5e190 100644 --- a/pglab/TablesTableModel.cpp +++ b/pglab/TablesTableModel.cpp @@ -139,7 +139,7 @@ QVariant TablesTableModel::getData(const QModelIndex &index) const const auto &t = m_tables[index.row()]; switch (index.column()) { case NameCol: return t.objectName(); - case NamespaceCol: return t.nsName(); //getNamespaceDisplayString(*m_catalog, t.relnamespace); + case NamespaceCol: return t.nsName(); case OwnerCol: return t.ownerName(); case TablespaceCol: return getTablespaceDisplayString(*m_catalog, t.tablespace); case OptionsCol: break; diff --git a/pglablib/PgClass.cpp b/pglablib/PgClass.cpp index c4f799e..c83bc43 100644 --- a/pglablib/PgClass.cpp +++ b/pglablib/PgClass.cpp @@ -1,4 +1,10 @@ #include "PgClass.h" +#include "PgAttributeContainer.h" +#include "PgDatabaseCatalog.h" +#include "PgConstraintContainer.h" +#include +#include "SqlFormattingUtils.h" + void operator<<(RelPersistence &s, const Pgsql::Value &v) @@ -54,3 +60,61 @@ void operator<<(RelKind &s, const Pgsql::Value &v) //{ // return name; //} + +QString PgClass::createSql() const +{ + if (createSqlCache.isEmpty()) { + if (kind == RelKind::Table) + createSqlCache = createTableSql(); + + } + return createSqlCache; +} + +QString PgClass::createTableSql() const +{ + QString sql; + // CREATE [ TEMP | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [ + sql += "CREATE "; + if (persistence == RelPersistence::Unlogged) + sql += "UNLOGGED "; + else if (persistence == RelPersistence::Temporary) + sql += "TEMP "; + sql += "TABLE "; + sql += fullyQualifiedQuotedObjectName(); + sql += " (\n "; + + auto && cols = catalog().attributes()->getColumnsForRelation(oid()); + bool first = true; + for (auto && col : cols) { + if (col.num > 0 && !col.isdropped) { + if (first) { + sql += "\n "; + first = false; + } + else sql += ",\n "; + sql += col.columnDefinition(catalog()); + } +// { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ] +// | table_constraint +// ] ) + } + auto && constraints = catalog().constraints()->getConstraintsForRelation(oid()); + for (auto && constraint: constraints) { + if (first) { + sql += "\n "; + first = false; + } + else sql += ",\n "; + sql += getConstraintDefinition(catalog(), constraint); + } + + sql += ")"; +// [ INHERITS ( parent_table [, ... ] ) ] +// [ PARTITION BY { RANGE | LIST } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ] +// [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ] +// [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] +// [ TABLESPACE tablespace_name ] + sql += ";\n"; + return sql; +} diff --git a/pglablib/PgClass.h b/pglablib/PgClass.h index 662ef8b..246487d 100644 --- a/pglablib/PgClass.h +++ b/pglablib/PgClass.h @@ -65,7 +65,12 @@ public: // bool operator<(Oid _oid) const { return oid < _oid; } // bool operator<(const PgClass &rhs) const { return oid < rhs.oid; } + QString createSql() const; + private: + mutable QString createSqlCache; + + QString createTableSql() const; }; #endif // PGCLASS_H diff --git a/pglablib/PgConstraint.cpp b/pglablib/PgConstraint.cpp index a675de3..85bf8bb 100644 --- a/pglablib/PgConstraint.cpp +++ b/pglablib/PgConstraint.cpp @@ -163,7 +163,7 @@ QString ForeignKeyMatchToString(ForeignKeyMatch fkm) } -PgConstraint::PgConstraint() -{ +//PgConstraint::PgConstraint() +//{ -} +//} diff --git a/pglablib/PgConstraint.h b/pglablib/PgConstraint.h index d770801..8345e28 100644 --- a/pglablib/PgConstraint.h +++ b/pglablib/PgConstraint.h @@ -1,6 +1,7 @@ #ifndef PGCONSTRAINT_H #define PGCONSTRAINT_H +#include "PgNamespaceObject.h" #include "Pgsql_Value.h" #include "PgCatalogTypes.h" #include @@ -46,11 +47,8 @@ void operator<<(ForeignKeyMatch &s, const Pgsql::Value &v); QString ForeignKeyMatchToString(ForeignKeyMatch fkm); -class PgConstraint { +class PgConstraint: public PgNamespaceObject { public: - Oid oid = InvalidOid; - QString name; - Oid connamespace = InvalidOid; ConstraintType type; bool deferrable; bool deferred; @@ -76,11 +74,7 @@ public: QString definition; - PgConstraint(); - 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 PgConstraint &rhs) const { return oid < rhs.oid; } + using PgNamespaceObject::PgNamespaceObject; }; diff --git a/pglablib/PgConstraintContainer.cpp b/pglablib/PgConstraintContainer.cpp index 007aee2..ae8d8d5 100644 --- a/pglablib/PgConstraintContainer.cpp +++ b/pglablib/PgConstraintContainer.cpp @@ -20,25 +20,17 @@ FROM pg_constraint)__"; return q; } -//void operator<<(std::vector &s, const Pgsql::Value &v) -//{ - -//} - -//void operator<<(std::vector &s, const Pgsql::Value &v) -//{ - -//} - - PgConstraint PgConstraintContainer::loadElem(const Pgsql::Row &row) { using namespace Pgsql; Col col(row); - PgConstraint v; - col >> v.oid >> v.name >> v.connamespace >> v.type >> v.deferrable + Oid oid = col.nextValue(); + QString name = col.nextValue(); + Oid ns_oid = col.nextValue(); + PgConstraint v(m_catalog, oid, name, ns_oid); + col >> v.type >> v.deferrable >> v.deferred >> v.validated >> v.relid >> v.typid >> v.indid >> v.frelid >> v.fupdtype >> v.fdeltype >> v.fmatchtype >> v.islocal >> v.inhcount >> v.noinherit diff --git a/pglablib/PgDatabaseCatalog.cpp b/pglablib/PgDatabaseCatalog.cpp index 18139a3..eccf681 100644 --- a/pglablib/PgDatabaseCatalog.cpp +++ b/pglablib/PgDatabaseCatalog.cpp @@ -42,16 +42,6 @@ QString getRoleDisplayString(const PgDatabaseCatalog &cat, Oid oid) return name; } -QString getNamespaceDisplayString(const PgDatabaseCatalog &cat, Oid oid) -{ - QString result; - auto nss = cat.namespaces(); - auto ns = nss->getByKey(oid); - if (ns) - result = ns->objectName(); //QString("ns %1").arg(oid); - return result; -} - QString getClassDisplayString(const PgDatabaseCatalog &cat, Oid oid) { QString result; diff --git a/pglablib/PgDatabaseCatalog.h b/pglablib/PgDatabaseCatalog.h index fce4ea7..f892b2c 100644 --- a/pglablib/PgDatabaseCatalog.h +++ b/pglablib/PgDatabaseCatalog.h @@ -112,7 +112,6 @@ private: QString getRoleNameFromOid(const PgDatabaseCatalog &cat, Oid oid); 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); diff --git a/pglablib/PgIndex.cpp b/pglablib/PgIndex.cpp index b39da03..55717a9 100644 --- a/pglablib/PgIndex.cpp +++ b/pglablib/PgIndex.cpp @@ -2,6 +2,7 @@ #include "PgDatabaseCatalog.h" #include "PgClassContainer.h" #include "PgAmContainer.h" +#include QString PgIndex::getAm() const { @@ -15,3 +16,62 @@ QString PgIndex::getAm() const } return result; } + +QString PgIndex::createSql() const +{ + return definition + ";"; + + // const PgClass *table_class = catalog.classes()->getByKey(index.relid); + // const PgClass *index_class = catalog.classes()->getByKey(index.indexrelid); + + // QString result; + // result = "CREATE "; + // if (index.isunique) + // result += "UNIQUE "; + // result += "INDEX " + //// % 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; + + #if 0 + + wxT("\n USING ") + GetIndexType() + + wxT("\n ("); + if (GetProcName().IsNull()) + str += GetQuotedColumns(); + else + { + str += GetQuotedSchemaPrefix(GetProcNamespace()) + qtIdent(GetProcName()) + wxT("(") + GetQuotedColumns() + wxT(")"); + if (!this->GetOperatorClasses().IsNull()) + str += wxT(" ") + GetOperatorClasses(); + } + + str += wxT(")"); + + if (GetConnection()->BackendMinimumVersion(8, 2) && GetFillFactor().Length() > 0) + str += wxT("\n WITH (FILLFACTOR=") + GetFillFactor() + wxT(")"); + + if (GetConnection()->BackendMinimumVersion(8, 0) && tablespace != GetDatabase()->GetDefaultTablespace()) + str += wxT("\nTABLESPACE ") + qtIdent(tablespace); + + AppendIfFilled(str, wxT("\n WHERE "), GetConstraint()); + + str += wxT(";\n"); + + if (GetConnection()->BackendMinimumVersion(7, 5)) + if (GetIsClustered()) + str += wxT("ALTER TABLE ") + GetQuotedSchemaPrefix(GetIdxSchema()) + qtIdent(GetIdxTable()) + + wxT(" CLUSTER ON ") + qtIdent(GetName()) + + wxT(";\n"); + #endif +} + +QString PgIndex::dropSql() const +{ + QString result; + result = "DROP INDEX " + % fullyQualifiedQuotedObjectName() + % ";"; + return result; +} diff --git a/pglablib/PgIndex.h b/pglablib/PgIndex.h index c167235..93b3926 100644 --- a/pglablib/PgIndex.h +++ b/pglablib/PgIndex.h @@ -37,6 +37,9 @@ public: // //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; } + + QString createSql() const; + QString dropSql() const; }; #endif // PGINDEX_H diff --git a/pglablib/SqlFormattingUtils.cpp b/pglablib/SqlFormattingUtils.cpp index 20b801e..4375441 100644 --- a/pglablib/SqlFormattingUtils.cpp +++ b/pglablib/SqlFormattingUtils.cpp @@ -261,7 +261,7 @@ QString dollarQuoteString(const QString &value) // return ns->quotedObjectName() % "." % cls.quotedObjectName(); //} -QString genAlterTable(const PgDatabaseCatalog &catalog, const PgClass &cls) +QString genAlterTable(const PgDatabaseCatalog &, const PgClass &cls) { return "ALTER TABLE " % cls.fullyQualifiedQuotedObjectName(); // genFQTableName(catalog, cls); } @@ -269,7 +269,7 @@ QString genAlterTable(const PgDatabaseCatalog &catalog, const PgClass &cls) QString getDropConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint) { const PgClass *cls = catalog.classes()->getByKey(constraint.relid); - return genAlterTable(catalog, *cls) % " DROP CONSTRAINT " % quoteIdent(constraint.name) % ";"; + return genAlterTable(catalog, *cls) % " DROP CONSTRAINT " % quoteIdent(constraint.objectName()) % ";"; } @@ -368,7 +368,7 @@ QString getForeignKeyConstraintReferencesShort(const PgDatabaseCatalog &catalog, QString getPrimaryKeyConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint) { QString ddl = " PRIMARY KEY (" - % getColumnNameList(catalog, constraint.relid, constraint.key) % ");"; + % getColumnNameList(catalog, constraint.relid, constraint.key) % ")"; return ddl; } @@ -376,18 +376,22 @@ QString getPrimaryKeyConstraintDefinition(const PgDatabaseCatalog &catalog, cons QString getUniqueConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint) { QString ddl = " UNIQUE (" - % getColumnNameList(catalog, constraint.relid, constraint.key) % ");"; + % getColumnNameList(catalog, constraint.relid, constraint.key) % ")"; return ddl; } -QString getConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint) +QString getAlterTableConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint) { const PgClass *cls = catalog.classes()->getByKey(constraint.relid); -// return genAlterTable(catalog, cls) % " ADD CONSTRAINT " -// % quoteIdent(constraint.name) % " " % constraint.definition % ";"; - QString result = genAlterTable(catalog, *cls) % "\n ADD CONSTRAINT " - % quoteIdent(constraint.name); + QString result = genAlterTable(catalog, *cls) % "\n ADD "; + result += getConstraintDefinition(catalog, constraint) % ";"; + return result; +} + +QString getConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint) +{ + QString result = "CONSTRAINT " % quoteIdent(constraint.objectName()); switch (constraint.type) { case ConstraintType::ForeignKey: result += getForeignKeyConstraintDefinition(catalog, constraint); @@ -406,66 +410,4 @@ QString getConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstr return result; } -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); - - - return index.definition + ";"; - -// QString result; -// result = "CREATE "; -// if (index.isunique) -// result += "UNIQUE "; -// result += "INDEX " -//// % 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; - -#if 0 - + wxT("\n USING ") + GetIndexType() - + wxT("\n ("); - if (GetProcName().IsNull()) - str += GetQuotedColumns(); - else - { - str += GetQuotedSchemaPrefix(GetProcNamespace()) + qtIdent(GetProcName()) + wxT("(") + GetQuotedColumns() + wxT(")"); - if (!this->GetOperatorClasses().IsNull()) - str += wxT(" ") + GetOperatorClasses(); - } - - str += wxT(")"); - - if (GetConnection()->BackendMinimumVersion(8, 2) && GetFillFactor().Length() > 0) - str += wxT("\n WITH (FILLFACTOR=") + GetFillFactor() + wxT(")"); - - if (GetConnection()->BackendMinimumVersion(8, 0) && tablespace != GetDatabase()->GetDefaultTablespace()) - str += wxT("\nTABLESPACE ") + qtIdent(tablespace); - - AppendIfFilled(str, wxT("\n WHERE "), GetConstraint()); - - str += wxT(";\n"); - - if (GetConnection()->BackendMinimumVersion(7, 5)) - if (GetIsClustered()) - str += wxT("ALTER TABLE ") + GetQuotedSchemaPrefix(GetIdxSchema()) + qtIdent(GetIdxTable()) - + wxT(" CLUSTER ON ") + qtIdent(GetName()) - + wxT(";\n"); -#endif -} - -QString getDropIndexDefinition(const PgDatabaseCatalog &catalog, const PgIndex &index) -{ -// const PgClass *table_class = catalog.classes()->getByKey(index.relid); -// const PgClass *index_class = catalog.classes()->getByKey(index.indexrelid); - - QString result; - result = "DROP INDEX " - % index.fullyQualifiedQuotedObjectName() // quoteIdent(getIndexDisplayString(catalog, index.indexrelid)) - % ";"; - return result; -} diff --git a/pglablib/SqlFormattingUtils.h b/pglablib/SqlFormattingUtils.h index 7809f87..0b1624c 100644 --- a/pglablib/SqlFormattingUtils.h +++ b/pglablib/SqlFormattingUtils.h @@ -20,9 +20,8 @@ QString dollarQuoteString(const QString &value); //QString genFQTableName(const PgDatabaseCatalog &catalog, const PgClass &cls); QString getDropConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint); +QString getAlterTableConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint); QString getConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint); -QString getIndexDefinition(const PgDatabaseCatalog &catalog, const PgIndex &index); -QString getDropIndexDefinition(const PgDatabaseCatalog &catalog, const PgIndex &index); /// Returns the foreignKey specific part of the constraint definition QString getForeignKeyConstraintDefinition(const PgDatabaseCatalog &catalog, const PgConstraint &constraint); /// Returns the REFERENCES construct as used directly after a column in the create table statement