/******************************************************************************* * Copyright (c) 2013 hangum. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * hangum - initial API and implementation ******************************************************************************/ package com.hangum.tadpole.rdb.core.actions.object.rdb.object; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IWorkbenchWindow; import com.hangum.tadpole.commons.dialogs.message.dao.RequestResultDAO; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.OBJECT_TYPE; import com.hangum.tadpole.commons.libs.core.message.CommonMessages; import com.hangum.tadpole.engine.define.DBDefine; import com.hangum.tadpole.engine.define.DBGroupDefine; import com.hangum.tadpole.engine.query.dao.mongodb.MongoDBIndexDAO; import com.hangum.tadpole.engine.query.dao.mongodb.MongoDBServerSideJavaScriptDAO; import com.hangum.tadpole.engine.query.dao.mysql.InformationSchemaDAO; import com.hangum.tadpole.engine.query.dao.mysql.ProcedureFunctionDAO; import com.hangum.tadpole.engine.query.dao.mysql.TableConstraintsDAO; import com.hangum.tadpole.engine.query.dao.mysql.TableDAO; import com.hangum.tadpole.engine.query.dao.mysql.TriggerDAO; import com.hangum.tadpole.engine.query.dao.rdb.InOutParameterDAO; import com.hangum.tadpole.engine.query.dao.rdb.OracleDBLinkDAO; import com.hangum.tadpole.engine.query.dao.rdb.OracleJavaDAO; import com.hangum.tadpole.engine.query.dao.rdb.OracleJobDAO; import com.hangum.tadpole.engine.query.dao.rdb.OracleSequenceDAO; import com.hangum.tadpole.engine.query.dao.rdb.OracleSynonymDAO; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.hangum.tadpole.engine.sql.util.ExecuteDDLCommand; import com.hangum.tadpole.engine.sql.util.SQLUtil; import com.hangum.tadpole.engine.sql.util.executer.ProcedureExecuterManager; import com.hangum.tadpole.mongodb.core.query.MongoDBQuery; import com.hangum.tadpole.rdb.core.Messages; import com.hangum.tadpole.rdb.core.actions.object.AbstractObjectSelectAction; import com.hangum.tadpole.rdb.core.util.GrantCheckerUtils; import com.hangum.tadpole.tajo.core.connections.TajoConnectionManager; /** * Object Explorer에서 사용하는 공통 action * * @author hangum * */ public class ObjectDropAction extends AbstractObjectSelectAction { /** * Logger for this class */ private static final Logger logger = Logger .getLogger(ObjectDropAction.class); public final static String ID = "com.hangum.db.browser.rap.core.actions.object.drop"; //$NON-NLS-1$ public ObjectDropAction(IWorkbenchWindow window, PublicTadpoleDefine.OBJECT_TYPE actionType, String title) { super(window, actionType); setId(ID + actionType); setText(title); } @Override public void run(IStructuredSelection selection, UserDBDAO userDB, OBJECT_TYPE actionType) { try { if(!GrantCheckerUtils.ifExecuteQuery(userDB)) return; } catch (Exception e) { MessageDialog.openError(getWindow().getShell(),CommonMessages.get().Error, e.getMessage()); return; } if(actionType == PublicTadpoleDefine.OBJECT_TYPE.TABLES) { TableDAO dao = (TableDAO)selection.getFirstElement(); if(DBGroupDefine.MONGODB_GROUP != userDB.getDBGroup()) { if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().ObjectDeleteAction_3)) { for(Object selObjec : selection.toList()) { TableDAO selTableDao = (TableDAO)selObjec; //TODO: getFullName(). 메소드에서 getSysName().을 사용하도록 변경하고 getFullName()을 사용해야 한다. // 대.소문자 또는 특수문자를 포함하는 오브젝트 명을 사용하는 경우... String strSQL = "drop table " + SQLUtil.getTableName(userDB, selTableDao);// dao.getSysName(); //$NON-NLS-1$ try { if(DBGroupDefine.TAJO_GROUP == userDB.getDBGroup()) { new TajoConnectionManager().executeUpdate(userDB, strSQL); } else { executeSQL(userDB, strSQL); } } catch(Exception e) { logger.error("drop table", e); exeMessage(Messages.get().ObjectDeleteAction_0, e); } } refreshTable(); } } else if(DBGroupDefine.MONGODB_GROUP == userDB.getDBGroup()) { if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().ObjectDeleteAction_3)) { try { MongoDBQuery.dropCollection(userDB, dao.getName()); refreshTable(); } catch(Exception e) { logger.error("Collection Delete", e); //$NON-NLS-1$ exeMessage("Collection", e); //$NON-NLS-1$ } } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.VIEWS) { TableDAO viewDao = (TableDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().ObjectDeleteAction_9)) { try { executeSQL(userDB, "drop view " + viewDao.getFullName()); //$NON-NLS-1$ refreshView(); } catch(Exception e) { logger.error("drop view", e); exeMessage(Messages.get().ObjectDeleteAction_1, e); } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.SYNONYM) { OracleSynonymDAO dao = (OracleSynonymDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().ObjectDeleteAction_synonym)) { try { executeSQL(userDB, "drop synonym " + dao.getFullName()); //$NON-NLS-1$ //$NON-NLS-2$ refreshSynonym(); } catch(Exception e) { logger.error("drop synoym", e); exeMessage(Messages.get().ObjectDeleteAction_1, e); } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.JOBS) { OracleJobDAO dao = (OracleJobDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, "Remove job?")) { try { executeSQL(userDB, "begin sys.dbms_job.remove('"+dao.getJob()+"'); commit;end;"); //$NON-NLS-1$ //$NON-NLS-2$ refreshJobs(); } catch(Exception e) { logger.error("drop job", e); exeMessage(Messages.get().ObjectDeleteAction_1, e); } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.JAVA) { OracleJavaDAO dao = (OracleJavaDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, "Drop java?")) { try { executeSQL(userDB, "DROP JAVA SOURCE "+dao.getFullName()); //$NON-NLS-1$ //$NON-NLS-2$ refreshJava(); } catch(Exception e) { logger.error("drop job", e); exeMessage(Messages.get().ObjectDeleteAction_1, e); } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.SEQUENCE) { OracleSequenceDAO dao = (OracleSequenceDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().IsDropSequence)) { try { executeSQL(userDB, "drop sequence " + dao.getFullName()); //$NON-NLS-1$ //$NON-NLS-2$ refreshSequence(); } catch(Exception e) { logger.error("drop sequence", e); exeMessage(Messages.get().ObjectDeleteAction_1, e); } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.LINK) { OracleDBLinkDAO dao = (OracleDBLinkDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().IsDropDBLink)) { try { executeSQL(userDB, "drop database link " + dao.getSysName()); //$NON-NLS-1$ //$NON-NLS-2$ refreshDBLink(); } catch(Exception e) { logger.error("drop database link", e); exeMessage(Messages.get().ObjectDeleteAction_1, e); } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.INDEXES) { if(selection.getFirstElement() instanceof InformationSchemaDAO) { InformationSchemaDAO indexDAO = (InformationSchemaDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().ObjectDeleteAction_16)) { try { if(DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()) { executeSQL(userDB, "drop index " + indexDAO.getFullName() ); //$NON-NLS-1$ //$NON-NLS-2$ } else if(DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()) { executeSQL(userDB, "drop index " + indexDAO.getSysName() + " on " + SQLUtil.makeIdentifierName(userDB, indexDAO.getSchema_name()) + "." + SQLUtil.makeIdentifierName(userDB, indexDAO.getTABLE_NAME()) ); //$NON-NLS-1$ //$NON-NLS-2$ } else if(DBGroupDefine.ALTIBASE_GROUP == userDB.getDBGroup()) { executeSQL(userDB, "drop index " + indexDAO.getINDEX_NAME() + " on " + indexDAO.getTABLE_NAME()); //$NON-NLS-1$ //$NON-NLS-2$ } else { executeSQL(userDB, "drop index " + indexDAO.getFullName() + ";"); //$NON-NLS-1$ //$NON-NLS-2$ } refreshIndexes(); } catch(Exception e) { logger.error("Delete index", e); exeMessage(Messages.get().ObjectDeleteAction_4, e); } } } else { MongoDBIndexDAO indexDAO = (MongoDBIndexDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().ObjectDeleteAction_16)) { //$NON-NLS-1$ //$NON-NLS-2$ try { MongoDBQuery.dropIndex(userDB, indexDAO.getNs(), indexDAO.getName()); refreshIndexes(); } catch(Exception e) { logger.error("Collection Delete", e); //$NON-NLS-1$ exeMessage("Collection", e); //$NON-NLS-1$ } } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.CONSTRAINTS) { TableConstraintsDAO constraintDAO = (TableConstraintsDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().DeleteConstraint)) { try { if(DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()) { String constraintPath = ""; if (StringUtils.isBlank(constraintDAO.getSchema_name())){ constraintPath = SQLUtil.makeIdentifierName(userDB, constraintDAO.getTABLE_NAME()); }else{ constraintPath = String.format("%s.%s", SQLUtil.makeIdentifierName(userDB, constraintDAO.getSchema_name()), SQLUtil.makeIdentifierName(userDB, constraintDAO.getTABLE_NAME())); } executeSQL(userDB, "alter table "+ constraintPath +" drop constraint " + constraintDAO.getSysName() ); //$NON-NLS-1$ //$NON-NLS-2$ } else if(DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()) { String constraintPath = ""; if (StringUtils.isBlank(constraintDAO.getSchema_name())){ constraintPath = SQLUtil.makeIdentifierName(userDB, constraintDAO.getTABLE_NAME()); }else{ constraintPath = String.format("%s.%s", SQLUtil.makeIdentifierName(userDB, constraintDAO.getSchema_name()), SQLUtil.makeIdentifierName(userDB, constraintDAO.getTABLE_NAME())); } if(StringUtils.equalsIgnoreCase("PRIMARY KEY", constraintDAO.getConstraint_type())){ executeSQL(userDB, "alter table "+ constraintPath +" drop PRIMARY KEY " ); //$NON-NLS-1$ //$NON-NLS-2$ }else{ executeSQL(userDB, "alter table "+ constraintPath +" drop "+ constraintDAO.getConstraint_type() + " " + constraintDAO.getSysName() ); //$NON-NLS-1$ //$NON-NLS-2$ } } else if(DBGroupDefine.MSSQL_GROUP == userDB.getDBGroup()) { if (StringUtils.isBlank(constraintDAO.getSchema_name())){ executeSQL(userDB, "alter table " + constraintDAO.getTABLE_SCHEMA() + "." + constraintDAO.getTABLE_NAME() + " drop constraint " + constraintDAO.getCONSTRAINT_NAME()); //$NON-NLS-1$ //$NON-NLS-2$ }else{ executeSQL(userDB, "alter table " + constraintDAO.getSchema_name() + "." + constraintDAO.getTABLE_SCHEMA() + "." + constraintDAO.getTABLE_NAME() + " drop constraint " + constraintDAO.getCONSTRAINT_NAME()); //$NON-NLS-1$ //$NON-NLS-2$ } } else if(DBGroupDefine.ALTIBASE_GROUP == userDB.getDBGroup()) { executeSQL(userDB, "drop constraints " + constraintDAO.getCONSTRAINT_NAME() + " on " + constraintDAO.getTABLE_NAME()); //$NON-NLS-1$ //$NON-NLS-2$ } else { executeSQL(userDB, "drop constraints " + constraintDAO.getFullName()+ ";"); //$NON-NLS-1$ //$NON-NLS-2$ } this.refreshConstraints(); } catch(Exception e) { logger.error("Delete constraints", e); exeMessage("CONSTRAINTS", e); } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.PROCEDURES) { ProcedureFunctionDAO procedureDAO = (ProcedureFunctionDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().ObjectDeleteAction_24)) { try { if(DBGroupDefine.POSTGRE_GROUP == userDB.getDBGroup()) { StringBuffer sbQuery = new StringBuffer("drop function " + procedureDAO.getName() + "("); ProcedureExecuterManager pm = new ProcedureExecuterManager(userDB, procedureDAO); pm.isExecuted(procedureDAO, userDB); List<InOutParameterDAO> inList = pm.getExecuter().getInParameters(); InOutParameterDAO inOutParameterDAO = inList.get(0); String[] inParams = StringUtils.split(inOutParameterDAO.getRdbType(), ","); for(int i=0; i<inParams.length; i++) { String name = StringUtils.trimToEmpty(inParams[i]); if(i == (inParams.length-1)) sbQuery.append(String.format("%s", name)); else sbQuery.append(String.format("%s, ", name)); } sbQuery.append(")"); if(logger.isDebugEnabled()) logger.debug("=[PROCEDURES]===> " + sbQuery); executeSQL(userDB, sbQuery.toString()); //$NON-NLS-1$ } else { executeSQL(userDB, "drop procedure " + procedureDAO.getFullName()); //$NON-NLS-1$ } refreshProcedure(); } catch(Exception e) { logger.error("drop procedure", e); exeMessage(Messages.get().ObjectDeleteAction_10, e); } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.PACKAGES) { ProcedureFunctionDAO procedureDAO = (ProcedureFunctionDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().ObjectDropAction_1)) { try { try{ executeSQL(userDB, "drop package body " + procedureDAO.getFullName() ); //$NON-NLS-1$ }catch(Exception e){ // package body는 없을 수도 있음. } executeSQL(userDB, "drop package " + procedureDAO.getFullName() ); //$NON-NLS-1$ refreshPackage(); } catch(Exception e) { logger.error("drop package", e); exeMessage(Messages.get().ObjectDeleteAction_10, e); } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.FUNCTIONS) { ProcedureFunctionDAO functionDAO = (ProcedureFunctionDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().ObjectDeleteAction_30)) { try { if(DBGroupDefine.ALTIBASE_GROUP == userDB.getDBGroup()) { executeSQL(userDB, "drop function " + functionDAO.getDefiner() + "." + functionDAO.getName()); } else if(userDB.getDBDefine() == DBDefine.POSTGRE_DEFAULT) { StringBuffer sbQuery = new StringBuffer("drop function " + functionDAO.getName() + "("); ProcedureExecuterManager pm = new ProcedureExecuterManager(userDB, functionDAO); pm.isExecuted(functionDAO, userDB); List<InOutParameterDAO> inList = pm.getExecuter().getInParameters(); InOutParameterDAO inOutParameterDAO = inList.get(0); String[] inParams = StringUtils.split(inOutParameterDAO.getRdbType(), ","); for(int i=0; i<inParams.length; i++) { String name = StringUtils.trimToEmpty(inParams[i]); if(i == (inParams.length-1)) sbQuery.append(String.format("%s", name)); else sbQuery.append(String.format("%s, ", name)); } sbQuery.append(")"); if(logger.isDebugEnabled()) logger.debug("=[FUNCTIONS]===> " + sbQuery); executeSQL(userDB, sbQuery.toString()); //$NON-NLS-1$ } else { executeSQL(userDB, "drop function " + functionDAO.getFullName()); //$NON-NLS-1$ } refreshFunction(); } catch(Exception e) { logger.error("drop function", e); exeMessage(Messages.get().ObjectDeleteAction_17, e); } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.TRIGGERS) { TriggerDAO triggerDAO = (TriggerDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().ObjectDeleteAction_36)) { try { if(DBGroupDefine.ALTIBASE_GROUP == userDB.getDBGroup()) { executeSQL(userDB, "drop trigger " + triggerDAO.getTrigger() + " on " + triggerDAO.getTable_name()); //$NON-NLS-1$ } else { executeSQL(userDB, "drop trigger " + triggerDAO.getFullName()); //$NON-NLS-1$ } refreshTrigger(); } catch(Exception e) { logger.error("drop trigger", e); exeMessage(Messages.get().ObjectDeleteAction_18, e); } } } else if(actionType == PublicTadpoleDefine.OBJECT_TYPE.JAVASCRIPT) { MongoDBServerSideJavaScriptDAO jsDAO = (MongoDBServerSideJavaScriptDAO)selection.getFirstElement(); if(MessageDialog.openConfirm(getWindow().getShell(), CommonMessages.get().Confirm, Messages.get().ObjectDeleteAction_42)) { try { MongoDBQuery.deleteJavaScirpt(userDB, jsDAO.getName()); refreshJS(); } catch(Exception e) { logger.error("MongoDB ServerSide JavaScript delelte", e); //$NON-NLS-1$ exeMessage("JavaScript", e); //$NON-NLS-1$ } } } } // end method /** * executeSQL * * @param userDB * @param cmd * @throws Exception */ private void executeSQL(UserDBDAO userDB, String cmd) throws Exception { RequestResultDAO reqReResultDAO = new RequestResultDAO(); ExecuteDDLCommand.executSQL(userDB, reqReResultDAO, cmd); //$NON-NLS-1$ if(PublicTadpoleDefine.SUCCESS_FAIL.F.name().equals(reqReResultDAO.getResult())) { exeMessage(Messages.get().ObjectDeleteAction_0, reqReResultDAO.getException()); } } }