X-Git-Url: http://git.phpeclipse.com diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/actions/ExecuteAgainstAction.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/actions/ExecuteAgainstAction.java new file mode 100644 index 0000000..c1e2486 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/actions/ExecuteAgainstAction.java @@ -0,0 +1,184 @@ +package com.quantum.actions; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.IOException; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import com.quantum.Messages; +import com.quantum.model.Bookmark; +import com.quantum.model.BookmarkCollection; +import com.quantum.model.ConnectionException; +import com.quantum.sql.MultiSQLServer; +import com.quantum.sql.SQLParser; +import com.quantum.sql.SQLResults; +import com.quantum.ui.dialog.BookmarkSelectionDialog; +import com.quantum.ui.dialog.ExceptionDisplayDialog; +import com.quantum.util.io.InputStreamHelper; +import com.quantum.view.tableview.DefaultSizes; +import com.quantum.view.tableview.TableView; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IObjectActionDelegate; +import org.eclipse.ui.IWorkbenchPart; + +/** + * This action can be executed against any .sql file, regardless of + * whether or not the Quantum perspective is open. + * + * @author BC + */ +public class ExecuteAgainstAction extends BaseSQLAction + implements IObjectActionDelegate, PropertyChangeListener { + + private String selectedBookmark = null; + private IFile[] files = null; + + private IWorkbenchPart workbenchPart; + + /** + * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart) + */ + public void setActivePart(IAction action, IWorkbenchPart targetPart) { + this.workbenchPart = targetPart; + } + + protected Shell getShell() { + return this.workbenchPart.getSite().getShell(); + } + + /** + * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) + */ + public void run(IAction action) { + + BookmarkSelectionDialog dialog = new BookmarkSelectionDialog(getShell()); + dialog.addPropertyChangeListener(this); + int result = dialog.open(); + + if (result == Window.OK) { + try { + executeAgainstBookmark(); + } catch (SQLException e) { + ExceptionDisplayDialog.openError(getShell(), + null, + null, e); + } catch (IOException e) { + ExceptionDisplayDialog.openError(getShell(), + Messages.getString("ExecuteAgainstAction.title"), + Messages.getString("ExecuteAgainstAction.IOException"), e); + } catch (ConnectionException e) { + ExceptionDisplayDialog.openError(getShell(), + null, + null, e); + } catch (CoreException e) { + ErrorDialog.openError(getShell(), null, null, e.getStatus()); + } + } + } + + protected Bookmark getBookmark() { + return BookmarkCollection.getInstance().find(this.selectedBookmark); + } + + private void executeAgainstBookmark() + throws SQLException, IOException, CoreException, ConnectionException { + Bookmark bookmark = getBookmark(); + if (bookmark != null) { + boolean alreadyConnected = bookmark.isConnected(); + Connection connection = getConnection(); + try { + for (int i = 0, + length = (this.files == null) ? 0 : this.files.length; + connection != null && i < length; + i++) { + executeAgainstBookmark(bookmark, connection, this.files[i]); + } + } finally { + if (!alreadyConnected && connection != null) { + bookmark.disconnect(); + } + } + } + } + + private void executeAgainstBookmark( + Bookmark bookmark, + Connection connection, + IFile file) + throws SQLException, IOException, CoreException { + executeAgainstBookmark( + bookmark, + connection, + InputStreamHelper.readIntoString(file.getContents())); + } + + private void executeAgainstBookmark( + Bookmark bookmark, + Connection connection, + String queries) + throws SQLException { + List queryList = SQLParser.parse(queries); + MultiSQLServer server = MultiSQLServer.getInstance(); + + for (Iterator i = queryList.iterator(); i.hasNext();) { + String query = (String) i.next(); + SQLResults results = + server.execute( + connection, + query, + 1, + DefaultSizes.PAGE_SIZE, + DefaultSizes.MAX_COLUMN_SIZE); + if (results.isResultSet()) { + TableView view = TableView.getInstance(); + if (view != null) { + view.loadQuery(bookmark, results); + } + } + } + } + + /** + * This method is called with a new selection has been made on one + * of the views. + * + * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection) + */ + public void selectionChanged(IAction action, ISelection selection) { + if (selection instanceof IStructuredSelection) { + IStructuredSelection structuredSelection = + (IStructuredSelection) selection; + List list = new ArrayList(); + + for (Iterator i = structuredSelection.iterator(); i.hasNext();) { + Object temp = i.next(); + if (temp != null && temp instanceof IFile) { + System.out.println(((IFile) temp).getName()); + list.add(temp); + } + } + this.files = (IFile[]) list.toArray(new IFile[list.size()]); + } + } + + /** + * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) + */ + public void propertyChange(PropertyChangeEvent event) { + if ("selection".equals(event.getPropertyName())) { + this.selectedBookmark = (String) event.getNewValue(); + } + } +}