/*******************************************************************************
* Copyright (c) 2014 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.utils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
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.define.PublicTadpoleDefine.QUERY_DDL_STATUS;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.QUERY_DDL_TYPE;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.QUERY_DML_TYPE;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.SQL_TYPE;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.engine.sql.parser.BasicTDBSQLParser;
import com.hangum.tadpole.engine.sql.parser.dto.QueryInfoDTO;
import com.hangum.tadpole.engine.sql.util.SQLUtil;
import com.hangum.tadpole.session.manager.SessionManager;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.delete.Delete;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.update.Update;
/**
* 에디터에서 사용자가 실행하려는 쿼리 정보를 정의합니다.
*
* @author hangum
*
*/
public class RequestQuery implements Cloneable {
/** Logger for this class. */
private static final Logger logger = Logger.getLogger(RequestQuery.class);
/** 쿼리 실행자 ip */
private String userIp = "";
/** 요청 쿼리가 오토 커밋이었는지 */
private boolean isAutoCommit = false;
/** 초기 입력 받은 sql */
private String originalSql = "";
/** 에디터가 실행 가능한 쿼리로 수정한 */
private String sql = "";
/** {@link PublicTadpoleDefine.SQL_STATEMENT_TYPE#PREPARED_STATEMENT} 일경우에 변수에 값이 들어간 전체 퀄기ㅏ 들어가 있다 */
private String sqlAddParameter = "";
/** 현재 실행 중인 sql statement type */
private PublicTadpoleDefine.SQL_STATEMENT_TYPE sqlStatementType = PublicTadpoleDefine.SQL_STATEMENT_TYPE.NONE;
/** SQL이 preparedStatement일 경우 SQL_STATEMENT_TYPE.PREPARED_STATEMENT 상태일때의 파라미터 종류 */
private Object[] statementParameter = null;
private OBJECT_TYPE dbAction = OBJECT_TYPE.TABLES;
/** 사용자 쿼리를 지정한다 */
private EditorDefine.QUERY_MODE mode = EditorDefine.QUERY_MODE.QUERY;
/** 사용자가 쿼리를 실행 하는 타입 */
private EditorDefine.EXECUTE_TYPE executeType = EditorDefine.EXECUTE_TYPE.NONE;
/** sql is statement */
private boolean isStatement = false;
/** sql type */
private SQL_TYPE sqlType = SQL_TYPE.DML;
/** User request query type */
private QUERY_DML_TYPE sqlDMLType = QUERY_DML_TYPE.UNKNOWN;
/** TABLE, INDEX, VIEW, OTHERES */
private QUERY_DDL_TYPE sqlDDLType = QUERY_DDL_TYPE.UNKNOWN;
private String sqlObjectName = "";
private QUERY_DDL_STATUS queryStatus = QUERY_DDL_STATUS.UNKNOWN;
/** query result */
private RequestResultDAO resultDao = new RequestResultDAO();
/**
*
* @param userDB
* @param originalSql 쿼리
* @param dbAction 수행을 요청한 곳.
* @param mode 전체인지, 부분인지 {@code EditorDefine.QUERY_MODE}
* @param type 쿼리, 실행 계획인지 {@code EditorDefine.EXECUTE_TYPE}
* @param isAutoCommit autocommit
*/
public RequestQuery(UserDBDAO userDB, String originalSql, OBJECT_TYPE dbAction, EditorDefine.QUERY_MODE mode, EditorDefine.EXECUTE_TYPE type, boolean isAutoCommit) {
//
// 사용자가 네트웍을 바꾸어서 사용하면 어떻게 되지???
//
this.userIp = SessionManager.getLoginIp();// RWT.getRequest().getRemoteAddr();
this.originalSql = originalSql;
this.dbAction = dbAction;
this.sql = SQLUtil.makeExecutableSQL(userDB, originalSql);
parseSQL(this.sql);
// logger.debug("================================================================================================");
// logger.debug("[originalSql]" + originalSql);
// logger.debug("[sql]" + sql);
// logger.debug("================================================================================================");
this.mode = mode;
this.executeType = type;
this.isAutoCommit = isAutoCommit;
}
/**
* implements clone
*/
public Object clone() throws CloneNotSupportedException {
RequestQuery clone = (RequestQuery)super.clone();
return clone;
}
/**
* sql of query type
*
* @param sql
* @return query type
*/
public void parseSQL(String sql) {
BasicTDBSQLParser parser = new BasicTDBSQLParser();
QueryInfoDTO queryInfoDto = parser.parser(sql);
setStatement(queryInfoDto.isStatement());
try {
Statement statement = CCJSqlParserUtil.parse(sql);
setSqlType(SQL_TYPE.DML);
if(statement instanceof Select) {
sqlDMLType = QUERY_DML_TYPE.SELECT;
} else if(statement instanceof Insert) {
sqlDMLType = QUERY_DML_TYPE.INSERT;
} else if(statement instanceof Update) {
sqlDMLType = QUERY_DML_TYPE.UPDATE;
} else if(statement instanceof Delete) {
sqlDMLType = QUERY_DML_TYPE.DELETE;
}
} catch (Throwable e) {
logger.error(String.format("sql parse exception. [ %s ]", sql));
}
if(sqlDMLType.equals(QUERY_DML_TYPE.UNKNOWN)) {
if(queryInfoDto.isStatement()) {
setSqlType(SQL_TYPE.DML);
sqlDMLType = QUERY_DML_TYPE.UNKNOWN;
} else {
setSqlType(SQL_TYPE.DDL);
sqlDDLType = queryInfoDto.getQueryDDLType();
queryStatus = queryInfoDto.getQueryStatus();
sqlObjectName = queryInfoDto.getObjectName();
//
// CREATE, ALTER ,
// 프로시저, 펑션, 트리거, 패키지, 마지막에 ; 문자가 있어야 정상 실행 됩니다. - 좀더 확인 필요 hangum
// 시노님은없어야합니다. - 2016-07-29 (niliri)
//
if(queryStatus == QUERY_DDL_STATUS.CREATE | queryStatus == QUERY_DDL_STATUS.ALTER)
if(sqlDDLType == QUERY_DDL_TYPE.PROCEDURE | sqlDDLType == QUERY_DDL_TYPE.FUNCTION | sqlDDLType == QUERY_DDL_TYPE.TRIGGER | sqlDDLType == QUERY_DDL_TYPE.PACKAGE) {
if(!StringUtils.endsWith(this.sql, PublicTadpoleDefine.SQL_DELIMITER)) {
this.sql += PublicTadpoleDefine.SQL_DELIMITER;
}
}
}
}
}
/**
* @return the sql
*/
public String getSql() {
return sql;
}
/**
* @param sql the sql to set
*/
public void setSql(String sql) {
this.sql = sql;
}
/**
* @return the mode
*/
public EditorDefine.QUERY_MODE getMode() {
return mode;
}
/**
* @param mode the mode to set
*/
public void setMode(EditorDefine.QUERY_MODE mode) {
this.mode = mode;
}
/**
* @return the executeType
*/
public EditorDefine.EXECUTE_TYPE getExecuteType() {
return executeType;
}
/**
* @param executeType the executeType to set
*/
public void setExecuteType(EditorDefine.EXECUTE_TYPE executeType) {
this.executeType = executeType;
}
/**
* @return the originalSql
*/
public String getOriginalSql() {
return originalSql;
}
/**
* @param originalSql the originalSql to set
*/
public void setOriginalSql(String originalSql) {
this.originalSql = originalSql;
}
/**
* @return the isAutoCommit
*/
public boolean isAutoCommit() {
return isAutoCommit;
}
/**
* @param isAutoCommit the isAutoCommit to set
*/
public void setAutoCommit(boolean isAutoCommit) {
this.isAutoCommit = isAutoCommit;
}
/**
* @return the userIp
*/
public String getUserIp() {
return userIp;
}
/**
* @param userIp the userIp to set
*/
public void setUserIp(String userIp) {
this.userIp = userIp;
}
/**
* @return the dbAction
*/
public OBJECT_TYPE getDbAction() {
return dbAction;
}
/**
* @param dbAction the dbAction to set
*/
public void setDbAction(OBJECT_TYPE dbAction) {
this.dbAction = dbAction;
}
/**
* @return the resultDao
*/
public RequestResultDAO getResultDao() {
return resultDao;
}
/**
* @param resultDao the resultDao to set
*/
public void setResultDao(RequestResultDAO resultDao) {
this.resultDao = resultDao;
}
/**
* @return the isStatement
*/
public boolean isStatement() {
return isStatement;
}
/**
* @param isStatement the isStatement to set
*/
public void setStatement(boolean isStatement) {
this.isStatement = isStatement;
}
/**
* @return the sqlType
*/
public SQL_TYPE getSqlType() {
return sqlType;
}
/**
* @param sqlType the sqlType to set
*/
public void setSqlType(SQL_TYPE sqlType) {
this.sqlType = sqlType;
}
/**
* @return the sqlDMLType
*/
public QUERY_DML_TYPE getSqlDMLType() {
return sqlDMLType;
}
/**
* @param sqlDMLType the sqlDMLType to set
*/
public void setSqlDMLType(QUERY_DML_TYPE sqlDMLType) {
this.sqlDMLType = sqlDMLType;
}
/**
* @return the sqlDDLType
*/
public QUERY_DDL_TYPE getSqlDDLType() {
return sqlDDLType;
}
/**
* @param sqlDDLType the sqlDDLType to set
*/
public void setSqlDDLType(QUERY_DDL_TYPE sqlDDLType) {
this.sqlDDLType = sqlDDLType;
}
/**
* @return the sqlObjectName
*/
public String getSqlObjectName() {
return sqlObjectName;
}
/**
* @param sqlObjectName the sqlObjectName to set
*/
public void setSqlObjectName(String sqlObjectName) {
this.sqlObjectName = sqlObjectName;
}
/**
* @return the queryStatus
*/
public QUERY_DDL_STATUS getQueryStatus() {
return queryStatus;
}
/**
* @param queryStatus the queryStatus to set
*/
public void setQueryStatus(QUERY_DDL_STATUS queryStatus) {
this.queryStatus = queryStatus;
}
public PublicTadpoleDefine.SQL_STATEMENT_TYPE getSqlStatementType() {
return sqlStatementType;
}
public void setSqlStatementType(PublicTadpoleDefine.SQL_STATEMENT_TYPE sqlStatementType) {
this.sqlStatementType = sqlStatementType;
}
/**
* @return the statementParameter
*/
public Object[] getStatementParameter() {
return statementParameter;
}
/**
* @param statementParameter the statementParameter to set
*/
public void setStatementParameter(Object[] statementParameter) {
this.statementParameter = statementParameter;
}
/**
* @return the sqlAddParameter
*/
public String getSqlAddParameter() {
return sqlAddParameter;
}
/**
* @param sqlAddParameter the sqlAddParameter to set
*/
public void setSqlAddParameter(String sqlAddParameter) {
this.sqlAddParameter = sqlAddParameter;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "RequestQuery [userIp=" + userIp + ", isAutoCommit=" + isAutoCommit + ", originalSql=" + originalSql + ", sqlStatementType=" + sqlStatementType
+ ", sql=" + sql + ", \ndbAction=" + dbAction + ", mode=" + mode + ", executeType=" + executeType
+ ", \nisStatement=" + isStatement + ", sqlType=" + sqlType + ", sqlDMLType=" + sqlDMLType
+ ", \nsqlDDLType=" + sqlDDLType + ", sqlObjectName=" + sqlObjectName + ", queryStatus=" + queryStatus
+ ", \nresultDao=" + resultDao + "]";
}
}