--- /dev/null
+package com.quantum.actions;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.List;
+
+import com.quantum.ImageStore;
+import com.quantum.Messages;
+import com.quantum.model.Bookmark;
+import com.quantum.model.BookmarkCollection;
+import com.quantum.sql.MultiSQLServer;
+import com.quantum.sql.SQLResults;
+import com.quantum.ui.dialog.ExceptionDisplayDialog;
+import com.quantum.ui.dialog.SimpleSelectionDialog;
+import com.quantum.util.connection.ConnectionUtil;
+import com.quantum.view.LogProxy;
+import com.quantum.view.tableview.DefaultSizes;
+import com.quantum.view.tableview.TableView;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author BC
+ */
+public abstract class BaseExecuteAction extends Action {
+
+ class Metrics {
+ int resultCount = 0;
+ int resultUpdateCount = 0;
+ int errorCount = 0;
+ int resultsDisplayed = 0;
+ double queryDuration= 0.0;
+
+ public void measure(SQLResults results) {
+ if (results == null) {
+ errorCount++;
+ } else {
+ queryDuration += results.getTime()/1000.0; // calculate the execution time (in seconds)
+ resultCount++;
+ if (results.isResultSet()) {
+ resultsDisplayed++;
+ } else {
+ resultUpdateCount += results.getUpdateCount();
+ }
+ }
+ }
+
+ public boolean hasErrors() {
+ return this.errorCount > 0;
+ }
+
+ Object[] getResults() {
+ return new Object[] {
+ new Integer(this.resultCount),
+ new Integer(this.resultUpdateCount),
+ new Integer(this.resultsDisplayed),
+ new Integer(this.errorCount),
+ new Double(this.queryDuration),
+ };
+ }
+ }
+
+ private ConnectionUtil connectionUtil = new ConnectionUtil();
+
+ protected abstract Shell getShell();
+
+ protected Connection getConnection(Bookmark bookmark) {
+ return this.connectionUtil.getConnection(bookmark, getShell());
+ }
+
+ String execute1 = Messages.getString(BaseExecuteAction.class, "execute1");
+ String execute2 = Messages.getString(BaseExecuteAction.class, "execute2");
+
+ public void run() {
+ Bookmark bookmark = getBookmark();
+ if (bookmark != null) {
+ execute(bookmark);
+ }
+ }
+
+ /**
+ * @param bookmark
+ */
+ protected void execute(Bookmark bookmark) {
+ if (bookmark != null) {
+ try {
+ getStatusLineManager().setErrorMessage(null);
+ Connection connection = getConnection(bookmark);
+ if (connection != null) {
+ execute(bookmark, connection);
+ }
+ } catch (IOException e) {
+ ExceptionDisplayDialog.openError(getShell(), null, null, e);
+ } catch (SQLException e) {
+ ExceptionDisplayDialog.openError(getShell(), null, null, e);
+ } catch (CoreException e) {
+ ErrorDialog.openError(getShell(), null, null, e.getStatus());
+ }
+ }
+ }
+
+ /**
+ * @param bookmark
+ * @param connection
+ * @throws IOException
+ * @throws CoreException
+ */
+ protected void execute(Bookmark bookmark, Connection connection)
+ throws IOException, CoreException, SQLException {
+ getStatusLineManager().setMessage(execute1);
+ MultiSQLServer server = MultiSQLServer.getInstance();
+
+ Metrics metrics = new Metrics();
+
+ List queries = getQueries();
+ IProgressMonitor progressBar = getStatusLineManager().getProgressMonitor();
+ progressBar.beginTask("queries", queries.size());
+ for (int i = 0; i < queries.size(); i++) {
+ getStatusLineManager().setMessage((i % 2 == 0) ? execute1 : execute2);
+
+ String query = (String) queries.get(i);
+ System.out.println(">" + query + "<"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (query != null && query.trim().length() > 0) {
+ SQLResults results = getSQLResults(connection, server, query);
+ metrics.measure(results);
+ if (results != null) {
+ bookmark.addQuery(query);
+ if (results.isResultSet()) {
+ TableView.getInstance().loadQuery(bookmark, results);
+ }
+ }
+ }
+ progressBar.worked(i);
+ }
+ progressBar.done();
+ displayFinalStatusMessage(metrics);
+ }
+
+ /**
+ * @return
+ * @throws CoreException
+ * @throws IOException
+ */
+ protected abstract List getQueries() throws IOException, CoreException;
+
+ /**
+ * @return
+ */
+ protected abstract IStatusLineManager getStatusLineManager();
+
+ /**
+ * @param metrics
+ */
+ private void displayFinalStatusMessage(Metrics metrics) {
+ String message = Messages.getString(
+ BaseExecuteAction.class,
+ "done", //$NON-NLS-1$ //$NON-NLS-2$
+ metrics.getResults());
+ if (metrics.hasErrors()) {
+ getStatusLineManager().setErrorMessage(
+ ImageStore.getImage(ImageStore.STOP), message);
+ } else {
+ getStatusLineManager().setMessage(
+ ImageStore.getImage(ImageStore.SUCCESS), message);
+ }
+ }
+
+ /**
+ * @param connection
+ * @param server
+ * @param query
+ * @return
+ */
+ private SQLResults getSQLResults(Connection connection, MultiSQLServer server, String query) {
+ SQLResults results = null;
+ try {
+ results = server.execute(connection, query, 1,
+ DefaultSizes.PAGE_SIZE, DefaultSizes.MAX_COLUMN_SIZE);
+ } catch (SQLException e) {
+ LogProxy log = LogProxy.getInstance();
+ log.addText(LogProxy.ERROR,
+ "Error Executing: " + query + ":" + e.toString(), e); //$NON-NLS-1$ //$NON-NLS-2$
+ MessageDialog.openConfirm(getShell(),
+ "Database returned error",
+ e.getLocalizedMessage()); //$NON-NLS-1$
+ }
+ return results;
+ }
+
+ protected Bookmark getBookmark() {
+ Bookmark bookmark = null;
+ SimpleSelectionDialog dialog = new SimpleSelectionDialog(
+ getShell(),
+ Messages.getString(BaseExecuteAction.class, "selectBookmark"),
+ BookmarkCollection.getInstance().getBookmarks(),
+ ImageStore.getImage(ImageStore.BOOKMARK));
+ if (SimpleSelectionDialog.OK == dialog.open()) {
+ IStructuredSelection selection = dialog.getSelection();
+
+ bookmark = (Bookmark) selection.getFirstElement();
+ }
+ return bookmark;
+ }
+}