/******************************************************************************* * 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.rdb.core.editors.main.execute.sub; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.QUERY_DML_TYPE; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.SQL_STATEMENT_TYPE; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.SQL_TYPE; import com.hangum.tadpole.engine.define.DBGroupDefine; import com.hangum.tadpole.engine.manager.TadpoleSQLManager; import com.hangum.tadpole.engine.manager.TadpoleSQLTransactionManager; import com.hangum.tadpole.engine.permission.PermissionChecker; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.hangum.tadpole.engine.utils.RequestQuery; import com.hangum.tadpole.rdb.core.editors.main.execute.TransactionManger; import com.hangum.tadpole.tajo.core.connections.TajoConnectionManager; /** * Execute ddl, insert, update, delete etc.. * * @author hangum * @version 1.6.1 * */ public class ExecuteOtherSQL { private static final Logger logger = Logger.getLogger(ExecuteOtherSQL.class); /** * other sql execution * @param errMsg * * @param reqQuery * @param userDB * @param userType * @param userEmail * @throws SQLException * @throws Exception */ public static void runPermissionSQLExecution(String errMsg, final RequestQuery reqQuery, final UserDBDAO userDB, final String userType, final String userEmail) throws SQLException, Exception { if(!PermissionChecker.isExecute(userType, userDB, reqQuery.getSql())) { throw new Exception(errMsg); } if(reqQuery.getSqlType() == SQL_TYPE.DDL) { if(PublicTadpoleDefine.YES_NO.YES.name().equals(userDB.getDbAccessCtl().getDdl_lock())) { throw new Exception(errMsg); } } PublicTadpoleDefine.QUERY_DML_TYPE queryType = reqQuery.getSqlDMLType(); if(queryType == QUERY_DML_TYPE.INSERT) { if(PublicTadpoleDefine.YES_NO.YES.name().equals(userDB.getDbAccessCtl().getInsert_lock())) { throw new Exception(errMsg); } } if(queryType == QUERY_DML_TYPE.UPDATE) { if(PublicTadpoleDefine.YES_NO.YES.name().equals(userDB.getDbAccessCtl().getUpdate_lock())) { throw new Exception(errMsg); } } if(queryType == QUERY_DML_TYPE.DELETE) { if(PublicTadpoleDefine.YES_NO.YES.name().equals(userDB.getDbAccessCtl().getDelete_locl())) { throw new Exception(errMsg); } } runSQLOther(reqQuery, userDB, userType, userEmail); } /** * select문 이외의 쿼리를 실행합니다 * * @param reqQuery * @exception */ public static void runSQLOther( final RequestQuery reqQuery, final UserDBDAO userDB, final String userType, final String userEmail) throws SQLException, Exception { // is tajo if(DBGroupDefine.TAJO_GROUP == userDB.getDBGroup()) { new TajoConnectionManager().executeUpdate(userDB,reqQuery.getSql()); } else { // commit나 rollback 명령을 만나면 수행하고 리턴합니다. if(TransactionManger.calledCommitOrRollback(reqQuery.getSql(), userEmail, userDB)) return; java.sql.Connection javaConn = null; Statement statement = null; PreparedStatement preparedStatement = null; try { if(reqQuery.isAutoCommit()) { // SqlMapClient client = TadpoleSQLManager.getInstance(userDB); javaConn = TadpoleSQLManager.getConnection(userDB); } else { javaConn = TadpoleSQLTransactionManager.getInstance(userEmail, userDB); } // TODO mysql일 경우 https://github.com/hangum/TadpoleForDBTools/issues/3 와 같은 문제가 있어 create table 테이블명 다음의 '(' 다음에 공백을 넣어주도록 합니다. if(DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()) { final String checkSQL = reqQuery.getSql().trim().toUpperCase(); if(StringUtils.startsWithIgnoreCase(checkSQL, "CREATE TABLE")) { //$NON-NLS-1$ reqQuery.setSql(StringUtils.replaceOnce(reqQuery.getSql(), "(", " (")); //$NON-NLS-1$ //$NON-NLS-2$ } } if(reqQuery.getSqlStatementType() == SQL_STATEMENT_TYPE.NONE) { statement = javaConn.createStatement(); // hive는 executeUpdate()를 지원하지 않아서. 13.08.19-hangum if(DBGroupDefine.HIVE_GROUP == userDB.getDBGroup() || DBGroupDefine.SQLITE_GROUP == userDB.getDBGroup()) { statement.execute(reqQuery.getSql()); } else { statement.executeUpdate(reqQuery.getSql()); } } else if(reqQuery.getSqlStatementType() == SQL_STATEMENT_TYPE.PREPARED_STATEMENT) { preparedStatement = javaConn.prepareStatement(reqQuery.getSql()); final Object[] statementParameter = reqQuery.getStatementParameter(); for (int i=1; i<=statementParameter.length; i++) { preparedStatement.setObject(i, statementParameter[i-1]); } // hive는 executeUpdate()를 지원하지 않아서. 13.08.19-hangum if(DBGroupDefine.HIVE_GROUP == userDB.getDBGroup() || DBGroupDefine.SQLITE_GROUP == userDB.getDBGroup()) { preparedStatement.execute(); } else { preparedStatement.executeUpdate(); } } } finally { try { if(statement != null) statement.close();} catch(Exception e) {} try { if(preparedStatement != null) preparedStatement.close();} catch(Exception e) {} if(reqQuery.isAutoCommit()) { try { if(javaConn != null) javaConn.close(); } catch(Exception e){} } } } // end which db } }