From f305a477fc7b4fe86def24ffb276d630a3a48cf7 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Sun, 25 Mar 2018 01:16:14 +0300 Subject: [PATCH] #3024 PG: constraint comments (read/write, table DDL) --- .../OSGI-INF/l10n/bundle.properties | 10 ++- .../edit/PostgreConstraintManager.java | 22 +++++ .../postgresql/edit/PostgreIndexManager.java | 12 ++- .../edit/PostgreTableColumnManager.java | 13 ++- .../edit/PostgreTableManagerBase.java | 86 +++++++++++-------- .../ext/postgresql/model/PostgreSchema.java | 3 +- .../model/PostgreTableConstraintBase.java | 10 +++ 7 files changed, 107 insertions(+), 49 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties index a84d984aaa..f41fbfd529 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties @@ -47,7 +47,7 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.dataType.name=Data meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.dataType.description= meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.defaultValue.name=Default meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.defaultValue.description= -meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.description.name=Description +meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.description.name=Comment meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.description.description= meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.maxLength.name=Length meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAttribute.maxLength.description= @@ -204,7 +204,7 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.checkXMin.name=Check X meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.checkXMin.description= meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.clustered.name=Clustered meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.clustered.description= -meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.description.name=Description +meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.description.name=Comment meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.description.description= meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.exclusion.name=Exclusion meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.exclusion.description= @@ -294,7 +294,7 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema.database.name=Database meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema.database.description= meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema.name.name=Name meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema.name.description= -meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema.description.name=Description +meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema.description.name=Comment meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema.description.description=Schema comment meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema.owner.name=Owner meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema.owner.description= @@ -320,10 +320,12 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableBase.objectId.name=ID meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableBase.objectId.description= meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableBase.owner.name=Owner meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableBase.owner.description=Table owner (creator) -meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableBase.description.name=Description +meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableBase.description.name=Comment meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableBase.description.description= meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableConstraintBase.objectDefinitionText.name=DDL meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableConstraintBase.objectDefinitionText.description=Constraint definition text +meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableConstraintBase.description.name=Comment +meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableConstraintBase.description.description=Constraint comment meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableConstraint.source.name=Expression meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableConstraint.source.description=Expression of CHECK constraints meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTableConstraintColumn.attribute.name=Attribute diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreConstraintManager.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreConstraintManager.java index e2e29c5b18..93c4e2ea37 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreConstraintManager.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreConstraintManager.java @@ -20,13 +20,19 @@ import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.postgresql.model.*; +import org.jkiss.dbeaver.model.DBConstants; +import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBPScriptObject; +import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.edit.DBECommandContext; +import org.jkiss.dbeaver.model.edit.DBEPersistAction; import org.jkiss.dbeaver.model.impl.DBSObjectCache; import org.jkiss.dbeaver.model.impl.edit.DBECommandAbstract; +import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction; import org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLConstraintManager; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; +import org.jkiss.dbeaver.model.sql.SQLUtils; import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; import org.jkiss.dbeaver.model.struct.DBSEntityConstraintType; import org.jkiss.dbeaver.ui.UITask; @@ -34,6 +40,7 @@ import org.jkiss.dbeaver.ui.editors.object.struct.EditConstraintPage; import org.jkiss.utils.CommonUtils; import java.util.Collections; +import java.util.List; import java.util.Map; /** @@ -123,6 +130,21 @@ public class PostgreConstraintManager extends SQLConstraintManager actionList, ObjectChangeCommand command, Map options) + { + if (command.getProperty(DBConstants.PROP_ID_DESCRIPTION) != null) { + addConstraintCommentAction(actionList, command.getObject()); + } + } + + static void addConstraintCommentAction(List actionList, PostgreTableConstraintBase constr) { + actionList.add(new SQLDatabasePersistAction( + "Comment sequence", + "COMMENT ON CONSTRAINT " + DBUtils.getQuotedIdentifier(constr) + " ON " + constr.getTable().getFullyQualifiedName(DBPEvaluationContext.DDL) + + " IS " + SQLUtils.quoteString(constr, constr.getDescription()))); + } + @Override protected String getDropConstraintPattern(PostgreTableConstraintBase constraint) { diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreIndexManager.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreIndexManager.java index ab69cc33bb..346016ef3d 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreIndexManager.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreIndexManager.java @@ -140,10 +140,14 @@ public class PostgreIndexManager extends SQLIndexManager actions, PostgreIndex index) { + actions.add(new SQLDatabasePersistAction( + "Comment index", + "COMMENT ON INDEX " + index.getFullyQualifiedName(DBPEvaluationContext.DDL) + + " IS " + SQLUtils.quoteString(index, index.getDescription()))); + } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java index 097ce49cdf..8951e1d49e 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java @@ -20,6 +20,7 @@ import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.postgresql.PostgreConstants; import org.jkiss.dbeaver.ext.postgresql.model.*; +import org.jkiss.dbeaver.model.DBConstants; import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.edit.DBECommandContext; @@ -213,13 +214,17 @@ public class PostgreTableColumnManager extends SQLTableColumnManager actionList, PostgreAttribute column) { + actionList.add(new SQLDatabasePersistAction("Set column comment", "COMMENT ON COLUMN " + + DBUtils.getObjectFullName(column.getTable(), DBPEvaluationContext.DDL) + "." + DBUtils.getQuotedIdentifier(column) + + " IS " + SQLUtils.quoteString(column, CommonUtils.notEmpty(column.getDescription())))); + } + @Override public void renameObject(DBECommandContext commandContext, PostgreTableColumn object, String newName) throws DBException { processObjectRename(commandContext, object, newName); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManagerBase.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManagerBase.java index 89632c0807..6b13b2cb50 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManagerBase.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManagerBase.java @@ -53,54 +53,68 @@ public abstract class PostgreTableManagerBase extends SQLTableManager triggers = ((PostgreTableReal) table).getTriggers(monitor); - if (!CommonUtils.isEmpty(triggers)) { - actions.add(new SQLDatabasePersistActionComment(table.getDataSource(), "Table Triggers")); + { + // Constraint comments + boolean hasComments = false; + for (PostgreTableConstraintBase constr : table.getConstraints(monitor)) { + if (!CommonUtils.isEmpty(constr.getDescription())) { + if (!hasComments) { + actions.add(new SQLDatabasePersistActionComment(table.getDataSource(), "Constraint comments")); + } + PostgreConstraintManager.addConstraintCommentAction(actions, constr); + hasComments = true; + } + } + } - for (PostgreTrigger trigger : triggers) { - actions.add(new SQLDatabasePersistAction("Create trigger", trigger.getObjectDefinitionText(monitor, options))); + // Triggers + if (table instanceof PostgreTableReal) { + Collection triggers = ((PostgreTableReal) table).getTriggers(monitor); + if (!CommonUtils.isEmpty(triggers)) { + actions.add(new SQLDatabasePersistActionComment(table.getDataSource(), "Table Triggers")); + + for (PostgreTrigger trigger : triggers) { + actions.add(new SQLDatabasePersistAction("Create trigger", trigger.getObjectDefinitionText(monitor, options))); + } } } - } - if (isDDL && CommonUtils.getOption(options, PostgreConstants.OPTION_DDL_SHOW_PERMISSIONS)) { - // Permissions - Collection permissions = table.getPermissions(monitor); - if (!CommonUtils.isEmpty(permissions)) { - actions.add(new SQLDatabasePersistActionComment(table.getDataSource(), "Permissions")); - for (PostgrePermission permission : permissions) { - if (permission.hasAllPrivileges(table)) { - Collections.addAll(actions, - new PostgreCommandGrantPrivilege(permission.getOwner(), true, permission, PostgrePrivilegeType.ALL) - .getPersistActions(options)); - } else { - PostgreCommandGrantPrivilege grant = new PostgreCommandGrantPrivilege(permission.getOwner(), true, permission, permission.getPrivileges()); - Collections.addAll(actions, grant.getPersistActions(options)); + if (CommonUtils.getOption(options, PostgreConstants.OPTION_DDL_SHOW_PERMISSIONS)) { + // Permissions + Collection permissions = table.getPermissions(monitor); + if (!CommonUtils.isEmpty(permissions)) { + actions.add(new SQLDatabasePersistActionComment(table.getDataSource(), "Permissions")); + for (PostgrePermission permission : permissions) { + if (permission.hasAllPrivileges(table)) { + Collections.addAll(actions, + new PostgreCommandGrantPrivilege(permission.getOwner(), true, permission, PostgrePrivilegeType.ALL) + .getPersistActions(options)); + } else { + PostgreCommandGrantPrivilege grant = new PostgreCommandGrantPrivilege(permission.getOwner(), true, permission, permission.getPrivileges()); + Collections.addAll(actions, grant.getPersistActions(options)); + } } } } + } catch (DBException e) { + log.error(e); } - } catch (DBException e) { - log.error(e); } } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSchema.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSchema.java index ff55ec3896..60f6434f03 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSchema.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSchema.java @@ -500,10 +500,11 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj @Override protected JDBCStatement prepareObjectsStatement(JDBCSession session, PostgreSchema schema, PostgreTableBase forParent) throws SQLException { StringBuilder sql = new StringBuilder( - "SELECT c.oid,c.*,t.relname as tabrelname,rt.relnamespace as refnamespace" + + "SELECT c.oid,c.*,t.relname as tabrelname,rt.relnamespace as refnamespace,d.description" + "\nFROM pg_catalog.pg_constraint c" + "\nINNER JOIN pg_catalog.pg_class t ON t.oid=c.conrelid" + "\nLEFT OUTER JOIN pg_catalog.pg_class rt ON rt.oid=c.confrelid" + + "\nLEFT OUTER JOIN pg_catalog.pg_description d ON d.objoid=c.oid AND d.objsubid=0" + "\nWHERE "); if (forParent == null) { sql.append("t.relnamespace=?"); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraintBase.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraintBase.java index 1607c685dc..22b4a0591b 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraintBase.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraintBase.java @@ -17,6 +17,7 @@ package org.jkiss.dbeaver.ext.postgresql.model; import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPEvaluationContext; @@ -48,6 +49,7 @@ public abstract class PostgreTableConstraintBase extends JDBCTableConstraint children, boolean secondPass); @Override -- GitLab