/******************************************************************************* * Copyright (c) 2015 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.parser; import java.util.regex.Pattern; import org.apache.log4j.Logger; 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.sql.parser.ddl.ParserDDL; import com.hangum.tadpole.engine.sql.parser.define.ParserDefine; import com.hangum.tadpole.engine.sql.parser.dto.QueryInfoDTO; import com.hangum.tadpole.engine.sql.util.SQLUtil; 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 BasicTDBSQLParser implements TDBSQLParser { private static final Logger logger = Logger.getLogger(BasicTDBSQLParser.class); /** base statement pattern */ protected static final String REGEXP_STATEMENT = "^SELECT.*|^EXPLAIN.*|^SHOW.*|^DESCRIBE.*|^DESC.*|^CHECK.*|^PRAGMA.*|^WITH.*|^OPTIMIZE.*"; private static final String MSSQL_PATTERN_STATEMENT = "|^SP_HELP.*|^EXEC.*"; private static final String ORACLE_PATTERN_STATEMENT = ""; private static final String MYSQL_PATTERN_STATEMENT = "|^CALL.*|^SET.*"; private static final String PGSQL_PATTERN_STATEMENT = ""; private static final String SQLITE_PATTERN_STATEMENT = ""; private static final String CUBRID_PATTERN_STATEMENT = ""; /** agens graph statement */ private static final String AGENSGRAPH_PATTERN_STATEMENT = "|^MATCH.*"; private static final Pattern PATTERN_DML_BASIC = Pattern.compile(REGEXP_STATEMENT + MSSQL_PATTERN_STATEMENT + ORACLE_PATTERN_STATEMENT + MYSQL_PATTERN_STATEMENT + PGSQL_PATTERN_STATEMENT + SQLITE_PATTERN_STATEMENT + CUBRID_PATTERN_STATEMENT + AGENSGRAPH_PATTERN_STATEMENT , ParserDefine.PATTERN_FLAG ); @Override public QueryInfoDTO parser(String sql) { String strCheckSQL = SQLUtil.makeSQLTestString(sql); QueryInfoDTO queryInfoDTO = new QueryInfoDTO(); if(PATTERN_DML_BASIC.matcher(strCheckSQL).matches()) { queryInfoDTO.setStatement(true); queryInfoDTO.setSqlType(SQL_TYPE.DML); parseDML(sql, queryInfoDTO); } else { queryInfoDTO.setStatement(false); queryInfoDTO.setSqlType(SQL_TYPE.DDL); parseDDL(sql, queryInfoDTO); } return queryInfoDTO; } /** * parse DDL * * @param sql * @param queryInfoDTO */ protected void parseDDL(String sql, QueryInfoDTO queryInfoDTO) { ParserDDL parseDDL = new ParserDDL(); parseDDL.parseQuery(sql, queryInfoDTO); } /** * parse dml * * @param sql * @return */ protected void parseDML(String sql, QueryInfoDTO queryInfoDTO) { QUERY_DML_TYPE queryType = QUERY_DML_TYPE.UNKNOWN; try { Statement statement = CCJSqlParserUtil.parse(sql); if(statement instanceof Select) { queryType = QUERY_DML_TYPE.SELECT; } else if(statement instanceof Insert) { queryType = QUERY_DML_TYPE.INSERT; } else if(statement instanceof Update) { queryType = QUERY_DML_TYPE.UPDATE; } else if(statement instanceof Delete) { queryType = QUERY_DML_TYPE.DELETE; } } catch (Throwable e) { logger.error(String.format("sql parse exception. [ %s ]", sql)); } queryInfoDTO.setQueryType(queryType); } }