/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
* Copyright (C) 2011-2012 Eugene Fradkin (eugene.fradkin@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.controls.resultset;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.progress.UIJob;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.exec.DBCStatistics;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.load.ILoadService;
import org.jkiss.dbeaver.model.struct.DBSDataContainer;
import org.jkiss.dbeaver.ui.controls.ProgressLoaderVisualizer;
import java.lang.reflect.InvocationTargetException;
class ResultSetJobDataRead extends ResultSetJobAbstract implements ILoadService<Object> {
private DBDDataFilter dataFilter;
private Composite progressControl;
private int offset;
private int maxRows;
private Throwable error;
private DBCStatistics statistics;
private DBRProgressMonitor progressMonitor;
protected ResultSetJobDataRead(DBSDataContainer dataContainer, DBDDataFilter dataFilter, ResultSetViewer controller, DBCExecutionContext executionContext, Composite progressControl) {
super(CoreMessages.controls_rs_pump_job_name + " [" + dataContainer + "]", dataContainer, controller, executionContext);
this.dataFilter = dataFilter;
this.progressControl = progressControl;
}
public void setOffset(int offset)
{
this.offset = offset;
}
public void setMaxRows(int maxRows)
{
this.maxRows = maxRows;
}
public Throwable getError()
{
return error;
}
DBCStatistics getStatistics()
{
return statistics;
}
@Override
protected IStatus run(DBRProgressMonitor monitor) {
error = null;
final ProgressLoaderVisualizer<Object> visualizer = new ProgressLoaderVisualizer<>(this, progressControl);
progressMonitor = visualizer.overwriteMonitor(monitor);
DBCExecutionPurpose purpose = DBCExecutionPurpose.USER;
if (dataFilter != null && dataFilter.hasFilters()) {
purpose = DBCExecutionPurpose.USER_FILTERED;
}
new PumpVisualizer(visualizer).schedule(PROGRESS_VISUALIZE_PERIOD * 2);
try (DBCSession session = getExecutionContext().openSession(
progressMonitor,
purpose,
NLS.bind(CoreMessages.controls_rs_pump_job_context_name, dataContainer.toString())))
{
statistics = dataContainer.readData(
this,
session,
controller.getDataReceiver(),
dataFilter,
offset,
maxRows,
DBSDataContainer.FLAG_READ_PSEUDO
);
} catch (DBException e) {
error = e;
} finally {
visualizer.completeLoading(null);
}
return Status.OK_STATUS;
}
@Override
public String getServiceName() {
return "ResultSet data pump";
}
@Override
public Object evaluate(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
// It is not a real service so just return nothing
return null;
}
@Override
public Object getFamily() {
return getExecutionController();
}
protected static final int PROGRESS_VISUALIZE_PERIOD = 100;
private class PumpVisualizer extends UIJob {
private ProgressLoaderVisualizer<Object> visualizer;
public PumpVisualizer(ProgressLoaderVisualizer<Object> visualizer) {
super(progressControl.getDisplay(), "RSV Pump Visualizer");
setSystem(true);
this.visualizer = visualizer;
}
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
visualizer.visualizeLoading();
if (!visualizer.isCompleted()) {
schedule(PROGRESS_VISUALIZE_PERIOD);
}
return Status.OK_STATUS;
}
}
}