/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
* Copyright (C) 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.dialogs.data;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.DBeaverPreferences;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.model.data.DBDCursor;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
import org.jkiss.dbeaver.model.data.DBDDataReceiver;
import org.jkiss.dbeaver.model.exec.*;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSDataContainer;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetContainer;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetController;
import org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer;
import org.jkiss.dbeaver.ui.data.IValueController;
import org.jkiss.dbeaver.ui.dialogs.ConfirmationDialog;
/**
* CursorViewDialog
*/
public class CursorViewDialog extends ValueViewDialog implements IResultSetContainer {
private static final Log log = Log.getLog(CursorViewDialog.class);
private DBDCursor value;
private ResultSetViewer resultSetViewer;
private CursorDataContainer dataContainer;
private static boolean keepStatementOpenToggleState = false;
public CursorViewDialog(IValueController valueController) {
super(valueController);
dataContainer = new CursorDataContainer();
}
@Override
protected Control createDialogArea(Composite parent)
{
final IValueController valueController = getValueController();
value = (DBDCursor) valueController.getValue();
Composite dialogGroup = (Composite)super.createDialogArea(parent);
if (value != null) {
DBPPreferenceStore globalPreferenceStore = DBeaverCore.getGlobalPreferenceStore();
if (!globalPreferenceStore.getBoolean(DBeaverPreferences.KEEP_STATEMENT_OPEN)) {
if (ConfirmationDialog.showConfirmDialog(
getShell(),
DBeaverPreferences.CONFIRM_KEEP_STATEMENT_OPEN,
ConfirmationDialog.QUESTION) == IDialogConstants.YES_ID) {
globalPreferenceStore.setValue(DBeaverPreferences.KEEP_STATEMENT_OPEN, true);
if (valueController.getValueSite().getPart() instanceof IResultSetContainer) {
IResultSetController rsv = ((IResultSetContainer) valueController.getValueSite().getPart()).getResultSetController();
if (rsv != null) {
rsv.refresh();
}
}
}
DBeaverUI.asyncExec(new Runnable() {
@Override
public void run() {
close();
}
});
}
}
resultSetViewer = new ResultSetViewer(dialogGroup, valueController.getValueSite(), this);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 300;
gd.grabExcessVerticalSpace = true;
resultSetViewer.getControl().setLayoutData(gd);
resultSetViewer.refresh();
return dialogGroup;
}
@Override
public Object extractEditorValue()
{
return null;
}
@Override
public Control getControl()
{
return resultSetViewer.getControl();
}
@Override
public void primeEditorValue(@Nullable Object value) throws DBException
{
resultSetViewer.refresh();
}
@Override
public boolean isDirty() {
return resultSetViewer.isDirty();
}
@Override
public void setDirty(boolean dirty) {
}
@Override
public DBCExecutionContext getExecutionContext() {
return resultSetViewer.getContainer().getExecutionContext();
}
@Nullable
@Override
public ResultSetViewer getResultSetController()
{
return resultSetViewer;
}
@Nullable
@Override
public DBSDataContainer getDataContainer()
{
return dataContainer;
}
@Override
public boolean isReadyToRun()
{
return true;
}
private class CursorDataContainer implements DBSDataContainer {
@Override
public int getSupportedFeatures()
{
// Nothing but plain read
return DATA_SELECT;
}
@NotNull
@Override
public DBCStatistics readData(@NotNull DBCExecutionSource source, @NotNull DBCSession session, @NotNull DBDDataReceiver dataReceiver, DBDDataFilter dataFilter, long firstRow, long maxRows, long flags) throws DBCException
{
DBCStatistics statistics = new DBCStatistics();
DBRProgressMonitor monitor = session.getProgressMonitor();
DBCResultSet dbResult = value;
try {
long startTime = System.currentTimeMillis();
dataReceiver.fetchStart(session, dbResult, firstRow, maxRows);
long rowCount;
try {
rowCount = 0;
while (dbResult.nextRow()) {
if (monitor.isCanceled()) {
// Fetch not more than max rows
break;
}
dataReceiver.fetchRow(session, dbResult);
rowCount++;
if (rowCount >= maxRows) {
break;
}
if (rowCount % 100 == 0) {
monitor.subTask(rowCount + CoreMessages.dialog_cursor_view_monitor_rows_fetched);
monitor.worked(100);
}
}
} finally {
try {
dataReceiver.fetchEnd(session, dbResult);
} catch (DBCException e) {
log.error("Error while finishing result set fetch", e); //$NON-NLS-1$
}
}
statistics.setFetchTime(System.currentTimeMillis() - startTime);
statistics.setRowsFetched(rowCount);
return statistics;
}
finally {
dataReceiver.close();
}
}
@Override
public long countData(@NotNull DBCExecutionSource source, @NotNull DBCSession session, DBDDataFilter dataFilter)
{
return -1;
}
@Nullable
@Override
public String getDescription()
{
return value.toString();
}
@Override
public DBSObject getParentObject()
{
return null;
}
@NotNull
@Override
public DBPDataSource getDataSource()
{
final IValueController valueController = getValueController();
return valueController == null ? null : valueController.getExecutionContext().getDataSource();
}
@NotNull
@Override
public String getName()
{
return value.toString();
}
@Override
public boolean isPersisted()
{
return false;
}
}
}