diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/LoadingJob.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/LoadingJob.java index 826aa6ff95b2720977ea59d8028100c20e779007..b80fbd169052b40f1df87eaf7f396a6ec133c64b 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/LoadingJob.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/LoadingJob.java @@ -123,7 +123,11 @@ public class LoadingJob extends AbstractJob { @Override public void run() { - visualizer.completeLoading(innerResult); + try { + visualizer.completeLoading(innerResult); + } catch (Throwable e) { + log.debug(e); + } if (innerError != null) { log.debug(innerError); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java index 235c14ec04b720118075bad66befcff2aae01252..9b55aaa88a82c3c43a8352e74db4a5fba0d4443b 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java @@ -284,30 +284,43 @@ public class PostgreRole implements PostgreObject, PostgrePermissionsOwner, DBPP @Override public Collection getPermissions(DBRProgressMonitor monitor) throws DBException { try (JDBCSession session = DBUtils.openMetaSession(monitor, getDataSource(), "Read role privileges")) { + List permissions = new ArrayList<>(); try (JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT * FROM information_schema.table_privileges WHERE table_catalog=? AND grantee=?")) { dbStat.setString(1, getDatabase().getName()); dbStat.setString(2, getName()); - try (JDBCResultSet dbResult = dbStat.executeQuery()) { - Map> privs = new LinkedHashMap<>(); - while (dbResult.next()) { - PostgrePrivilege privilege = new PostgrePrivilege(PostgrePrivilege.Kind.TABLE, dbResult); - String tableId = privilege.getObjectSchema() + "." + privilege.getObjectName(); - List privList = privs.computeIfAbsent(tableId, k -> new ArrayList<>()); - privList.add(privilege); - } - // Pack to permission list - List result = new ArrayList<>(privs.size()); - for (List priv : privs.values()) { - result.add(new PostgreRolePermission(this, PostgrePrivilege.Kind.TABLE, priv.get(0).getObjectSchema(), priv.get(0).getObjectName(), priv)); - } - Collections.sort(result); - return result; - } - } catch (SQLException e) { - throw new DBException(e, getDataSource()); + permissions.addAll(getRolePermissions(this, PostgrePrivilege.Kind.TABLE, dbStat)); } + try (JDBCPreparedStatement dbStat = session.prepareStatement( + "SELECT * FROM information_schema.routine_privileges WHERE specific_catalog=? AND grantee=?")) + { + dbStat.setString(1, getDatabase().getName()); + dbStat.setString(2, getName()); + permissions.addAll(getRolePermissions(this, PostgrePrivilege.Kind.FUNCTION, dbStat)); + } + Collections.sort(permissions); + return permissions; + } catch (SQLException e) { + throw new DBException(e, getDataSource()); + } + } + + private static Collection getRolePermissions(PostgreRole role, PostgrePrivilege.Kind kind, JDBCPreparedStatement dbStat) throws SQLException { + try (JDBCResultSet dbResult = dbStat.executeQuery()) { + Map> privs = new LinkedHashMap<>(); + while (dbResult.next()) { + PostgrePrivilege privilege = new PostgrePrivilege(kind, dbResult); + String tableId = privilege.getObjectSchema() + "." + privilege.getObjectName(); + List privList = privs.computeIfAbsent(tableId, k -> new ArrayList<>()); + privList.add(privilege); + } + // Pack to permission list + List result = new ArrayList<>(privs.size()); + for (List priv : privs.values()) { + result.add(new PostgreRolePermission(role, kind, priv.get(0).getObjectSchema(), priv.get(0).getObjectName(), priv)); + } + return result; } }