diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.ui/src/org/jkiss/dbeaver/ext/postgresql/ui/PostgreConnectionPage.java b/plugins/org.jkiss.dbeaver.ext.postgresql.ui/src/org/jkiss/dbeaver/ext/postgresql/ui/PostgreConnectionPage.java index 15f927b97e76537df245cca3291d29ff9133296d..4a9a18ca6f24deaae69a145f8c58bc80a965615d 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.ui/src/org/jkiss/dbeaver/ext/postgresql/ui/PostgreConnectionPage.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.ui/src/org/jkiss/dbeaver/ext/postgresql/ui/PostgreConnectionPage.java @@ -49,6 +49,7 @@ public class PostgreConnectionPage extends ConnectionPageWithAuth implements ICo private Text hostText; private Text portText; private Text dbText; + private Text roleText; private ClientHomesSelector homesSelector; private boolean activated = false; @@ -100,6 +101,11 @@ public class PostgreConnectionPage extends ConnectionPageWithAuth implements ICo Group advancedGroup = UIUtils.createControlGroup(mainGroup, "Advanced", 2, GridData.HORIZONTAL_ALIGN_BEGINNING, 0); + roleText = UIUtils.createLabelText(advancedGroup, "Role", null, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING); + roleText.setLayoutData(gd); + roleText.addModifyListener(textListener); + homesSelector = new ClientHomesSelector(advancedGroup, PostgreMessages.dialog_setting_connection_localClient, false); gd = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING); homesSelector.getPanel().setLayoutData(gd); @@ -156,6 +162,9 @@ public class PostgreConnectionPage extends ConnectionPageWithAuth implements ICo } dbText.setText(databaseName); } + if (roleText != null) { + roleText.setText(CommonUtils.notEmpty(connectionInfo.getProviderProperty(PostgreConstants.PROP_CHOSEN_ROLE))); + } homesSelector.populateHomes(driver, connectionInfo.getClientHomeId(), site.isNew()); activated = true; @@ -174,6 +183,9 @@ public class PostgreConnectionPage extends ConnectionPageWithAuth implements ICo if (dbText != null) { connectionInfo.setDatabaseName(dbText.getText().trim()); } + if (roleText != null) { + connectionInfo.setProviderProperty(PostgreConstants.PROP_CHOSEN_ROLE, roleText.getText().trim()); + } if (homesSelector != null) { connectionInfo.setClientHomeId(homesSelector.getSelectedHome()); } @@ -189,5 +201,4 @@ public class PostgreConnectionPage extends ConnectionPageWithAuth implements ICo new DriverPropertiesDialogPage(this) }; } - } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreConstants.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreConstants.java index 35379f357cdd8d5467d566dfeb74f92bcc71b4a1..cdb1c7667af296dc824898d0c939820fabf0158c 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreConstants.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreConstants.java @@ -38,6 +38,7 @@ public class PostgreConstants { public static final String DEFAULT_DATA_TYPE = "varchar"; public static final String DEFAULT_USER = "postgres"; + public static final String PROP_CHOSEN_ROLE = DBConstants.INTERNAL_PROP_PREFIX + "chosen-role@"; public static final String PROP_SHOW_NON_DEFAULT_DB = DBConstants.INTERNAL_PROP_PREFIX + "show-non-default-db@"; public static final String PROP_SHOW_UNAVAILABLE_DB = DBConstants.INTERNAL_PROP_PREFIX + "show-unavailable-db@"; public static final String PROP_SHOW_TEMPLATES_DB = DBConstants.INTERNAL_PROP_PREFIX + "show-template-db@"; diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataSource.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataSource.java index cc3748a3b1e415af923de880af6ff790f544cf00..1553db43a91b9732e9f025b636d8eeb2c3534b55 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataSource.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataSource.java @@ -186,7 +186,7 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont return props; } - private void initServerSSL(Map props, DBWHandlerConfiguration sslConfig) throws Exception { + private void initServerSSL(Map props, DBWHandlerConfiguration sslConfig) { props.put(PostgreConstants.PROP_SSL, "true"); final String rootCertProp = sslConfig.getStringProperty(PostgreConstants.PROP_SSL_ROOT_CERT); @@ -213,7 +213,7 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont props.put("sslpasswordcallback", DefaultCallbackHandler.class.getName()); } - private void initProxySSL(Map props, DBWHandlerConfiguration sslConfig) throws Exception { + private void initProxySSL(Map props, DBWHandlerConfiguration sslConfig) { // No special config //initServerSSL(props, sslConfig); } @@ -231,6 +231,8 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont ((PostgreExecutionContext)context).setDefaultSchema(monitor, activeSchema); } } + final String roleName = getContainer().getConnectionConfiguration().getProviderProperty(PostgreConstants.PROP_CHOSEN_ROLE); + ((PostgreExecutionContext)context).useRoleWithName(monitor, roleName); } public DatabaseCache getDatabaseCache() @@ -282,24 +284,18 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont } @Override - public Collection getChildren(@NotNull DBRProgressMonitor monitor) - throws DBException - { + public Collection getChildren(@NotNull DBRProgressMonitor monitor) { return getDatabases(); } @Override - public PostgreDatabase getChild(@NotNull DBRProgressMonitor monitor, @NotNull String childName) - throws DBException - { + public PostgreDatabase getChild(@NotNull DBRProgressMonitor monitor, @NotNull String childName) { return getDatabase(childName); } @NotNull @Override - public Class getPrimaryChildType(@NotNull DBRProgressMonitor monitor) - throws DBException - { + public Class getPrimaryChildType(@NotNull DBRProgressMonitor monitor) { return PostgreDatabase.class; } @@ -333,9 +329,9 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont if (CommonUtils.isEmpty(conConfig.getUrl()) || !CommonUtils.isEmpty(conConfig.getHostName())) { conConfig.setDatabaseName(instance.getName()); conConfig.setUrl(getContainer().getDriver().getDataSourceProvider().getConnectionURL(getContainer().getDriver(), conConfig)); - } else { + } //else { //String url = conConfig.getUrl(); - } + //} pgConnection = super.openConnection(monitor, context, purpose); } @@ -585,7 +581,7 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont } } - private Pattern ERROR_POSITION_PATTERN = Pattern.compile("\\n\\s*\\p{L}+\\s*: ([0-9]+)"); + private final Pattern ERROR_POSITION_PATTERN = Pattern.compile("\\n\\s*\\p{L}+\\s*: ([0-9]+)"); @Nullable @Override @@ -654,5 +650,4 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont } return null; } - } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreExecutionContext.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreExecutionContext.java index bd952f543ad00bee850084fbb64b3d38a37e07ff..98a9b8a19c2b24e0c7349c0284d0844836182373 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreExecutionContext.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreExecutionContext.java @@ -19,7 +19,6 @@ 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.ext.postgresql.PostgreConstants; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.connection.DBPConnectionBootstrap; @@ -29,6 +28,7 @@ import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; 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.exec.jdbc.JDBCStatement; import org.jkiss.dbeaver.model.impl.jdbc.JDBCExecutionContext; import org.jkiss.dbeaver.model.impl.jdbc.JDBCRemoteInstance; import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; @@ -43,8 +43,6 @@ import java.util.List; * PostgreExecutionContext */ public class PostgreExecutionContext extends JDBCExecutionContext implements DBCExecutionContextDefaults { - private static final Log log = Log.getLog(PostgreExecutionContext.class); - private PostgreSchema activeSchema; private final List searchPath = new ArrayList<>(); private List defaultSearchPath = new ArrayList<>(); @@ -244,4 +242,16 @@ public class PostgreExecutionContext extends JDBCExecutionContext implements DBC } } + void useRoleWithName(final DBRProgressMonitor monitor, String roleName) throws DBCException { + if (roleName == null || roleName.isEmpty()) { + roleName = "NONE"; + } + try (JDBCSession session = openSession(monitor, DBCExecutionPurpose.UTIL, "Set active role")) { + try (JDBCStatement dbStat = session.createStatement()) { + dbStat.executeUpdate("SET ROLE " + roleName); + } + } catch (SQLException e) { + throw new DBCException(e, this); + } + } }