提交 c18f519c 编写于 作者: S Serge Rider

#1067 PG: table permissions panel

上级 1cd8bbe6
......@@ -246,6 +246,15 @@
class="org.jkiss.dbeaver.ext.postgresql.edit.PostgreProcedureManager"
objectType="org.jkiss.dbeaver.ext.postgresql.model.PostgreProcedure"/>
<editor id="postgresql.role.permissions" class="org.jkiss.dbeaver.ext.postgresql.ui.editors.PostgresRolePrivilegesEditor"
label="Permissions" description="Permissions" icon="#permissions" position="additions_middle" type="folder">
<objectType name="org.jkiss.dbeaver.ext.postgresql.model.PostgreRole"/>
<objectType name="org.jkiss.dbeaver.ext.postgresql.model.PostgreTableBase"/>
</editor>
<editor id="postgresql.table.permissions" class="org.jkiss.dbeaver.ext.postgresql.ui.editors.PostgresRolePrivilegesEditor"
label="Permissions" description="Permissions" icon="#permissions" position="additions_middle" type="editor">
<objectType name="org.jkiss.dbeaver.ext.postgresql.model.PostgreTableBase"/>
</editor>
<editor id="postgresql.source.view" class="org.jkiss.dbeaver.ext.postgresql.ui.editors.PostgreSourceViewEditor"
label="Source" description="Source code" icon="#sql_text" position="additions_middle"
contributor="org.jkiss.dbeaver.ui.editors.sql.SQLEditorContributorNested" type="folder" embeddable="true">
......@@ -259,11 +268,6 @@
contributor="org.jkiss.dbeaver.ui.editors.sql.SQLEditorContributorNested" type="folder">
<objectType name="org.jkiss.dbeaver.ext.postgresql.model.PostgreTable"/>
</editor>
<editor id="postgresql.role.permissions" class="org.jkiss.dbeaver.ext.postgresql.ui.editors.PostgresRolePrivilegesEditor"
label="Permissions" description="Permissions" icon="#permissions" position="additions_middle"
contributor="org.jkiss.dbeaver.ui.editors.sql.SQLEditorContributorNested" type="folder">
<objectType name="org.jkiss.dbeaver.ext.postgresql.model.PostgreRole"/>
</editor>
</extension>
<extension point="org.eclipse.ui.editors">
......
......@@ -19,8 +19,10 @@ 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.model.DBPDataSource;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSObject;
import java.util.List;
......@@ -68,7 +70,7 @@ public abstract class PostgrePermission implements DBSObject, Comparable<Postgre
}
}
private final PostgrePermissionsOwner owner;
protected final PostgrePermissionsOwner owner;
private ObjectPermission[] permissions;
public PostgrePermission(PostgrePermissionsOwner owner, List<PostgrePrivilege> privileges) {
......@@ -107,6 +109,8 @@ public abstract class PostgrePermission implements DBSObject, Comparable<Postgre
return owner.getDataSource();
}
public abstract PostgreObject getTargetObject(DBRProgressMonitor monitor) throws DBException;
public ObjectPermission[] getPermissions() {
return permissions;
}
......
......@@ -19,6 +19,7 @@ package org.jkiss.dbeaver.ext.postgresql.model;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
......@@ -30,6 +31,8 @@ import java.util.List;
*/
public class PostgreRolePermission extends PostgrePermission {
private static final Log log = Log.getLog(PostgreRolePermission.class);
private String schemaName;
private String tableName;
......@@ -45,6 +48,16 @@ public class PostgreRolePermission extends PostgrePermission {
return getFullTableName();
}
@Override
public PostgreTableBase getTargetObject(DBRProgressMonitor monitor) throws DBException
{
final PostgreSchema schema = owner.getDatabase().getSchema(monitor, schemaName);
if (schema != null) {
return schema.getChild(monitor, tableName);
}
return null;
}
public String getSchemaName() {
return schemaName;
}
......@@ -58,10 +71,6 @@ public class PostgreRolePermission extends PostgrePermission {
DBUtils.getQuotedIdentifier(getDataSource(), tableName);
}
public Object getTable(DBRProgressMonitor monitor) throws DBException {
return getFullTableName();
}
@Override
public String toString() {
return getFullTableName();
......
......@@ -23,6 +23,9 @@ import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBPNamedObject2;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCStructCache;
import org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTable;
......@@ -34,13 +37,13 @@ import org.jkiss.dbeaver.model.struct.DBSEntityAssociation;
import org.jkiss.dbeaver.model.struct.DBSObject;
import java.sql.ResultSet;
import java.util.Collection;
import java.util.List;
import java.sql.SQLException;
import java.util.*;
/**
* PostgreTable base
*/
public abstract class PostgreTableBase extends JDBCTable<PostgreDataSource, PostgreSchema> implements PostgreClass, PostgreScriptObject, DBPNamedObject2
public abstract class PostgreTableBase extends JDBCTable<PostgreDataSource, PostgreSchema> implements PostgreClass, PostgreScriptObject, PostgrePermissionsOwner, DBPNamedObject2
{
private long oid;
private String description;
......@@ -162,4 +165,37 @@ public abstract class PostgreTableBase extends JDBCTable<PostgreDataSource, Post
return getContainer().tableCache.refreshObject(monitor, getContainer(), this);
}
@Override
public Collection<PostgrePermission> getPermissions(DBRProgressMonitor monitor) throws DBException {
try (JDBCSession session = DBUtils.openMetaSession(monitor, getDataSource(), "Read table privileges")) {
try (JDBCPreparedStatement dbStat = session.prepareStatement(
"SELECT * FROM information_schema.table_privileges WHERE table_catalog=? AND table_schema=? AND table_name=?"))
{
dbStat.setString(1, getDatabase().getName());
dbStat.setString(2, getSchema().getName());
dbStat.setString(3, getName());
try (JDBCResultSet dbResult = dbStat.executeQuery()) {
Map<String, List<PostgrePrivilege>> privs = new LinkedHashMap<>();
while (dbResult.next()) {
PostgrePrivilege privilege = new PostgrePrivilege(dbResult);
List<PostgrePrivilege> privList = privs.get(privilege.getGrantee());
if (privList == null) {
privList = new ArrayList<>();
privs.put(privilege.getGrantee(), privList);
}
privList.add(privilege);
}
// Pack to permission list
List<PostgrePermission> result = new ArrayList<>(privs.size());
for (List<PostgrePrivilege> priv : privs.values()) {
result.add(new PostgreTablePermission(this, priv.get(0).getGrantee(), priv));
}
Collections.sort(result);
return result;
}
} catch (SQLException e) {
throw new DBException(e, getDataSource());
}
}
}
}
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License (version 2)
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jkiss.dbeaver.ext.postgresql.model;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import java.util.List;
/**
* PostgreTablePermission
*/
public class PostgreTablePermission extends PostgrePermission {
private static final Log log = Log.getLog(PostgreTablePermission.class);
private String grantee;
public PostgreTablePermission(PostgrePermissionsOwner owner, String grantee, List<PostgrePrivilege> privileges) {
super(owner, privileges);
this.grantee = grantee;
}
@Property(viewable = true, order = 1)
@NotNull
public String getName() {
return grantee;
}
@Override
public PostgreRole getTargetObject(DBRProgressMonitor monitor) throws DBException
{
return owner.getDatabase().roleCache.getObject(monitor, owner.getDatabase(), grantee);
}
public String getGrantee() {
return grantee;
}
@Override
public String toString() {
return getName();
}
@Override
public int compareTo(@NotNull PostgrePermission o) {
if (o instanceof PostgreTablePermission) {
return grantee.compareTo(((PostgreTablePermission)o).grantee);
}
return 0;
}
}
......@@ -17,7 +17,12 @@
*/
package org.jkiss.dbeaver.ext.postgresql.ui.editors;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
......@@ -27,19 +32,22 @@ 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.model.PostgrePermission;
import org.jkiss.dbeaver.ext.postgresql.model.PostgrePermissionsOwner;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreRole;
import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.ext.postgresql.model.*;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService;
import org.jkiss.dbeaver.ui.LoadingJob;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.ProgressPageControl;
import org.jkiss.dbeaver.ui.actions.navigator.NavigatorHandlerObjectOpen;
import org.jkiss.dbeaver.ui.controls.TreeContentProvider;
import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.editors.AbstractDatabaseObjectEditor;
import org.jkiss.dbeaver.utils.GeneralUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
......@@ -71,6 +79,34 @@ public class PostgresRolePrivilegesEditor extends AbstractDatabaseObjectEditor<P
this.pageControl = new PageControl(parent);
this.pageControl.createOrSubstituteProgressPanel(getSite());
this.pageControl.setDoubleClickHandler(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
final ISelection selection = pageControl.getSelectionProvider().getSelection();
if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
final PostgrePermission element = (PostgrePermission) ((IStructuredSelection) selection).getFirstElement();
new AbstractJob("Open target object") {
@Override
protected IStatus run(DBRProgressMonitor monitor) {
try {
final PostgreObject targetObject = element.getTargetObject(monitor);
if (targetObject != null) {
DBeaverUI.syncExec(new Runnable() {
@Override
public void run() {
NavigatorHandlerObjectOpen.openEntityEditor(targetObject);
}
});
}
} catch (DBException e) {
return GeneralUtils.makeExceptionStatus(e);
}
return Status.OK_STATUS;
}
}.schedule();
}
}
});
}
private boolean isRoleEditor() {
......@@ -78,7 +114,9 @@ public class PostgresRolePrivilegesEditor extends AbstractDatabaseObjectEditor<P
}
@Override
public void setFocus() {
if (this.pageControl != null) {
this.pageControl.setFocus();
}
}
@Override
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册