提交 698caa2c 编写于 作者: S Serge Rider

#6637 Data transfer from custom query results: reuse data container's execution context


Former-commit-id: 6803f7ca
上级 729f1232
......@@ -77,7 +77,7 @@ public class OpenSpreadsheetHandler extends AbstractHandler
options.setSelectedRows(selectedRows);
options.setSelectedColumns(selectedAttributes);
}
ResultSetDataContainer dataContainer = new ResultSetDataContainer(resultSet.getDataContainer(), resultSet.getModel(), options);
ResultSetDataContainer dataContainer = new ResultSetDataContainer(resultSet, options);
if (dataContainer.getDataSource() == null) {
DBeaverUI.getInstance().showError("Open Excel", ModelMessages.error_not_connected_to_database);
return null;
......
......@@ -128,9 +128,12 @@ public class DatabaseTransferProducer implements IDataTransferProducer<DatabaseP
boolean newConnection = settings.isOpenNewConnections() && !getDatabaseObject().getDataSource().getContainer().getDriver().isEmbedded();
boolean forceDataReadTransactions = Boolean.TRUE.equals(dataSource.getDataSourceFeature(DBConstants.FEATURE_LOB_REQUIRE_TRANSACTIONS));
DBCExecutionContext context = !selectiveExportFromUI && newConnection ?
DBUtils.getObjectOwnerInstance(getDatabaseObject()).openIsolatedContext(monitor, "Data transfer producer") :
DBUtils.getDefaultContext(getDatabaseObject(), false);
DBCExecutionContext context;
if (!selectiveExportFromUI && newConnection) {
context = DBUtils.getObjectOwnerInstance(getDatabaseObject()).openIsolatedContext(monitor, "Data transfer producer");
} else {
context = DBUtils.getDefaultContext(dataContainer, false);
}
try (DBCSession session = context.openSession(monitor, DBCExecutionPurpose.UTIL, contextTask)) {
try {
AbstractExecutionSource transferSource = new AbstractExecutionSource(dataContainer, context, consumer);
......
......@@ -1811,6 +1811,9 @@ public final class DBUtils {
if (object == null) {
return null;
}
if (object instanceof DBPContextProvider) {
return ((DBPContextProvider) object).getExecutionContext();
}
DBSInstance instance = getObjectOwnerInstance(object);
return instance == null ? null : instance.getDefaultContext(meta);
}
......
......@@ -18,7 +18,9 @@ package org.jkiss.dbeaver.ui.controls.resultset;
import org.eclipse.core.runtime.IAdaptable;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPContextProvider;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
......@@ -38,17 +40,19 @@ import java.util.List;
* Client-side data container.
* Wraps RSV model and original data container.
*/
public class ResultSetDataContainer implements DBSDataContainer, IAdaptable {
public class ResultSetDataContainer implements DBSDataContainer, DBPContextProvider, IAdaptable {
private static final Log log = Log.getLog(ResultSetDataContainer.class);
private final IResultSetController controller;
private final DBSDataContainer dataContainer;
private final ResultSetModel model;
private ResultSetDataContainerOptions options;
public ResultSetDataContainer(DBSDataContainer dataContainer, ResultSetModel model, ResultSetDataContainerOptions options) {
this.dataContainer = dataContainer;
this.model = model;
public ResultSetDataContainer(IResultSetController controller, ResultSetDataContainerOptions options) {
this.controller = controller;
this.dataContainer = controller.getDataContainer();
this.model = controller.getModel();
this.options = options;
}
......@@ -149,6 +153,12 @@ public class ResultSetDataContainer implements DBSDataContainer, IAdaptable {
return null;
}
@Nullable
@Override
public DBCExecutionContext getExecutionContext() {
return controller.getExecutionContext();
}
private class ModelResultSet implements DBCResultSet {
private final DBCSession session;
......
......@@ -112,7 +112,7 @@ public class ResultSetHandlerCopyAs extends AbstractHandler implements IElementU
options.setSelectedRows(selectedRows);
options.setSelectedColumns(selectedAttributes);
}
ResultSetDataContainer dataContainer = new ResultSetDataContainer(resultSet.getDataContainer(), resultSet.getModel(), options);
ResultSetDataContainer dataContainer = new ResultSetDataContainer(resultSet, options);
if (dataContainer.getDataSource() == null) {
DBWorkbench.getPlatformUI().showError("Copy As " + processor.getName(), ModelMessages.error_not_connected_to_database);
return;
......
......@@ -509,7 +509,7 @@ public class ResultSetHandlerMain extends AbstractHandler {
options.setSelectedRows(selectedRows);
options.setSelectedColumns(selectedAttributes);
ResultSetDataContainer dataContainer = new ResultSetDataContainer(rsv.getDataContainer(), rsv.getModel(), options);
ResultSetDataContainer dataContainer = new ResultSetDataContainer(rsv, options);
ActiveWizardDialog dialog = new ActiveWizardDialog(
HandlerUtil.getActiveWorkbenchWindow(event),
new DataTransferWizard(
......
......@@ -131,7 +131,7 @@ public class ResultSetHandlerOpenWith extends AbstractHandler implements IElemen
options.setSelectedRows(selectedRows);
options.setSelectedColumns(selectedAttributes);
}
ResultSetDataContainer dataContainer = new ResultSetDataContainer(resultSet.getDataContainer(), resultSet.getModel(), options);
ResultSetDataContainer dataContainer = new ResultSetDataContainer(resultSet, options);
if (dataContainer.getDataSource() == null) {
DBWorkbench.getPlatformUI().showError("Open " + processor.getAppName(), ModelMessages.error_not_connected_to_database);
return;
......
......@@ -1221,7 +1221,7 @@ public class ResultSetViewer extends Viewer
void fillOpenWithMenu(IContributionManager openWithMenu) {
ResultSetDataContainerOptions options = new ResultSetDataContainerOptions();
ResultSetDataContainer dataContainer = new ResultSetDataContainer(getDataContainer(), getModel(), options);
ResultSetDataContainer dataContainer = new ResultSetDataContainer(this, options);
List<DataTransferProcessorDescriptor> appProcessors = new ArrayList<>();
......@@ -1262,7 +1262,7 @@ public class ResultSetViewer extends Viewer
copyAsMenu.add(new Separator());
ResultSetDataContainerOptions options = new ResultSetDataContainerOptions();
ResultSetDataContainer dataContainer = new ResultSetDataContainer(getDataContainer(), getModel(), options);
ResultSetDataContainer dataContainer = new ResultSetDataContainer(this, options);
List<DataTransferProcessorDescriptor> appProcessors = new ArrayList<>();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册