/** * Alipay.com Inc. * Copyright (c) 2004-2012 All Rights Reserved. */ package com.alipay.zdal.parser.sql; import java.util.List; import com.alipay.zdal.parser.sql.ast.SQLExpr; import com.alipay.zdal.parser.sql.ast.SQLObject; import com.alipay.zdal.parser.sql.ast.SQLStatement; import com.alipay.zdal.parser.sql.dialect.mysql.visitor.MySqlOutputVisitor; import com.alipay.zdal.parser.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; import com.alipay.zdal.parser.sql.dialect.oracle.visitor.OracleOutputVisitor; import com.alipay.zdal.parser.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; import com.alipay.zdal.parser.sql.parser.ParserException; import com.alipay.zdal.parser.sql.parser.SQLExprParser; import com.alipay.zdal.parser.sql.parser.SQLParserUtils; import com.alipay.zdal.parser.sql.parser.SQLStatementParser; import com.alipay.zdal.parser.sql.parser.Token; import com.alipay.zdal.parser.sql.util.JdbcUtils; import com.alipay.zdal.parser.sql.visitor.SQLASTOutputVisitor; import com.alipay.zdal.parser.sql.visitor.SchemaStatVisitor; /** * * @author xiaoqing.zhouxq * @version $Id: SQLUtils.java, v 0.1 2012-11-17 ����3:11:19 xiaoqing.zhouxq Exp $ */ public class SQLUtils { public static String toSQLString(SQLObject sqlObject, String dbType) { if (JdbcUtils.MYSQL.equals(dbType)) { return toMySqlString(sqlObject); } return toOracleString(sqlObject); } public static String toSQLString(SQLObject sqlObject) { StringBuilder out = new StringBuilder(); sqlObject.accept(new SQLASTOutputVisitor(out)); String sql = out.toString(); return sql; } public static String toMySqlString(SQLObject sqlObject) { StringBuilder out = new StringBuilder(); sqlObject.accept(new MySqlOutputVisitor(out)); String sql = out.toString(); return sql; } public static SQLExpr toMySqlExpr(String sql) { return toSQLExpr(sql, JdbcUtils.MYSQL); } public static String formatMySql(String sql) { return format(sql, JdbcUtils.MYSQL); } public static String formatOracle(String sql) { return format(sql, JdbcUtils.ORACLE); } public static String toOracleString(SQLObject sqlObject) { StringBuilder out = new StringBuilder(); sqlObject.accept(new OracleOutputVisitor(out)); String sql = out.toString(); return sql; } public static SQLExpr toSQLExpr(String sql, String dbType) { SQLExprParser parser = SQLParserUtils.createExprParser(sql, dbType); SQLExpr expr = parser.expr(); if (parser.getLexer().token() != Token.EOF) { throw new ParserException("illegal sql expr : " + sql); } return expr; } public static List<SQLStatement> toStatementList(String sql, String dbType) { SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); return parser.parseStatementList(); } public static SQLExpr toSQLExpr(String sql) { return toSQLExpr(sql, null); } public static String format(String sql, String dbType) { List<SQLStatement> statementList = toStatementList(sql, dbType); StringBuilder out = new StringBuilder(); SQLASTOutputVisitor visitor = createFormatOutputVisitor(out, statementList, dbType); for (SQLStatement stmt : statementList) { stmt.accept(visitor); } return out.toString(); } public static SQLASTOutputVisitor createFormatOutputVisitor(Appendable out, List<SQLStatement> statementList, String dbType) { if (JdbcUtils.ORACLE.equals(dbType)) { if (statementList.size() == 1) { return new OracleOutputVisitor(out, false); } else { return new OracleOutputVisitor(out, true); } } if (JdbcUtils.MYSQL.equals(dbType)) { return new MySqlOutputVisitor(out); } return new SQLASTOutputVisitor(out); } public static SchemaStatVisitor createSchemaStatVisitor(List<SQLStatement> statementList, String dbType) { if (JdbcUtils.ORACLE.equals(dbType)) { if (statementList.size() == 1) { return new OracleSchemaStatVisitor(); } else { return new OracleSchemaStatVisitor(); } } if (JdbcUtils.MYSQL.equals(dbType)) { return new MySqlSchemaStatVisitor(); } return new SchemaStatVisitor(); } public static List<SQLStatement> parseStatements(String sql, String dbType) { SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); List<SQLStatement> stmtList = parser.parseStatementList(); if (parser.getLexer().token() != Token.EOF) { throw new SqlParserRuntimeException("syntax error : " + sql); } return stmtList; } }