/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * 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.txn; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchPart; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; import org.jkiss.dbeaver.model.qm.QMEventFilter; import org.jkiss.dbeaver.model.qm.QMMetaEvent; import org.jkiss.dbeaver.model.qm.QMUtils; import org.jkiss.dbeaver.model.qm.meta.QMMObject; import org.jkiss.dbeaver.model.qm.meta.QMMSessionInfo; import org.jkiss.dbeaver.model.qm.meta.QMMStatementExecuteInfo; import org.jkiss.dbeaver.model.qm.meta.QMMTransactionSavepointInfo; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.querylog.QueryLogViewer; public abstract class TransactionInfoDialog extends Dialog { private static final QMEventFilter VOID_FILTER = new QMEventFilter() { @Override public boolean accept(QMMetaEvent event) { return false; } }; private final IWorkbenchPart activeEditor; protected QueryLogViewer logViewer; private Button showAllCheck; private Button showPreviousCheck; public TransactionInfoDialog(Shell parentShell, IWorkbenchPart activeEditor) { super(parentShell); this.activeEditor = activeEditor; } @Override protected boolean isResizable() { return true; } protected abstract DBCExecutionContext getCurrentContext(); protected void createTransactionLogPanel(Composite composite) { DBCExecutionContext context = getCurrentContext(); QMEventFilter filter = context == null ? VOID_FILTER : createContextFilter(context); logViewer = new QueryLogViewer(composite, activeEditor.getSite(), filter, false); logViewer.setUseDefaultFilter(false); final Object gd = logViewer.getControl().getLayoutData(); if (gd instanceof GridData) { ((GridData) gd).heightHint = logViewer.getControl().getHeaderHeight() + logViewer.getControl().getItemHeight() * 5; } showAllCheck = UIUtils.createCheckbox(composite, "Show all queries", "Show all transaction queries. Otherwise shows only modifying queries.", false, 1); showAllCheck.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateTransactionFilter(); } }); showPreviousCheck = UIUtils.createCheckbox(composite, "Show previous transactions", "Show previous transactions. Otherwise shows only active one.", false, 1); showPreviousCheck.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateTransactionFilter(); } }); } private void updateTransactionFilter() { DBCExecutionContext context = getCurrentContext(); QMEventFilter filter = context == null ? VOID_FILTER : createContextFilter(context); logViewer.setFilter(filter); logViewer.refresh(); } protected QMEventFilter createContextFilter(DBCExecutionContext executionContext) { if (executionContext == null) { return VOID_FILTER; } final boolean showAll = showAllCheck != null && showAllCheck.getSelection(); final boolean showPrevious = showPreviousCheck != null && showPreviousCheck.getSelection(); final QMMSessionInfo currentSession = QMUtils.getCurrentSession(executionContext); final QMMTransactionSavepointInfo currentSP = QMUtils.getCurrentTransaction(executionContext); QMEventFilter filter = new QMEventFilter() { @Override public boolean accept(QMMetaEvent event) { QMMObject object = event.getObject(); if (object instanceof QMMStatementExecuteInfo) { QMMStatementExecuteInfo exec = (QMMStatementExecuteInfo) object; if (!showPrevious && exec.getSavepoint() != currentSP) { return false; } if (exec.getStatement().getSession() != currentSession) { return false; } DBCExecutionPurpose purpose = exec.getStatement().getPurpose(); if (purpose == DBCExecutionPurpose.META || purpose == DBCExecutionPurpose.UTIL) { return false; } return (showAll || exec.isTransactional()); } return false; } }; return filter; } @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, true); } }