提交 2328953a 编写于 作者: S serge-rider

#3206 PostgreSQL function DDL: include permissions. Nested SQL editors init fix (do not reinit)


Former-commit-id: 58f8e244
上级 f9f52d5a
......@@ -39,7 +39,6 @@ import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.MultiPageEditorSite;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.jkiss.dbeaver.DBException;
......@@ -157,12 +156,7 @@ public abstract class SQLEditorNested<T extends DBSObject>
@Override
public void doSave(final IProgressMonitor progressMonitor) {
DBeaverUI.syncExec(new Runnable() {
@Override
public void run() {
SQLEditorNested.super.doSave(progressMonitor);
}
});
DBeaverUI.syncExec(() -> SQLEditorNested.super.doSave(progressMonitor));
}
@Override
......@@ -194,12 +188,7 @@ public abstract class SQLEditorNested<T extends DBSObject>
((SQLEditorNested.ObjectDocumentProvider) documentProvider).sourceText = null;
}
if (force) {
try {
super.init(editorSite, getEditorInput());
//setFocus();
} catch (PartInitException e) {
log.error(e);
}
super.setInput(getEditorInput());
}
reloadSyntaxRules();
}
......@@ -261,16 +250,9 @@ public abstract class SQLEditorNested<T extends DBSObject>
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
DBeaverUI.asyncExec(new Runnable() {
@Override
public void run() {
try {
SQLEditorNested.this.init(getEditorSite(), getEditorInput());
SQLEditorNested.this.reloadSyntaxRules();
} catch (PartInitException e) {
log.error(e);
}
}
DBeaverUI.asyncExec(() -> {
SQLEditorNested.this.setInput(getEditorInput());
SQLEditorNested.this.reloadSyntaxRules();
});
super.done(event);
}
......@@ -359,7 +341,7 @@ public abstract class SQLEditorNested<T extends DBSObject>
private class EditorPageControl extends ProgressPageControl {
public EditorPageControl(Composite parent, int style)
EditorPageControl(Composite parent, int style)
{
super(parent, style);
}
......@@ -372,7 +354,7 @@ public abstract class SQLEditorNested<T extends DBSObject>
public class ViewLogAction extends Action
{
public ViewLogAction()
ViewLogAction()
{
super("View compile log", DBeaverIcons.getImageDescriptor(UIIcon.COMPILE_LOG)); //$NON-NLS-2$
}
......
......@@ -460,7 +460,12 @@ public class PostgreUtils {
// Pack to permission list
List<PostgrePermission> result = new ArrayList<>(privs.size());
for (List<PostgrePrivilege> priv : privs.values()) {
result.add(new PostgreObjectPermission(owner, priv.get(0).getGrantee(), priv));
String grantee = priv.get(0).getGrantee();
// Bug in PG? Always return proc owner as separate grant but owner is in upper case (e.g. PUBLIC). Weird.
if (owner instanceof PostgreProcedure && "PUBLIC".equals(grantee)) {
grantee = "public";
}
result.add(new PostgreObjectPermission(owner, grantee, priv));
}
Collections.sort(result);
return result;
......
......@@ -71,7 +71,7 @@ public class PostgreCommandGrantPrivilege extends DBECommandAbstract<PostgrePerm
} else {
roleName = DBUtils.getQuotedIdentifier(object.getDataSource(), ((PostgreObjectPermission) permission).getGrantee());
if (object instanceof PostgreProcedure) {
objectName = ((PostgreProcedure) object).getUniqueName();
objectName = ((PostgreProcedure) object).getFullQualifiedSignature();
} else {
objectName = DBUtils.getObjectFullName(object, DBPEvaluationContext.DDL);
}
......
......@@ -20,14 +20,17 @@ import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ext.postgresql.PostgreConstants;
import org.jkiss.dbeaver.ext.postgresql.PostgreUtils;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.edit.DBEPersistAction;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.impl.struct.AbstractProcedure;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.rdb.DBSProcedureParameterKind;
import org.jkiss.dbeaver.model.struct.rdb.DBSProcedureType;
......@@ -260,6 +263,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
@Property(hidden = true, editable = true, updatable = true, order = -1)
public String getObjectDefinitionText(DBRProgressMonitor monitor, Map<String, Object> options) throws DBException
{
String procDDL;
if (getDataSource().isGreenplum() || CommonUtils.getOption(options, OPTION_DEBUGGER_SOURCE)) {
if (procSrc == null) {
try (JDBCSession session = DBUtils.openMetaSession(monitor, getDataSource(), "Read procedure body")) {
......@@ -268,7 +272,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
throw new DBException("Error reading procedure body", e);
}
}
return procSrc;
procDDL = procSrc;
} else {
if (body == null) {
if (!isPersisted()) {
......@@ -293,8 +297,23 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
}
}
}
procDDL = body;
}
return body;
if (CommonUtils.getOption(options, PostgreConstants.OPTION_DDL_SHOW_PERMISSIONS)) {
//
// ALTER FUNCTION public.__st_countagg_transfn(agg_count, raster, integer, boolean, double precision) OWNER TO postgres;
PostgreRole owner = getOwner(monitor);
if (owner != null) {
procDDL += "\n" +
"ALTER FUNCTION " + getFullQualifiedSignature() + " OWNER TO " + DBUtils.getQuotedIdentifier(owner) + "\n";
}
List<DBEPersistAction> actions = new ArrayList<>();
PostgreUtils.getObjectGrantPermissionActions(monitor, this, actions, options);
procDDL += "\n" + SQLUtils.generateScript(getDataSource(), actions.toArray(new DBEPersistAction[actions.size()]), false);
}
return procDDL;
}
@Override
......@@ -303,6 +322,10 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
body = sourceText;
}
public long getOwnerId() {
return ownerId;
}
@Property(category = CAT_PROPS, order = 10)
public PostgreRole getOwner(DBRProgressMonitor monitor) throws DBException {
return PostgreUtils.getObjectById(monitor, container.getDatabase().roleCache, container.getDatabase(), ownerId);
......@@ -374,7 +397,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
}
private String makeOverloadedName(boolean quote) {
String selfName = quote ? DBUtils.getQuotedIdentifier(this) : name;
String selfName = (quote ? DBUtils.getQuotedIdentifier(this) : name);
if (!CommonUtils.isEmpty(params)) {
StringBuilder paramsSignature = new StringBuilder(64);
paramsSignature.append("(");
......
......@@ -19,6 +19,7 @@ package org.jkiss.dbeaver.ext.postgresql.ui.editors;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.jface.action.ControlContribution;
import org.eclipse.jface.action.IContributionManager;
......@@ -29,8 +30,10 @@ import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.jkiss.dbeaver.ext.postgresql.PostgreActivator;
import org.jkiss.dbeaver.ext.postgresql.PostgreConstants;
import org.jkiss.dbeaver.ext.postgresql.model.PostgrePermissionsOwner;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreProcedure;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreScriptObject;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreTableBase;
......@@ -50,7 +53,7 @@ public class PostgreSourceViewEditor extends SQLSourceViewer<PostgreScriptObject
private static final String TOPIC_DEBUGGER_SOURCE = GeneralUtils.encodeTopic(DBPScriptObject.OPTION_DEBUGGER_SOURCE);
private Button omitHeaderCheck;
private boolean showPermissions = true;
private Boolean showPermissions;
private boolean showColumnComments = true;
private IEventBroker eventBroker;
......@@ -98,6 +101,11 @@ public class PostgreSourceViewEditor extends SQLSourceViewer<PostgreScriptObject
return false;
}
public boolean getShowPermissions() {
// By default permissions enabled only for tables
return showPermissions != null ? showPermissions : getSourceObject() instanceof PostgreTableBase;
}
@Override
protected void setSourceText(DBRProgressMonitor monitor, String sourceText)
{
......@@ -133,12 +141,13 @@ public class PostgreSourceViewEditor extends SQLSourceViewer<PostgreScriptObject
return omitHeaderCheck;
}
});
} else if (sourceObject instanceof PostgreTableBase) {
}
if (sourceObject instanceof PostgrePermissionsOwner) {
contributionManager.add(new Separator());
contributionManager.add(new ControlContribution("PGDDLShowPermissions") {
@Override
protected Control createControl(Composite parent) {
Button showPermissionsCheck = UIUtils.createCheckbox(parent, "Show permissions", "Show permission grants", true, 0);
Button showPermissionsCheck = UIUtils.createCheckbox(parent, "Show permissions", "Show permission grants", getShowPermissions(), 0);
showPermissionsCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
......@@ -149,6 +158,8 @@ public class PostgreSourceViewEditor extends SQLSourceViewer<PostgreScriptObject
return showPermissionsCheck;
}
});
}
if (sourceObject instanceof PostgreTableBase) {
contributionManager.add(new ControlContribution("PGDDLShowColumnComments") {
@Override
protected Control createControl(Composite parent) {
......@@ -184,7 +195,7 @@ public class PostgreSourceViewEditor extends SQLSourceViewer<PostgreScriptObject
Object omitValue = getEditorInput().getAttribute(DBPScriptObject.OPTION_DEBUGGER_SOURCE);
boolean omitHeader = Boolean.parseBoolean(String.valueOf(omitValue));
options.put(DBPScriptObject.OPTION_DEBUGGER_SOURCE, omitHeader);
options.put(PostgreConstants.OPTION_DDL_SHOW_PERMISSIONS, showPermissions);
options.put(PostgreConstants.OPTION_DDL_SHOW_PERMISSIONS, getShowPermissions());
options.put(PostgreConstants.OPTION_DDL_SHOW_COLUMN_COMMENTS, showColumnComments);
return options;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册