提交 1543bdd4 编写于 作者: S Serge Rider

#7472 Default catalog/schema. Model + PG impl

上级 daa700b5
......@@ -400,10 +400,12 @@ public class CoreMessages extends NLS {
public static String dialog_connection_wizard_final_label_connection_folder;
public static String dialog_connection_wizard_final_label_connection;
public static String dialog_connection_wizard_final_label_isolation_level;
public static String dialog_connection_wizard_final_label_default_database;
public static String dialog_connection_wizard_final_label_default_database_tooltip;
public static String dialog_connection_wizard_final_label_default_schema;
public static String dialog_connection_wizard_final_label_default_schema_tooltip;
public static String dialog_connection_wizard_final_label_keepalive;
public static String dialog_connection_wizard_final_label_isolation_level_tooltip;
public static String dialog_connection_wizard_final_label_default_schema_tooltip;
public static String dialog_connection_wizard_final_label_keepalive_tooltip;
public static String dialog_connection_wizard_final_label_bootstrap_query;
public static String dialog_connection_wizard_configure;
......
......@@ -113,8 +113,10 @@ dialog_connection_wizard_final_label_connection_folder = Connection folder
dialog_connection_wizard_final_label_connection_name = Connection name
dialog_connection_wizard_final_label_connection_type = Connection type
dialog_connection_wizard_final_label_connection_types_edit = Edit connection types
dialog_connection_wizard_final_label_default_schema = Default database/schema
dialog_connection_wizard_final_label_default_schema_tooltip = Name of schema or catalog which will be set as default.
dialog_connection_wizard_final_label_default_database = Default database
dialog_connection_wizard_final_label_default_database_tooltip = Name of catalog which will be set as default.
dialog_connection_wizard_final_label_default_schema = Default schema
dialog_connection_wizard_final_label_default_schema_tooltip = Name of schema which will be set as default.
dialog_connection_wizard_final_label_edit = Edit
dialog_connection_wizard_final_label_isolation_level = Isolation level
dialog_connection_wizard_final_label_isolation_level_tooltip = Default transaction isolation level.
......
......@@ -275,9 +275,10 @@ dialog_connection_wizard_final_label_connection_name = Verbindungsname
dialog_connection_wizard_final_label_connection_type = Verbindungstyp
dialog_connection_wizard_final_label_default_database = Standardkatalog
dialog_connection_wizard_final_label_default_database_tooltip = Name des Katalogs, welches als Standard verwendet wird.
dialog_connection_wizard_final_label_default_schema = Standardschema
dialog_connection_wizard_final_label_default_schema_tooltip = Name des Schemas oder Katalogs, welches als Standard verwendet wird.
dialog_connection_wizard_final_label_default_schema_tooltip = Name des Schemas, welches als Standard verwendet wird.
dialog_connection_wizard_final_label_edit = Bearbeiten
......
......@@ -189,10 +189,11 @@ dialog_connection_wizard_final_label_bootstrap_tooltip = Requ\u00E8tes SQL \u00E
dialog_connection_wizard_final_label_connection = Connexion
dialog_connection_wizard_final_label_connection_name = Nom de la connexion
dialog_connection_wizard_final_label_connection_folder = R\u00E9pertoire de connexion
dialog_connection_wizard_final_label_connection_name = Nom de la connexion
dialog_connection_wizard_final_label_connection_type = Type de connexion
dialog_connection_wizard_final_label_default_database = Catalogue par d\u00E9faut
dialog_connection_wizard_final_label_default_database_tooltip = Nom du catalogue assign\u00E9 par d\u00E9faut.
dialog_connection_wizard_final_label_default_schema = Sch\u00E9ma par d\u00E9faut
dialog_connection_wizard_final_label_default_schema_tooltip = Nom du sch\u00E9ma ou catalogue assign\u00E9 par d\u00E9faut.
dialog_connection_wizard_final_label_default_schema_tooltip = Nom du sch\u00E9ma assign\u00E9 par d\u00E9faut.
dialog_connection_wizard_final_label_edit = Editer
dialog_connection_wizard_final_label_isolation_level = Niveau d'isolation
dialog_connection_wizard_final_label_isolation_level_tooltip = Niveau d'isolation par d\u00E9faut des transactions.
......
......@@ -237,8 +237,10 @@ dialog_connection_wizard_final_label_connection_folder = \u041F\u0430\u043F\u043
dialog_connection_wizard_final_label_connection_name = \u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F
dialog_connection_wizard_final_label_connection_type = \u0422\u0438\u043F \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F
dialog_connection_wizard_final_label_connection_types_edit = \u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0442\u0438\u043F\u044B \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0439
dialog_connection_wizard_final_label_default_schema = \u0411\u0430\u0437\u0430/\u0441\u0445\u0435\u043C\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E
dialog_connection_wizard_final_label_default_schema_tooltip = \u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0438\u043B\u0438 \u0441\u0445\u0435\u043C\u044B \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E
dialog_connection_wizard_final_label_default_database = \u0411\u0430\u0437\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E
dialog_connection_wizard_final_label_default_database_tooltip = \u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E
dialog_connection_wizard_final_label_default_schema = \u0421\u0445\u0435\u043C\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E
dialog_connection_wizard_final_label_default_schema_tooltip = \u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0441\u0445\u0435\u043C\u044B \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E
dialog_connection_wizard_final_label_edit = \u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C
dialog_connection_wizard_final_label_isolation_level = \u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0438\u0437\u043E\u043B\u044F\u0446\u0438\u0438
dialog_connection_wizard_final_label_isolation_level_tooltip = \u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0438\u0437\u043E\u043B\u044F\u0446\u0438\u0438 \u0442\u0440\u0430\u043D\u0437\u0430\u043A\u0446\u0438 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.
......
......@@ -51,11 +51,15 @@ import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.connection.DBPConnectionBootstrap;
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
import org.jkiss.dbeaver.model.connection.DBPConnectionType;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.exec.DBCExecutionContextDefaults;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DefaultProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.DBSObjectContainer;
import org.jkiss.dbeaver.model.struct.rdb.DBSCatalog;
import org.jkiss.dbeaver.model.struct.rdb.DBSSchema;
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.*;
......@@ -78,6 +82,7 @@ class ConnectionPageInitialization extends ConnectionWizardPage implements IData
private Button autocommit;
private Combo isolationLevel;
private Combo defaultCatalog;
private Combo defaultSchema;
private Spinner keepAliveInterval;
......@@ -126,14 +131,15 @@ class ConnectionPageInitialization extends ConnectionWizardPage implements IData
DBPDataSource dataSource = originalDataSource.getDataSource();
loadDatabaseSettings(dataSource);
}
defaultSchema.setText(CommonUtils.notEmpty(
conConfig.getBootstrap().getDefaultObjectName()));
defaultCatalog.setText(CommonUtils.notEmpty(conConfig.getBootstrap().getDefaultCatalogName()));
defaultSchema.setText(CommonUtils.notEmpty(conConfig.getBootstrap().getDefaultSchemaName()));
keepAliveInterval.setSelection(conConfig.getKeepAliveInterval());
activated = true;
}
} else {
// Default settings
isolationLevel.setEnabled(false);
defaultCatalog.setText("");
defaultSchema.setText("");
}
}
......@@ -150,7 +156,7 @@ class ConnectionPageInitialization extends ConnectionWizardPage implements IData
}
}
private void loadDatabaseSettings(DBRProgressMonitor monitor, DBPDataSource dataSource) throws InvocationTargetException, InterruptedException {
private void loadDatabaseSettings(DBRProgressMonitor monitor, DBPDataSource dataSource) {
DBPDataSourceContainer dataSourceContainer = dataSource.getContainer();
Collection<DBPTransactionIsolation> txnLevels = CommonUtils.safeCollection(dataSource.getInfo().getSupportedTransactionsIsolation());
Integer levelCode = dataSourceContainer.getDefaultTransactionsIsolation();
......@@ -187,39 +193,55 @@ class ConnectionPageInitialization extends ConnectionWizardPage implements IData
});
if (dataSource instanceof DBSObjectContainer) {
DBSObjectContainer schemaContainer = DBUtils.getChangeableObjectContainer(dataSource, (DBSObjectContainer) dataSource);
if (schemaContainer != null) {
try {
final List<String> schemaNames = new ArrayList<>();
Collection<? extends DBSObject> children = schemaContainer.getChildren(monitor);
if (children != null) {
for (DBSObject child : children) {
if (child instanceof DBSObjectContainer) {
schemaNames.add(child.getName());
}
DBCExecutionContext executionContext = DBUtils.getDefaultContext(dataSource, true);
DBCExecutionContextDefaults contextDefaults = executionContext.getContextDefaults();
DBSObjectContainer catalogContainer = DBUtils.getChangeableObjectContainer(contextDefaults, (DBSObjectContainer) dataSource, DBSCatalog.class);
if (catalogContainer != null) {
loadSelectableObject(monitor, catalogContainer, defaultCatalog, contextDefaults, true);
}
DBSObjectContainer schemaContainer = DBUtils.getChangeableObjectContainer(contextDefaults, (DBSObjectContainer) dataSource, DBSSchema.class);
loadSelectableObject(monitor, schemaContainer, defaultSchema, contextDefaults, false);
}
txnOptionsLoaded = true;
}
private void loadSelectableObject(DBRProgressMonitor monitor, DBSObjectContainer objectContainer, Combo objectCombo, DBCExecutionContextDefaults contextDefaults, boolean isCatalogs) {
if (objectContainer != null) {
try {
final List<String> objectNames = new ArrayList<>();
Collection<? extends DBSObject> children = objectContainer.getChildren(monitor);
if (children != null) {
for (DBSObject child : children) {
if (child instanceof DBSObjectContainer) {
objectNames.add(child.getName());
}
}
if (!schemaNames.isEmpty()) {
UIUtils.syncExec(() -> {
if (!defaultSchema.isDisposed()) {
String oldText = defaultSchema.getText();
defaultSchema.removeAll();
for (String name : schemaNames) {
defaultSchema.add(name);
}
if (!CommonUtils.isEmpty(oldText)) {
defaultSchema.setText(oldText);
}
if (!objectNames.isEmpty()) {
UIUtils.syncExec(() -> {
if (!objectCombo.isDisposed()) {
String oldText = objectCombo.getText();
objectCombo.removeAll();
for (String name : objectNames) {
objectCombo.add(name);
}
if (!CommonUtils.isEmpty(oldText)) {
objectCombo.setText(oldText);
}
if (contextDefaults != null) {
DBSObject defaultObject = isCatalogs ? contextDefaults.getDefaultCatalog() : contextDefaults.getDefaultSchema();
if (defaultObject != null) {
objectCombo.setText(defaultObject.getName());
}
}
});
}
} catch (DBException e) {
log.warn("Can't read schema list", e);
}
});
}
} catch (DBException e) {
log.warn("Can't read schema list", e);
}
}
txnOptionsLoaded = true;
}
@Override
......@@ -248,6 +270,9 @@ class ConnectionPageInitialization extends ConnectionWizardPage implements IData
isolationLevel = UIUtils.createLabelCombo(txnGroup, CoreMessages.dialog_connection_wizard_final_label_isolation_level,
CoreMessages.dialog_connection_wizard_final_label_isolation_level_tooltip, SWT.DROP_DOWN | SWT.READ_ONLY);
defaultCatalog = UIUtils.createLabelCombo(txnGroup, CoreMessages.dialog_connection_wizard_final_label_default_database,
CoreMessages.dialog_connection_wizard_final_label_default_database_tooltip, SWT.DROP_DOWN);
((GridData)defaultCatalog.getLayoutData()).widthHint = UIUtils.getFontHeight(defaultCatalog) * 20;
defaultSchema = UIUtils.createLabelCombo(txnGroup, CoreMessages.dialog_connection_wizard_final_label_default_schema,
CoreMessages.dialog_connection_wizard_final_label_default_schema_tooltip, SWT.DROP_DOWN);
((GridData)defaultSchema.getLayoutData()).widthHint = UIUtils.getFontHeight(defaultSchema) * 20;
......@@ -314,11 +339,11 @@ class ConnectionPageInitialization extends ConnectionWizardPage implements IData
} catch (DBException e) {
log.error(e);
}
dataSource.getConnectionConfiguration().getBootstrap().setDefaultObjectName(defaultSchema.getText());
final DBPConnectionConfiguration confConfig = dataSource.getConnectionConfiguration();
DBPConnectionBootstrap bootstrap = confConfig.getBootstrap();
bootstrap.setDefaultCatalogName(defaultCatalog.getText());
bootstrap.setDefaultSchemaName(defaultSchema.getText());
bootstrap.setIgnoreErrors(ignoreBootstrapErrors);
bootstrap.setInitQueries(bootstrapQueries);
......@@ -344,13 +369,7 @@ class ConnectionPageInitialization extends ConnectionWizardPage implements IData
@Override
public void testConnection(DBCSession session) {
// We load settings to fill txn isolation levels and schema names (#6794)
try {
loadDatabaseSettings(session.getProgressMonitor(), session.getDataSource());
} catch (InvocationTargetException e) {
DBWorkbench.getPlatformUI().showError("Database info reading", "Error reading database settings", e.getTargetException());
} catch (InterruptedException e) {
// ignore
}
loadDatabaseSettings(session.getProgressMonitor(), session.getDataSource());
}
}
......@@ -196,7 +196,7 @@ public class DB2DataSource extends JDBCDataSource implements DBCQueryPlanner, IA
if (initFrom != null) {
((DB2ExecutionContext)context).setCurrentSchema(monitor, ((DB2ExecutionContext)initFrom).getDefaultSchema());
} else {
((DB2ExecutionContext)context).refreshDefaults(monitor);
((DB2ExecutionContext)context).refreshDefaults(monitor, true);
}
}
......
......@@ -105,7 +105,7 @@ public class DB2ExecutionContext extends JDBCExecutionContext implements DBCExec
}
@Override
public boolean refreshDefaults(DBRProgressMonitor monitor) throws DBException {
public boolean refreshDefaults(DBRProgressMonitor monitor, boolean useBootstrapSettings) throws DBException {
// Check default active schema
try (JDBCSession session = openSession(monitor, DBCExecutionPurpose.META, "Query active schema")) {
// Get active schema
......
......@@ -360,7 +360,7 @@ public class ExasolDataSource extends JDBCDataSource implements DBCQueryPlanner,
if (initFrom != null) {
((ExasolExecutionContext)context).setCurrentSchema(monitor, ((ExasolExecutionContext)initFrom).getDefaultSchema());
} else {
((ExasolExecutionContext)context).refreshDefaults(monitor);
((ExasolExecutionContext)context).refreshDefaults(monitor, true);
}
}
......
......@@ -104,7 +104,7 @@ public class ExasolExecutionContext extends JDBCExecutionContext implements DBCE
}
@Override
public boolean refreshDefaults(DBRProgressMonitor monitor) throws DBException {
public boolean refreshDefaults(DBRProgressMonitor monitor, boolean useBootstrapSettings) throws DBException {
// Check default active schema
try (JDBCSession session = openSession(monitor, DBCExecutionPurpose.META, "Query active schema")) {
// Get active schema
......
......@@ -284,7 +284,7 @@ public class GenericExecutionContext extends JDBCExecutionContext implements DBC
}
@Override
public boolean refreshDefaults(DBRProgressMonitor monitor) throws DBException {
public boolean refreshDefaults(DBRProgressMonitor monitor, boolean useBootstrapSettings) throws DBException {
String oldEntityName = selectedEntityName;
DBSObject oldDefaultObject = getDefaultObject();
......
......@@ -140,7 +140,7 @@ public class SQLServerDataSource extends JDBCDataSource implements DBSInstanceCo
((SQLServerExecutionContext)context).setCurrentDatabase(monitor, defaultObject);
}
} else {
((SQLServerExecutionContext)context).refreshDefaults(monitor);
((SQLServerExecutionContext)context).refreshDefaults(monitor, true);
}
}
......
......@@ -111,7 +111,7 @@ public class SQLServerExecutionContext extends JDBCExecutionContext implements D
}
@Override
public boolean refreshDefaults(DBRProgressMonitor monitor) throws DBException {
public boolean refreshDefaults(DBRProgressMonitor monitor, boolean useBootstrapSettings) throws DBException {
// Check default active schema
try (JDBCSession session = openSession(monitor, DBCExecutionPurpose.META, "Query active database")) {
activeDatabaseName = SQLServerUtils.getCurrentDatabase(session);
......
......@@ -208,7 +208,7 @@ public class MySQLDataSource extends JDBCDataSource {
((MySQLExecutionContext)context).setCurrentDatabase(monitor, object);
}
} else {
((MySQLExecutionContext)context).refreshDefaults(monitor);
((MySQLExecutionContext)context).refreshDefaults(monitor, true);
}
}
......
......@@ -107,7 +107,7 @@ public class MySQLExecutionContext extends JDBCExecutionContext implements DBCEx
}
@Override
public boolean refreshDefaults(DBRProgressMonitor monitor) throws DBException {
public boolean refreshDefaults(DBRProgressMonitor monitor, boolean useBootstrapSettings) throws DBException {
// Check default active schema
try (JDBCSession session = openSession(monitor, DBCExecutionPurpose.META, "Query active database")) {
activeDatabaseName = MySQLUtils.determineCurrentDatabase(session);
......
......@@ -215,7 +215,7 @@ public class OracleDataSource extends JDBCDataSource implements IAdaptable {
if (initFrom != null) {
((OracleExecutionContext)context).setCurrentSchema(monitor, ((OracleExecutionContext)initFrom).getDefaultSchema());
} else {
((OracleExecutionContext)context).refreshDefaults(monitor);
((OracleExecutionContext)context).refreshDefaults(monitor, true);
}
{
......
......@@ -100,7 +100,7 @@ public class OracleExecutionContext extends JDBCExecutionContext implements DBCE
}
@Override
public boolean refreshDefaults(DBRProgressMonitor monitor) throws DBException {
public boolean refreshDefaults(DBRProgressMonitor monitor, boolean useBootstrapSettings) throws DBException {
// Check default active schema
try (JDBCSession session = openSession(monitor, DBCExecutionPurpose.META, "Query active schema")) {
// Get active schema
......
......@@ -89,7 +89,10 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont
@Override
protected void initializeRemoteInstance(@NotNull DBRProgressMonitor monitor) throws DBException {
activeDatabaseName = getContainer().getConnectionConfiguration().getDatabaseName();
activeDatabaseName = getContainer().getConnectionConfiguration().getBootstrap().getDefaultCatalogName();
if (CommonUtils.isEmpty(activeDatabaseName)) {
activeDatabaseName = getContainer().getConnectionConfiguration().getDatabaseName();
}
if (CommonUtils.isEmpty(activeDatabaseName)) {
activeDatabaseName = PostgreConstants.DEFAULT_DATABASE;
}
......@@ -202,7 +205,7 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont
((PostgreExecutionContext)context).setDefaultSchema(monitor, activeSchema);
}
} else {
((PostgreExecutionContext)context).refreshDefaults(monitor);
((PostgreExecutionContext)context).refreshDefaults(monitor, true);
}
}
......
......@@ -22,6 +22,7 @@ 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;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.DBCExecutionContextDefaults;
import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose;
......@@ -131,9 +132,16 @@ public class PostgreExecutionContext extends JDBCExecutionContext implements DBC
}
@Override
public boolean refreshDefaults(DBRProgressMonitor monitor) throws DBException {
public boolean refreshDefaults(DBRProgressMonitor monitor, boolean useBootstrapSettings) throws DBException {
// Check default active schema
try (JDBCSession session = openSession(monitor, DBCExecutionPurpose.META, "Get context active schema")) {
try (JDBCSession session = openSession(monitor, DBCExecutionPurpose.META, "Read context defaults")) {
if (useBootstrapSettings) {
DBPConnectionBootstrap bootstrap = getBootstrapSettings();
if (!CommonUtils.isEmpty(bootstrap.getDefaultSchemaName())) {
setSearchPath(monitor, bootstrap.getDefaultSchemaName());
}
}
try (JDBCPreparedStatement stat = session.prepareStatement("SELECT current_schema(),session_user")) {
try (JDBCResultSet rs = stat.executeQuery()) {
if (rs.nextRow()) {
......@@ -178,21 +186,23 @@ public class PostgreExecutionContext extends JDBCExecutionContext implements DBC
private void setSearchPath(DBRProgressMonitor monitor, PostgreSchema schema) throws DBCException {
// Construct search path from current search path but put default schema first
setSearchPath(monitor, schema.getName());
}
private void setSearchPath(DBRProgressMonitor monitor, String defSchemaName) throws DBCException {
List<String> newSearchPath = new ArrayList<>(getDefaultSearchPath());
{
String defSchemaName = schema.getName();
int schemaIndex = newSearchPath.indexOf(defSchemaName);
if (schemaIndex == 0) {
// Already default schema
} else {
if (schemaIndex > 0) {
// Remove from previous position
newSearchPath.remove(schemaIndex);
}
// Add it first
newSearchPath.add(0, defSchemaName);
int schemaIndex = newSearchPath.indexOf(defSchemaName);
if (schemaIndex == 0) {
// Already default schema
} else {
if (schemaIndex > 0) {
// Remove from previous position
newSearchPath.remove(schemaIndex);
}
// Add it first
newSearchPath.add(0, defSchemaName);
}
StringBuilder spString = new StringBuilder();
for (String sp : newSearchPath) {
if (spString.length() > 0) spString.append(",");
......
......@@ -1716,7 +1716,7 @@ public final class DBUtils {
try {
DBSCatalog defaultCatalog = contextDefaults.getDefaultCatalog();
DBSSchema defaultSchema = contextDefaults.getDefaultSchema();
if (contextDefaults.refreshDefaults(monitor)) {
if (contextDefaults.refreshDefaults(monitor, false)) {
fireObjectSelectionChange(defaultCatalog, contextDefaults.getDefaultCatalog());
fireObjectSelectionChange(defaultSchema, contextDefaults.getDefaultSchema());
}
......@@ -1736,19 +1736,19 @@ public final class DBUtils {
}
}
public static DBSObjectContainer getChangeableObjectContainer(DBPDataSource dataSource, DBSObjectContainer root) {
DBCExecutionContext executionContext = DBUtils.getDefaultContext(dataSource, true);
DBCExecutionContextDefaults contextDefaults = executionContext.getContextDefaults();
public static DBSObjectContainer getChangeableObjectContainer(DBCExecutionContextDefaults contextDefaults, DBSObjectContainer root, Class<? extends DBSObject> childType) {
if (contextDefaults == null) {
return null;
}
if (contextDefaults.supportsCatalogChange()) {
if (childType == DBSCatalog.class && contextDefaults.supportsCatalogChange()) {
return root;
}
if (contextDefaults.supportsSchemaChange()) {
if (childType == DBSSchema.class && contextDefaults.supportsSchemaChange()) {
DBSCatalog defaultCatalog = contextDefaults.getDefaultCatalog();
if (defaultCatalog != null) {
return defaultCatalog;
} else {
return root;
}
}
return null;
......
......@@ -18,29 +18,30 @@ package org.jkiss.dbeaver.model.connection;
import org.jkiss.utils.CommonUtils;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Connection bootstrap info.
* Bootstrap properties are applied to each opened connection after data-source initialization.
*/
public class DBPConnectionBootstrap
{
private String defaultObjectName;
public class DBPConnectionBootstrap {
private String defaultCatalogName;
private String defaultSchemaName;
private Boolean defaultAutoCommit;
private Integer defaultTransactionIsolation;
private final List<String> initQueries;
private boolean ignoreErrors;
public DBPConnectionBootstrap()
{
public DBPConnectionBootstrap() {
this.initQueries = new ArrayList<>();
this.ignoreErrors = false;
}
public DBPConnectionBootstrap(DBPConnectionBootstrap info)
{
this.defaultObjectName = info.defaultObjectName;
public DBPConnectionBootstrap(DBPConnectionBootstrap info) {
this.defaultCatalogName = info.defaultCatalogName;
this.defaultSchemaName = info.defaultSchemaName;
this.defaultAutoCommit = info.defaultAutoCommit;
this.defaultTransactionIsolation = info.defaultTransactionIsolation;
this.initQueries = new ArrayList<>(info.initQueries);
......@@ -56,12 +57,20 @@ public class DBPConnectionBootstrap
initQueries.addAll(queries);
}
public String getDefaultObjectName() {
return defaultObjectName;
public String getDefaultCatalogName() {
return defaultCatalogName;
}
public void setDefaultObjectName(String defaultObjectName) {
this.defaultObjectName = defaultObjectName;
public void setDefaultCatalogName(String defaultCatalogName) {
this.defaultCatalogName = defaultCatalogName;
}
public String getDefaultSchemaName() {
return defaultSchemaName;
}
public void setDefaultSchemaName(String defaultSchemaName) {
this.defaultSchemaName = defaultSchemaName;
}
public Boolean getDefaultAutoCommit() {
......@@ -90,11 +99,11 @@ public class DBPConnectionBootstrap
public boolean hasData() {
return
defaultAutoCommit != null ||
defaultTransactionIsolation != null ||
!CommonUtils.isEmpty(defaultObjectName) ||
ignoreErrors ||
!CommonUtils.isEmpty(initQueries);
defaultAutoCommit != null ||
defaultTransactionIsolation != null ||
!CommonUtils.isEmpty(defaultCatalogName) ||
ignoreErrors ||
!CommonUtils.isEmpty(initQueries);
}
@Override
......@@ -102,12 +111,12 @@ public class DBPConnectionBootstrap
if (!(obj instanceof DBPConnectionBootstrap)) {
return false;
}
DBPConnectionBootstrap source = (DBPConnectionBootstrap)obj;
DBPConnectionBootstrap source = (DBPConnectionBootstrap) obj;
return
CommonUtils.equalObjects(this.defaultObjectName, source.defaultObjectName) &&
CommonUtils.equalObjects(this.defaultAutoCommit, source.defaultAutoCommit) &&
CommonUtils.equalObjects(this.defaultTransactionIsolation, source.defaultTransactionIsolation) &&
CommonUtils.equalObjects(this.initQueries, source.initQueries) &&
this.ignoreErrors == source.ignoreErrors;
CommonUtils.equalObjects(this.defaultCatalogName, source.defaultCatalogName) &&
CommonUtils.equalObjects(this.defaultAutoCommit, source.defaultAutoCommit) &&
CommonUtils.equalObjects(this.defaultTransactionIsolation, source.defaultTransactionIsolation) &&
CommonUtils.equalObjects(this.initQueries, source.initQueries) &&
this.ignoreErrors == source.ignoreErrors;
}
}
......@@ -40,6 +40,6 @@ public interface DBCExecutionContextDefaults<CATALOG extends DBSCatalog, SCHEMA
void setDefaultSchema(DBRProgressMonitor monitor, SCHEMA schema) throws DBCException;
boolean refreshDefaults(DBRProgressMonitor monitor) throws DBException;
boolean refreshDefaults(DBRProgressMonitor monitor, boolean useBootstrapSettings) throws DBException;
}
......@@ -78,6 +78,10 @@ public abstract class AbstractExecutionContext<DATASOURCE extends DBPDataSource>
return null;
}
@NotNull
protected DBPConnectionBootstrap getBootstrapSettings() {
return getDataSource().getContainer().getActualConnectionConfiguration().getBootstrap();
}
/**
* Context boot procedure.
......@@ -90,7 +94,7 @@ public abstract class AbstractExecutionContext<DATASOURCE extends DBPDataSource>
QMUtils.getDefaultHandler().handleContextOpen(this, !autoCommit);
// Execute bootstrap queries
DBPConnectionBootstrap bootstrap = dataSource.getContainer().getConnectionConfiguration().getBootstrap();
DBPConnectionBootstrap bootstrap = getBootstrapSettings();
List<String> initQueries = bootstrap.getInitQueries();
if (!CommonUtils.isEmpty(initQueries)) {
monitor.subTask("Run bootstrap queries");
......
......@@ -60,7 +60,7 @@ public class VoidExecutionContextDefaults implements DBCExecutionContextDefaults
}
@Override
public boolean refreshDefaults(DBRProgressMonitor monitor) throws DBException {
public boolean refreshDefaults(DBRProgressMonitor monitor, boolean useBootstrapSettings) throws DBException {
throw new DBCFeatureNotSupportedException();
}
}
......@@ -130,16 +130,14 @@ public class JDBCExecutionContext extends AbstractExecutionContext<JDBCDataSourc
try {
this.initContextBootstrap(monitor, autoCommit);
} catch (DBCException e) {
log.error("Error while running context bootstrap", e);
log.warn("Error while running context bootstrap", e);
}
try {
// Copy context state
// Init (or copy) context state
this.dataSource.initializeContextState(monitor, this, initFrom);
} catch (DBCException e) {
log.error("Error while initializing context state", e);
} catch (DBException e) {
e.printStackTrace();
log.warn("Error while initializing context state", e);
}
try {
......
......@@ -290,8 +290,8 @@ class DataSourceSerializerLegacy implements DataSourceSerializer
if (bootstrap.getDefaultTransactionIsolation() != null) {
xml.addAttribute(RegistryConstants.ATTR_TXN_ISOLATION, bootstrap.getDefaultTransactionIsolation());
}
if (!CommonUtils.isEmpty(bootstrap.getDefaultObjectName())) {
xml.addAttribute(RegistryConstants.ATTR_DEFAULT_OBJECT, bootstrap.getDefaultObjectName());
if (!CommonUtils.isEmpty(bootstrap.getDefaultCatalogName())) {
xml.addAttribute(RegistryConstants.ATTR_DEFAULT_OBJECT, bootstrap.getDefaultCatalogName());
}
if (bootstrap.isIgnoreErrors()) {
xml.addAttribute(RegistryConstants.ATTR_IGNORE_ERRORS, true);
......@@ -575,7 +575,7 @@ class DataSourceSerializerLegacy implements DataSourceSerializer
config.getBootstrap().setDefaultTransactionIsolation(CommonUtils.toInt(atts.getValue(RegistryConstants.ATTR_TXN_ISOLATION)));
}
if (!CommonUtils.isEmpty(atts.getValue(RegistryConstants.ATTR_DEFAULT_OBJECT))) {
config.getBootstrap().setDefaultObjectName(atts.getValue(RegistryConstants.ATTR_DEFAULT_OBJECT));
config.getBootstrap().setDefaultCatalogName(atts.getValue(RegistryConstants.ATTR_DEFAULT_OBJECT));
}
if (atts.getValue(RegistryConstants.ATTR_IGNORE_ERRORS) != null) {
config.getBootstrap().setIgnoreErrors(CommonUtils.toBoolean(atts.getValue(RegistryConstants.ATTR_IGNORE_ERRORS)));
......@@ -642,7 +642,7 @@ class DataSourceSerializerLegacy implements DataSourceSerializer
break;
case DataSourceRegistry.DEFAULT_ACTIVE_OBJECT:
if (!CommonUtils.isEmpty(propValue)) {
curDataSource.getConnectionConfiguration().getBootstrap().setDefaultObjectName(propValue);
curDataSource.getConnectionConfiguration().getBootstrap().setDefaultCatalogName(propValue);
}
break;
default:
......
......@@ -517,17 +517,24 @@ class DataSourceSerializerModern implements DataSourceSerializer
// Bootstrap
Map<String, Object> bootstrapCfg = JSONUtils.getObject(cfgObject, RegistryConstants.TAG_BOOTSTRAP);
DBPConnectionBootstrap bootstrap = config.getBootstrap();
if (bootstrapCfg.containsKey(RegistryConstants.ATTR_AUTOCOMMIT)) {
config.getBootstrap().setDefaultAutoCommit(JSONUtils.getBoolean(bootstrapCfg, RegistryConstants.ATTR_AUTOCOMMIT));
bootstrap.setDefaultAutoCommit(JSONUtils.getBoolean(bootstrapCfg, RegistryConstants.ATTR_AUTOCOMMIT));
}
if (bootstrapCfg.containsKey(RegistryConstants.ATTR_TXN_ISOLATION)) {
config.getBootstrap().setDefaultTransactionIsolation(JSONUtils.getInteger(bootstrapCfg, RegistryConstants.ATTR_TXN_ISOLATION));
bootstrap.setDefaultTransactionIsolation(JSONUtils.getInteger(bootstrapCfg, RegistryConstants.ATTR_TXN_ISOLATION));
}
config.getBootstrap().setDefaultObjectName(JSONUtils.getString(bootstrapCfg, RegistryConstants.ATTR_DEFAULT_OBJECT));
bootstrap.setDefaultCatalogName(JSONUtils.getString(bootstrapCfg, RegistryConstants.ATTR_DEFAULT_CATALOG));
bootstrap.setDefaultSchemaName(JSONUtils.getString(bootstrapCfg, RegistryConstants.ATTR_DEFAULT_SCHEMA));
String defObjectName = JSONUtils.getString(bootstrapCfg, RegistryConstants.ATTR_DEFAULT_OBJECT);
if (!CommonUtils.isEmpty(defObjectName) && CommonUtils.isEmpty(bootstrap.getDefaultSchemaName())) {
bootstrap.setDefaultSchemaName(JSONUtils.getString(bootstrapCfg, defObjectName));
}
if (bootstrapCfg.containsKey(RegistryConstants.ATTR_IGNORE_ERRORS)) {
config.getBootstrap().setIgnoreErrors(JSONUtils.getBoolean(bootstrapCfg, RegistryConstants.ATTR_IGNORE_ERRORS));
bootstrap.setIgnoreErrors(JSONUtils.getBoolean(bootstrapCfg, RegistryConstants.ATTR_IGNORE_ERRORS));
}
config.getBootstrap().setInitQueries(JSONUtils.deserializeStringList(bootstrapCfg, RegistryConstants.TAG_QUERY));
bootstrap.setInitQueries(JSONUtils.deserializeStringList(bootstrapCfg, RegistryConstants.TAG_QUERY));
}
// Permissions
......@@ -775,7 +782,8 @@ class DataSourceSerializerModern implements DataSourceSerializer
if (bootstrap.getDefaultTransactionIsolation() != null) {
JSONUtils.field(json, RegistryConstants.ATTR_TXN_ISOLATION, bootstrap.getDefaultTransactionIsolation());
}
JSONUtils.fieldNE(json, RegistryConstants.ATTR_DEFAULT_OBJECT, bootstrap.getDefaultObjectName());
JSONUtils.fieldNE(json, RegistryConstants.ATTR_DEFAULT_CATALOG, bootstrap.getDefaultCatalogName());
JSONUtils.fieldNE(json, RegistryConstants.ATTR_DEFAULT_SCHEMA, bootstrap.getDefaultSchemaName());
if (bootstrap.isIgnoreErrors()) {
JSONUtils.field(json, RegistryConstants.ATTR_IGNORE_ERRORS, true);
}
......
......@@ -96,6 +96,8 @@ public class RegistryConstants {
public static final String ATTR_AUTOCOMMIT = "autocommit"; //$NON-NLS-1$
public static final String ATTR_TXN_ISOLATION = "txnIsolation"; //$NON-NLS-1$
public static final String ATTR_DEFAULT_OBJECT = "defaultObject"; //$NON-NLS-1$
public static final String ATTR_DEFAULT_CATALOG = "defaultCatalog"; //$NON-NLS-1$
public static final String ATTR_DEFAULT_SCHEMA = "defaultSchema"; //$NON-NLS-1$
public static final String ATTR_CONFIRM_EXECUTE = "confirmExecute"; //$NON-NLS-1$
public static final String ATTR_CONFIRM_DATA_CHANGE = "confirmDataChange"; //$NON-NLS-1$
public static final String ATTR_PARENT = "parent"; //$NON-NLS-1$
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册