提交 c2f3283a 编写于 作者: J jurgen

SQLEditor connection open in detached job

上级 4949027d
......@@ -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();
......
......@@ -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
......
......@@ -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);
}
......
......@@ -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);
}
}
}
......
......@@ -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<DBPTransactionIsolation>();
supportedIsolations.add(0, JDBCTransactionIsolation.NONE);
supportsScroll = true;
}
public JDBCDataSourceInfo(JDBCDatabaseMetaData metaData)
{
try {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册