/*******************************************************************************
* 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.engine.sql.util;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.eclipse.rap.rwt.RWT;
import com.hangum.tadpole.commons.dialogs.message.dao.RequestResultDAO;
import com.hangum.tadpole.commons.exception.TadpoleSQLManagerException;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.QUERY_DDL_STATUS;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.QUERY_DDL_TYPE;
import com.hangum.tadpole.engine.define.DBGroupDefine;
import com.hangum.tadpole.engine.manager.TadpoleSQLManager;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.engine.query.sql.TadpoleSystem_SchemaHistory;
import com.hangum.tadpole.engine.sql.parser.ddl.ParserDDL;
import com.hangum.tadpole.engine.sql.parser.dto.QueryInfoDTO;
import com.hangum.tadpole.session.manager.SessionManager;
/**
* tadpole system에서 공통으로 사용하는 모듈
*
* @author hangum
*
*/
public class ExecuteDDLCommand {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(ExecuteDDLCommand.class);
/**
* 쿼리중에 quote sql을 반영해서 작업합니다.
*
* @param userDB
* @param reqResultDAO
* @param sql
* @throws Exception
*/
public static RequestResultDAO executSQL(UserDBDAO userDB, RequestResultDAO reqResultDAO, String sql) throws Exception {
if(logger.isDebugEnabled()) logger.debug("\t ### "+ sql);
reqResultDAO.setStartDateExecute(new Timestamp(System.currentTimeMillis()));
reqResultDAO.setIpAddress(RWT.getRequest().getRemoteAddr());
reqResultDAO.setStrSQLText(sql);
try {
QueryInfoDTO queryInfoDTO = new QueryInfoDTO();
ParserDDL parser = new ParserDDL();
parser.parseQuery(sql, queryInfoDTO);
Map<String, Object> resultMap = _executSQL(userDB, queryInfoDTO.getQueryStatus(), queryInfoDTO.getQueryDDLType(), queryInfoDTO.getObjectName(), sql);
reqResultDAO.setDataChanged((Boolean)resultMap.get("result"));
reqResultDAO.setMesssage((String)resultMap.get("dbms_output"));
} catch(Exception e) {
logger.error("execute sql", e);
reqResultDAO.setResult(PublicTadpoleDefine.SUCCESS_FAIL.F.name()); //$NON-NLS-1$
reqResultDAO.setMesssage(e.getMessage());
reqResultDAO.setException(e);
throw e;
} finally {
reqResultDAO.setEndDateExecute(new Timestamp(System.currentTimeMillis()));
}
return reqResultDAO;
}
/**
* 쿼리중에 quote sql을 반영해서 작업합니다.
*
* @param userDB
* @param queryDDLStatus
* @param query_DDL_TYPE
* @param strSQL
* @throws TadpoleSQLManagerException, SQLException
*/
private static Map<String, Object> _executSQL(UserDBDAO userDB, QUERY_DDL_STATUS queryDDLStatus, QUERY_DDL_TYPE query_DDL_TYPE, String objName, String strSQL) throws TadpoleSQLManagerException, SQLException {
Map<String, Object> resultMap = new HashMap<String, Object>();
if(queryDDLStatus == PublicTadpoleDefine.QUERY_DDL_STATUS.CREATE ||
queryDDLStatus == PublicTadpoleDefine.QUERY_DDL_STATUS.DROP ||
queryDDLStatus == PublicTadpoleDefine.QUERY_DDL_STATUS.ALTER
) {
java.sql.Connection javaConn = null;
OracleDbmsOutputUtil dbmsOutput = null;
Statement stmt = null;
try {
javaConn = TadpoleSQLManager.getConnection(userDB);
stmt = javaConn.createStatement();
if (DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()){
dbmsOutput = new OracleDbmsOutputUtil( javaConn );
dbmsOutput.enable( 1000000 );
resultMap.put("result", stmt.execute(strSQL));
dbmsOutput.show();
resultMap.put("dbms_output", dbmsOutput.getOutput());
}else{
resultMap.put("result", stmt.execute(strSQL));
resultMap.put("dbms_output", "");
}
} finally {
TadpoleSystem_SchemaHistory.save(SessionManager.getUserSeq(), userDB,
queryDDLStatus.name(), //$NON-NLS-1$
query_DDL_TYPE.name(),
objName,
strSQL);
try { if(stmt != null) stmt.close(); } catch(Exception e) {}
try { if(dbmsOutput != null) dbmsOutput.close(); } catch(Exception e) {}
try { if(javaConn != null) javaConn.close(); } catch(Exception e) {}
}
}
return resultMap;
}
}