diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditor.java index 03f1b9a246709daa3a3e098631ac72511fab792d..f898a7ddbfbbefb4ea758545fd589b8cdde9e33e 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditor.java @@ -22,7 +22,10 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; @@ -64,6 +67,7 @@ import org.jkiss.dbeaver.model.struct.DBSDataContainer; import org.jkiss.dbeaver.model.struct.DBSDataSourceContainer; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.registry.DataSourceRegistry; +import org.jkiss.dbeaver.runtime.AbstractJob; import org.jkiss.dbeaver.runtime.DefaultProgressMonitor; import org.jkiss.dbeaver.runtime.sql.SQLQueryJob; import org.jkiss.dbeaver.runtime.sql.SQLQueryListener; @@ -234,6 +238,25 @@ public class SQLEditor extends SQLEditorBase implements releaseExecutionContext(); curDataSource = dataSource; if (getActivePreferenceStore().getBoolean(DBeaverPreferences.EDITOR_SEPARATE_CONNECTION)) { + final OpenContextJob job = new OpenContextJob(dataSource); + job.addJobChangeListener(new JobChangeAdapter() { + @Override + public void done(IJobChangeEvent event) { + if (job.error != null) { + releaseExecutionContext(); + UIUtils.showErrorDialog(getSite().getShell(), "Open context", "Can't open editor connection", job.error); + } else { + UIUtils.runInUI(null, new Runnable() { + @Override + public void run() { + onDataSourceChange(); + } + }); + } + } + }); + job.schedule(); +/* try { DBeaverUI.runInProgressDialog(new DBRRunnableWithProgress() { @Override @@ -255,6 +278,7 @@ public class SQLEditor extends SQLEditorBase implements releaseExecutionContext(); UIUtils.showErrorDialog(getSite().getShell(), "Open context", "Can't open editor connection", e); } +*/ } else { executionContext = dataSource.getDefaultContext(false); } @@ -262,6 +286,32 @@ public class SQLEditor extends SQLEditorBase implements } } + private class OpenContextJob extends AbstractJob { + private final DBPDataSource dataSource; + private Throwable error; + protected OpenContextJob(DBPDataSource dataSource) { + super("Open connection to " + dataSource.getContainer().getName()); + this.dataSource = dataSource; + } + + @Override + protected IStatus run(DBRProgressMonitor monitor) { + monitor.beginTask("Open SQLEditor isolated connection", 1); + try { + String title = "SQLEditor <" + getEditorInput().getPath().removeFileExtension().lastSegment() + ">"; + monitor.subTask("Open context " + title); + executionContext = dataSource.openIsolatedContext(monitor, title); + } catch (DBException e) { + error = e; + return Status.OK_STATUS; + } finally { + monitor.done(); + } + ownContext = true; + return Status.OK_STATUS; + } + } + private void releaseExecutionContext() { if (ownContext && executionContext != null) { executionContext.close(); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java index 2ad9400d641a96dcee274330f113b35bb793a3d5..e59756d1e4d7d1ba3972a3bc6ea80cb84ee31197 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java @@ -698,6 +698,9 @@ public abstract class SQLEditorBase extends BaseTextEditor { DBPDataSource dataSource = context == null ? null : context.getDataSource(); if (dataSource instanceof SQLDataSource) { final SQLDialect dialect = ((SQLDataSource) dataSource).getSQLDialect(); + if (dialect == null) { + return null; + } return new ICommentsSupport() { @Nullable @Override diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java index 275ae03a347b66ec7eb8c05a16c0e41ed61ea9cc..6174d3ac7f7a6d793357d299c5d010586f12910a 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java @@ -427,7 +427,7 @@ public class NavigatorUtils { } public static void setNavigatorContext(IWorkbenchPartSite site) { - IContextService contextService = site.getService(IContextService.class); + IContextService contextService = (IContextService) site.getService(IContextService.class); if (contextService != null) { contextService.activateContext(NAVIGATOR_CONTEXT_ID); } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/JDBCDataSource.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/JDBCDataSource.java index 2033acafd6a7eb9df7f50cde8c482b5a2a4eb5da..400ee078f63a17141a5de6353e68212b248059fc 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/JDBCDataSource.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/JDBCDataSource.java @@ -26,6 +26,7 @@ import org.jkiss.dbeaver.model.data.DBDDataFormatterProfile; import org.jkiss.dbeaver.model.data.DBDPreferences; import org.jkiss.dbeaver.model.data.DBDValueHandler; import org.jkiss.dbeaver.model.impl.jdbc.data.handlers.JDBCObjectValueHandler; +import org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect; import org.jkiss.dbeaver.model.messages.ModelMessages; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.*; @@ -279,13 +280,28 @@ public abstract class JDBCDataSource JDBCSession session = getDefaultContext(true).openSession(monitor, DBCExecutionPurpose.META, ModelMessages.model_jdbc_read_database_meta_data); try { JDBCDatabaseMetaData metaData = session.getMetaData(); - sqlDialect = createSQLDialect(metaData); - dataSourceInfo = createDataSourceInfo(metaData); + try { + sqlDialect = createSQLDialect(metaData); + } catch (Exception e) { + log.error("Error creating SQL dialect", e); + } + try { + dataSourceInfo = createDataSourceInfo(metaData); + } catch (Exception e) { + log.error("Error obtaining database info"); + } } catch (SQLException ex) { throw new DBException("Error getting JDBC meta data", ex, this); } finally { session.close(); + + if (sqlDialect == null) { + sqlDialect = new BasicSQLDialect(); + } + if (dataSourceInfo == null) { + dataSourceInfo = new JDBCDataSourceInfo(null); + } } } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/JDBCDataSourceInfo.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/JDBCDataSourceInfo.java index f196ef8c93755e07febc9a8e0f8a9ee5f874d8bc..11c3577c4efcf0c77e9835214a7b04bfba0d9cde 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/JDBCDataSourceInfo.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/JDBCDataSourceInfo.java @@ -18,10 +18,10 @@ package org.jkiss.dbeaver.model.impl.jdbc; import org.jkiss.dbeaver.Log; -import org.jkiss.dbeaver.model.messages.ModelMessages; import org.jkiss.dbeaver.model.DBPDataSourceInfo; import org.jkiss.dbeaver.model.DBPTransactionIsolation; import org.jkiss.dbeaver.model.exec.jdbc.JDBCDatabaseMetaData; +import org.jkiss.dbeaver.model.messages.ModelMessages; import org.jkiss.utils.CommonUtils; import org.osgi.framework.Version; @@ -59,6 +59,25 @@ public class JDBCDataSourceInfo implements DBPDataSourceInfo private boolean supportsBatchUpdates = false; private boolean supportsScroll; + public JDBCDataSourceInfo() + { + this.readOnly = false; + this.databaseProductName = "?"; //$NON-NLS-1$ + this.databaseProductVersion = "?"; //$NON-NLS-1$ + this.driverName = "?"; //$NON-NLS-1$ + this.driverVersion = "?"; //$NON-NLS-1$ + databaseVersion = new Version(0, 0, 0); + this.schemaTerm = TERM_SCHEMA; + this.procedureTerm = TERM_PROCEDURE; + this.catalogTerm = TERM_CATALOG; + supportsBatchUpdates = false; + + supportsTransactions = false; + supportedIsolations = new ArrayList(); + supportedIsolations.add(0, JDBCTransactionIsolation.NONE); + supportsScroll = true; + } + public JDBCDataSourceInfo(JDBCDatabaseMetaData metaData) { try {