/*******************************************************************************
* 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.executer.procedure;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.hangum.tadpole.engine.query.dao.mysql.ProcedureFunctionDAO;
import com.hangum.tadpole.engine.query.dao.rdb.InOutParameterDAO;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.engine.sql.util.resultset.ResultSetUtilDTO;
import com.hangum.tadpole.engine.sql.util.resultset.ResultSetUtils;
import com.hangum.tadpole.engine.sql.util.resultset.TadpoleResultSet;
import com.hangum.tadpole.engine.sql.util.sqlscripts.DDLScriptManager;
/**
* rdb procedure executer.
*
* @author hangum
*
*/
public abstract class ProcedureExecutor {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(ProcedureExecutor.class);
protected UserDBDAO userDB;
protected List<InOutParameterDAO> listInParamValues = new ArrayList<InOutParameterDAO>();
protected List<InOutParameterDAO> listOutParamValues = new ArrayList<InOutParameterDAO>();
protected ProcedureFunctionDAO procedureDAO;
/** result dao */
protected List<ResultSetUtilDTO> resultDAO = new ArrayList<ResultSetUtilDTO>();
/** dbms output - only oracle */
protected String strOutput = "";
/**
* procedure executor
*
* @param procedureDAO
* @param listParamValues
* @param userDB
*/
public ProcedureExecutor(ProcedureFunctionDAO procedureDAO, UserDBDAO userDB) {
this.userDB = userDB;
this.procedureDAO = procedureDAO;
}
/**
* Get in parameter.
*
* @return
*/
public List<InOutParameterDAO> getInParameters() throws Exception {
DDLScriptManager ddlScriptManager = new DDLScriptManager(userDB);
listInParamValues = ddlScriptManager.getProcedureInParamter(procedureDAO);
if(listInParamValues == null) listInParamValues = new ArrayList<InOutParameterDAO>();
return listInParamValues;
}
/**
* Get out parameter.
*
* @return
*/
public List<InOutParameterDAO> getOutParameters() throws Exception {
DDLScriptManager ddlScriptManager = new DDLScriptManager(userDB);
listOutParamValues = ddlScriptManager.getProcedureOutParamter(procedureDAO);
if(listOutParamValues == null) listOutParamValues = new ArrayList<InOutParameterDAO>();
return listOutParamValues;
}
/**
* make execut script
* @return
* @throws Exception
*/
public String getMakeExecuteScript() throws Exception {
StringBuffer sbQuery = new StringBuffer();
if ("FUNCTION".equalsIgnoreCase(procedureDAO.getType())){
sbQuery.append("SELECT " + procedureDAO.getFullName( !StringUtils.isBlank(procedureDAO.getPackagename()) ) + "(");
List<InOutParameterDAO> inList = getInParameters();
for(int i=0; i<inList.size(); i++) {
InOutParameterDAO inOutParameterDAO = inList.get(i);
if(i == (inList.size()-1)) sbQuery.append(String.format(":%s ", inOutParameterDAO.getName()));
else sbQuery.append(String.format(":%s, ", inOutParameterDAO.getName()));
}
sbQuery.append(") from dual");
} else {
sbQuery.append("{call " + procedureDAO.getFullName( !StringUtils.isBlank(procedureDAO.getPackagename()) ) + "(");
// in script
int intParamSize = getParametersCount();
for (int i = 0; i < intParamSize; i++) {
if (i == 0) sbQuery.append("?");
else sbQuery.append(",?");
}
sbQuery.append(")}");
}
if(logger.isDebugEnabled()) logger.debug("Execute Procedure query is\t " + sbQuery.toString());
return sbQuery.toString();
}
/**
* Get parameter Count.
*
* @return
*/
public int getParametersCount(String type) throws Exception {
int cnt = 0;
for(int i=0;i< this.listInParamValues.size();i++){
if (type.equals(listInParamValues.get(i).getType())) cnt++;
}
for(int i=0;i< this.listOutParamValues.size();i++){
if (type.equals(listOutParamValues.get(i).getType()) && "OUT".equalsIgnoreCase(listOutParamValues.get(i).getType())) cnt++;
}
return cnt;
}
public int getParametersCount() throws Exception {
int cnt = this.listInParamValues.size();
for(int i=0;i< this.listOutParamValues.size();i++){
if ("OUT".equalsIgnoreCase(listOutParamValues.get(i).getType())) cnt++;
}
return cnt;
}
/**
* 프로시저 결과가 cursor일때 결과를 담아줍니다.
*
* @param rs
* @throws Exception
*/
protected void setResultCursor(String reqQuery, ResultSet rs) throws Exception {
Map<Integer, String> mapColumns = ResultSetUtils.getColumnName(rs);
Map<Integer, String> mapTableColum = ResultSetUtils.getColumnTableName(userDB, rs);
Map<Integer, Integer> mapColumnType = ResultSetUtils.getColumnType(rs.getMetaData());
TadpoleResultSet sourceDataList = ResultSetUtils.getResultToList(rs, 1000);
ResultSetUtilDTO resultSet = new ResultSetUtilDTO(
// PublicTadpoleDefine.SQL_STATEMENTS_TYPE.PROCEDURE,
userDB, reqQuery, mapColumns, mapTableColum, mapColumnType, sourceDataList);
addResultDAO(resultSet);
}
/**
* 프로시저 결과가 cursor가 아닐 경우 결과를 설정합니다.
*
* 결과 set이 cursor이 아닌 경우에는 테이블에 데이터를 출력하기 위해 다음 3가지가 필요합니다.
column 이름.
column 정렬 순서.
결과 데이터 셋.
* "Seq", "Name", "Type", "ParamType", "Length", "Value"
*
* @param List<Map<Integer, Object>> sourceDataList
*/
protected void setResultNoCursor(String reqQuery, TadpoleResultSet sourceDataList) throws Exception {
Map<Integer, String> mapColumns = new HashMap<Integer, String>();
mapColumns.put(0, "Seq");
mapColumns.put(1, "Name");
mapColumns.put(2, "Type");
mapColumns.put(3, "ParamType");
mapColumns.put(4, "Length");
mapColumns.put(5, "Value");
Map<Integer, Integer> mapColumnType = new HashMap<Integer, Integer>();
mapColumnType.put(0, java.sql.Types.VARCHAR);
mapColumnType.put(1, java.sql.Types.VARCHAR);
mapColumnType.put(2, java.sql.Types.VARCHAR);
mapColumnType.put(3, java.sql.Types.VARCHAR);
mapColumnType.put(4, java.sql.Types.DOUBLE);
mapColumnType.put(5, java.sql.Types.VARCHAR);
Map<Integer, String> mapColumnTable = new HashMap<Integer, String>();
mapColumnTable.put(0, "dumy");
mapColumnTable.put(1, "dumy");
mapColumnTable.put(2, "dumy");
mapColumnTable.put(3, "dumy");
mapColumnTable.put(4, "dumy");
mapColumnTable.put(5, "dumy");
ResultSetUtilDTO resultSet = new ResultSetUtilDTO(userDB, reqQuery, mapColumns, mapColumnTable, mapColumnType, sourceDataList);
addResultDAO(resultSet);
}
protected void initResult() {
this.resultDAO.clear();
}
/**
* @return the resultDAO
*/
public List<ResultSetUtilDTO> getResultDAO() {
return resultDAO;
}
/**
* @param resultDAO the resultDAO to set
*/
public void addResultDAO(ResultSetUtilDTO resultDAO) {
this.resultDAO.add(resultDAO);
}
/**
* executer
*
* @param parameterList
* @return
*/
public abstract boolean exec(List<InOutParameterDAO> parameterList) throws Exception ;
/**
* @return the strOutput
*/
public String getStrOutput() {
return strOutput;
}
/**
* @param strOutput the strOutput to set
*/
public void setStrOutput(String strOutput) {
this.strOutput = strOutput;
}
}