/* * Copyright (C) 2006 Davy Vanherbergen dvanherbergen@users.sourceforge.net * * This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.sqlexplorer.dbstructure.actions; import java.sql.SQLException; import java.util.Iterator; import java.util.List; import net.sourceforge.sqlexplorer.Messages; import net.sourceforge.sqlexplorer.dbstructure.nodes.ColumnNode; import net.sourceforge.sqlexplorer.dbstructure.nodes.INode; import net.sourceforge.sqlexplorer.dbstructure.nodes.TableNode; import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin; import net.sourceforge.sqlexplorer.plugin.editors.SQLEditor; import net.sourceforge.sqlexplorer.plugin.editors.SQLEditorInput; import net.sourceforge.sqlexplorer.util.ImageUtil; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IWorkbenchPage; /** * Generate a new SQL statement for the selected table / columns. * * @author Davy Vanherbergen * */ public class GenerateSelectSQLAction extends AbstractDBTreeContextAction { private static final ImageDescriptor _image = ImageUtil.getDescriptor("Images.SqlEditorIcon");//$NON-NLS-1$ /** * @return query string for full table select */ private String createColumnSelect() { StringBuffer query = new StringBuffer("select ");//$NON-NLS-1$ String sep = "";//$NON-NLS-1$ String table = "";//$NON-NLS-1$ for (INode node : _selectedNodes) { if (node instanceof ColumnNode) { ColumnNode column = (ColumnNode) node; if (table.length() == 0) { table = column.getQualifiedParentTableName(); } if (column.getQualifiedParentTableName().equals(table)) { query.append(sep); query.append(quote(column.getName(), getQuoteString(column))); sep = ", ";//$NON-NLS-1$ } } } query.append(" from ");//$NON-NLS-1$ query.append(fixTableName(table)); return query.toString(); } /** * @return query string for full table select */ private String createTableSelect() { TableNode node = (TableNode) _selectedNodes[0]; StringBuffer query = new StringBuffer("select ");//$NON-NLS-1$ String sep = "";//$NON-NLS-1$ List columnNames = node.getColumnNames(); Iterator it = columnNames.iterator(); while (it.hasNext()) { query.append(sep); String column = (String) it.next(); query.append(quote(column, getQuoteString(node))); sep = ", ";//$NON-NLS-1$ } query.append(" from ");//$NON-NLS-1$ query.append(fixTableName(node.getQualifiedName())); return query.toString(); } /** * Custom image for generate SQL action * * @see org.eclipse.jface.action.IAction#getImageDescriptor() */ @Override public ImageDescriptor getImageDescriptor() { return _image; } /** * Set the text for the menu entry. * * @see org.eclipse.jface.action.IAction#getText() */ @Override public String getText() { return Messages.getString("DatabaseStructureView.Actions.GenerateSelectSQL"); } /** * Action is always available. * * @see net.sourceforge.sqlexplorer.dbstructure.actions.AbstractDBTreeContextAction#isAvailable() */ @Override public boolean isAvailable() { if (_selectedNodes.length == 0) { return false; } if (_selectedNodes[0] instanceof ColumnNode) { return true; } if (_selectedNodes[0] instanceof TableNode) { return true; } return false; } /** * Generate select statement * * @see org.eclipse.jface.action.IAction#run() */ @Override public void run() { try { String query = null; if (_selectedNodes[0] instanceof ColumnNode) { query = createColumnSelect(); } if (_selectedNodes[0] instanceof TableNode) { query = createTableSelect(); } if (query == null) { return; } SQLEditorInput input = new SQLEditorInput("SQL Editor (" + SQLExplorerPlugin.getDefault().getEditorSerialNo()//$NON-NLS-1$ + ").sql");//$NON-NLS-1$ input.setUser(_selectedNodes[0].getSession().getUser()); IWorkbenchPage page = SQLExplorerPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage(); SQLEditor editorPart = (SQLEditor) page.openEditor(input, SQLEditor.class.getName()); editorPart.setText(query); } catch (Throwable e) { SQLExplorerPlugin.error("Could generate sql.", e); } } /** * Put name in quotation marks * * @param name * @param quote * @return quote + name + quote */ private String quote(String name, String quote) { StringBuffer buf = new StringBuffer(); buf.append(quote); buf.append(name); buf.append(quote); return buf.toString(); } /** * Get specific quotation marks * * @param node * @return qutoe string */ private String getQuoteString(INode node) { try { return node.getSession().getMetaData().getIdentifierQuoteString(); } catch (SQLException e) { e.printStackTrace(); } return "";//$NON-NLS-1$ } /** * ADD yyi 2011-04-22 20716:remove quotes for Sybase ASE query * * @param qualifiedName * @return */ protected String fixTableName(String qualifiedName) { INode node = _selectedNodes[0]; try { String sybase1 = "Adaptive Server Enterprise"; //$NON-NLS-1$ String sybase2 = "Adaptive Server Enterprise | Sybase Adaptive Server IQ"; //$NON-NLS-1$ String databaseProductName = node.getSession().getDatabaseProductName(); if (sybase1.equals(databaseProductName) || sybase2.equals(databaseProductName)) { return qualifiedName.replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$ } } catch (SQLException e) { e.printStackTrace(); } return qualifiedName; } }