Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#501 sql详细分析类适配多数据库 #550

Open
wants to merge 1 commit into
base: dev6.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,5 @@ com.codingapi.txlcn.tc.reporter.ReporterConfiguration,\
com.codingapi.txlcn.tc.resolver.ResolverConfiguration,\
com.codingapi.txlcn.tc.runner.TcRunnerConfiguration,\
com.codingapi.txlcn.tc.rpc.RpcTransactionConfiguration,\
com.codingapi.txlcn.tc.TCAutoConfiguration,\
com.codingapi.txlcn.tc.TCAutoConfiguration

Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,13 @@ public String sqlType() {
public String analyse(String sql,StatementInformation statementInformation) throws SQLException {
log.debug("mysql analyse:{}", sql);
Connection connection = statementInformation.getConnectionInformation().getConnection();
// sql.toUpperCase().substring(0,6) 这样实现有风险
// if else 实现并不是很优雅
CCJSqlParserManager parser = new CCJSqlParserManager();
Statement stmt = parser.parse(new StringReader(sql));
SqlSqlAnalyseHandler sqlSqlAnalyseHandler = analyseStrategryFactory.getInvokeStrategy(sqlType(),stmt);
if(sqlSqlAnalyseHandler==null){
return sql;
}
return sqlSqlAnalyseHandler.analyse(sql,connection,stmt);
return sqlSqlAnalyseHandler.analyse(sqlType(),sql,connection,stmt);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.Join;
import org.apache.commons.dbutils.QueryRunner;
Expand Down Expand Up @@ -143,4 +144,10 @@ else if(JDBCType.BIGINT.getName().equals(primaryKeyType.getName())){
sql = sql.concat(")");
return sql;
}

@Override
public boolean preAnalyse(String sqlType) {
return "mysql".equals(sqlType);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.Join;

Expand Down Expand Up @@ -64,4 +65,7 @@ public interface SqlDetailAnalyse {
* @return
*/
String splicingNewSql(String sql, SqlAnalyseInfo sqlAnalyseInfo, List<Map<String, Object>> query);

boolean preAnalyse(String sqlType);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.codingapi.txlcn.tc.jdbc.sql.strategy;

import com.codingapi.txlcn.tc.jdbc.sql.analyse.SqlDetailAnalyse;
import net.sf.jsqlparser.statement.Statement;

import java.util.List;

/**
* @author Gz.
* @description:
* @date 2020-09-02 22:51:37
*/

public class SqlDetailAnalyseFactory {

private List<SqlDetailAnalyse> analyseHandlers;

public SqlDetailAnalyseFactory(List<SqlDetailAnalyse> analyseHandlers) {
this.analyseHandlers = analyseHandlers;
}

public SqlDetailAnalyse getInvokeStrategy(String sqlType) {
for(SqlDetailAnalyse handler : analyseHandlers){
if(handler.preAnalyse(sqlType)){
return handler;
}
}
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
public interface SqlSqlAnalyseHandler {


String analyse(String sql, Connection connection, Statement stmt) throws JSQLParserException, SQLException;
String analyse(String sqlType,String sql, Connection connection, Statement stmt) throws JSQLParserException, SQLException;


boolean preAnalyse(String sqlType,Statement stmt);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,21 +24,26 @@ public AnalyseStrategryFactory analyseStrategryFactory(@Autowired(required = fal
return new AnalyseStrategryFactory(analyseHandlers);
}

@Bean
public SqlDetailAnalyseFactory sqlDetailStrategryFactory(@Autowired(required = false)List<SqlDetailAnalyse> sqlDetailAnalyses){
return new SqlDetailAnalyseFactory(sqlDetailAnalyses);
}

@Bean
@ConditionalOnMissingBean
public SqlSqlAnalyseHandler mysqlInsertAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){
public SqlSqlAnalyseHandler mysqlInsertAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyse){
return new MysqlInsertAnalyseStrategy(sqlDetailAnalyse);
}

@Bean
@ConditionalOnMissingBean
public SqlSqlAnalyseHandler mysqlDeleteAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){
public SqlSqlAnalyseHandler mysqlDeleteAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyse){
return new MysqlDeleteAnalyseStrategy(sqlDetailAnalyse);
}

@Bean
@ConditionalOnMissingBean
public SqlSqlAnalyseHandler mysqlUpdateAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){
public SqlSqlAnalyseHandler mysqlUpdateAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyse){
return new MysqlUpdateAnalyseStrategy(sqlDetailAnalyse);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
*/
public class CheckTableContainsPkFilter implements SqlAnalysqFilter {
@Override
public boolean doFilter(FilterFacaer filterFacaer) {
TableInfo tableInfo = filterFacaer.getTableList().getTable(filterFacaer.getTable().getName());
public boolean doFilter(FilterFacade filterFacade) {
TableInfo tableInfo = filterFacade.getTableList().getTable(filterFacade.getTable().getName());
if(ListUtil.isNotEmpty(tableInfo.getPrimaryKeys())){
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
*/
public class CheckWhereContainsPkFilter implements SqlAnalysqFilter {
@Override
public boolean doFilter(FilterFacaer filterFacaer) {
TableInfo tableInfo = filterFacaer.getTableList().getTable(filterFacaer.getTable().getName());
return (filterFacaer.getDeleteStatement() == null ? filterFacaer.getUpdateStatement().getWhere() : filterFacaer.getDeleteStatement().getWhere()).toString().toUpperCase().contains(tableInfo.getPrimaryKeys().get(0).toUpperCase());
public boolean doFilter(FilterFacade filterFacade) {
TableInfo tableInfo = filterFacade.getTableList().getTable(filterFacade.getTable().getName());
return (filterFacade.getDeleteStatement() == null ? filterFacade.getUpdateStatement().getWhere() : filterFacade.getDeleteStatement().getWhere()).toString().toUpperCase().contains(tableInfo.getPrimaryKeys().get(0).toUpperCase());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
@Data
@Builder
public class FilterFacaer {
public class FilterFacade {

private TableList tableList;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ public class ItemsListFilter implements SqlAnalysqFilter {


@Override
public boolean doFilter(FilterFacaer filterFacaer) {
if(null == filterFacaer.getItemsList()){
public boolean doFilter(FilterFacade filterFacade) {
if(null == filterFacade.getItemsList()){
return false;
}
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
*/
public interface SqlAnalysqFilter {

boolean doFilter(FilterFacaer filterFacaer);
boolean doFilter(FilterFacade filterFacade);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ public SqlAnalysqFilterChain add(SqlAnalysqFilter filter){
}

@Override
public boolean doFilter(FilterFacaer filterFacaer) {
public boolean doFilter(FilterFacade filterFacade) {
for (SqlAnalysqFilter filter : filterList) {
if(!filter.doFilter(filterFacaer)){
if(!filter.doFilter(filterFacade)){
return false;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package com.codingapi.txlcn.tc.jdbc.sql.strategy.chan;

import net.sf.jsqlparser.statement.update.Update;

/**
* @author Gz.
* @description:
* @date 2020-09-21 23:46:54
*/
public class WhereFilter implements SqlAnalysqFilter {
@Override
public boolean doFilter(FilterFacaer filterFacaer) {
if( (filterFacaer.getDeleteStatement() == null ? filterFacaer.getUpdateStatement().getWhere() : filterFacaer.getDeleteStatement().getWhere()) == null){
public boolean doFilter(FilterFacade filterFacade) {
if( (filterFacade.getDeleteStatement() == null ? filterFacade.getUpdateStatement().getWhere() : filterFacade.getDeleteStatement().getWhere()) == null){
return false;
}
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.codingapi.txlcn.tc.jdbc.database.SqlAnalyseInfo;
import com.codingapi.txlcn.tc.jdbc.database.TableList;
import com.codingapi.txlcn.tc.jdbc.sql.analyse.SqlDetailAnalyse;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlDetailAnalyseFactory;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlSqlAnalyseHandler;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.chan.*;
import com.codingapi.txlcn.tc.utils.ListUtil;
Expand All @@ -28,31 +29,32 @@
@Slf4j
public class MysqlDeleteAnalyseStrategy implements SqlSqlAnalyseHandler {

private SqlDetailAnalyse sqlDetailAnalyse;
private SqlDetailAnalyseFactory sqlDetailAnalyseFactory;

public MysqlDeleteAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){
this.sqlDetailAnalyse = sqlDetailAnalyse;
public MysqlDeleteAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyseFactory){
this.sqlDetailAnalyseFactory = sqlDetailAnalyseFactory;
}

@Override
public String analyse(String sql, Connection connection, Statement stmt) throws SQLException, JSQLParserException {
public String analyse(String sqlType,String sql, Connection connection, Statement stmt) throws SQLException, JSQLParserException {
String catalog = connection.getCatalog();
TableList tableList = DataBaseContext.getInstance().get(catalog);
Delete statement = (Delete) stmt;
Table table = statement.getTable();
FilterFacaer filterFacaer = FilterFacaer.builder().tableList(tableList).table(table).deleteStatement(statement).build();
FilterFacade filterFacade = FilterFacade.builder().tableList(tableList).table(table).deleteStatement(statement).build();
SqlAnalysqFilterChain filter = new SqlAnalysqFilterChain();
filter.add(new WhereFilter()).add(new CheckTableContainsPkFilter()).add(new CheckWhereContainsPkFilter());
if(!filter.doFilter(filterFacaer)){
if(!filter.doFilter(filterFacade)){
return sql;
}
SqlAnalyseInfo sqlAnalyseInfo = sqlDetailAnalyse.sqlAnalyseSingleTable(tableList, table, statement.getWhere(),statement.getJoins());
SqlDetailAnalyse invokeStrategy = sqlDetailAnalyseFactory.getInvokeStrategy(sqlType);
SqlAnalyseInfo sqlAnalyseInfo = invokeStrategy.sqlAnalyseSingleTable(tableList, table, statement.getWhere(),statement.getJoins());
QueryRunner queryRunner = new QueryRunner();
List<Map<String, Object>> query = queryRunner.query(connection, sqlAnalyseInfo.getQuerySql(), new MapListHandler());
if(ListUtil.isEmpty(query)){
return sql;
}
sql = sqlDetailAnalyse.splicingNewSql(sql, sqlAnalyseInfo, query);
sql = invokeStrategy.splicingNewSql(sql, sqlAnalyseInfo, query);
log.info("newSql=[{}]",sql);
return sql;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.codingapi.txlcn.tc.jdbc.sql.strategy.mysql;

import com.codingapi.txlcn.tc.jdbc.database.DataBaseContext;
import com.codingapi.txlcn.tc.jdbc.database.SqlAnalyseHelper;
import com.codingapi.txlcn.tc.jdbc.database.TableInfo;
import com.codingapi.txlcn.tc.jdbc.database.TableList;
import com.codingapi.txlcn.tc.jdbc.sql.analyse.SqlDetailAnalyse;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlDetailAnalyseFactory;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlSqlAnalyseHandler;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.chan.*;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -13,7 +13,6 @@
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.insert.Insert;
import org.springframework.stereotype.Component;

import java.sql.Connection;
import java.sql.SQLException;
Expand All @@ -27,14 +26,15 @@
@Slf4j
public class MysqlInsertAnalyseStrategy implements SqlSqlAnalyseHandler {

private SqlDetailAnalyse sqlDetailAnalyse;
private SqlDetailAnalyseFactory sqlDetailAnalyseFactory;

public MysqlInsertAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){
this.sqlDetailAnalyse = sqlDetailAnalyse;
public MysqlInsertAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyseFactory){
this.sqlDetailAnalyseFactory = sqlDetailAnalyseFactory;
}


@Override
public String analyse(String sql, Connection connection, Statement stmt) throws SQLException, JSQLParserException {
public String analyse(String sqlType, String sql, Connection connection, Statement stmt) throws SQLException, JSQLParserException {
boolean defaultAutoCommit = connection.getAutoCommit();
connection.setAutoCommit(false);
String catalog = connection.getCatalog();
Expand All @@ -43,10 +43,10 @@ public String analyse(String sql, Connection connection, Statement stmt) throws
Table table = statement.getTable();
ItemsList itemsList = statement.getItemsList();

FilterFacaer filterFacaer = FilterFacaer.builder().tableList(tableList).table(table).itemsList(itemsList).build();
FilterFacade filterFacade = FilterFacade.builder().tableList(tableList).table(table).itemsList(itemsList).build();
SqlAnalysqFilterChain filter = new SqlAnalysqFilterChain();
filter.add(new CheckTableContainsPkFilter()).add(new ItemsListFilter());
if(!filter.doFilter(filterFacaer)){
if(!filter.doFilter(filterFacade)){
return sql;
}

Expand All @@ -61,9 +61,10 @@ public String analyse(String sql, Connection connection, Statement stmt) throws
}
}

if (sqlDetailAnalyse.multiInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql;
SqlDetailAnalyse invokeStrategy = sqlDetailAnalyseFactory.getInvokeStrategy(sqlType);
if (invokeStrategy.multiInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql;

if (sqlDetailAnalyse.singleInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql;
if (invokeStrategy.singleInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql;

connection.rollback();
connection.setAutoCommit(defaultAutoCommit);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.codingapi.txlcn.tc.jdbc.database.SqlAnalyseInfo;
import com.codingapi.txlcn.tc.jdbc.database.TableList;
import com.codingapi.txlcn.tc.jdbc.sql.analyse.SqlDetailAnalyse;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlDetailAnalyseFactory;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlSqlAnalyseHandler;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.chan.*;
import com.codingapi.txlcn.tc.utils.ListUtil;
Expand All @@ -29,32 +30,33 @@
@Slf4j
public class MysqlUpdateAnalyseStrategy implements SqlSqlAnalyseHandler {

private SqlDetailAnalyse sqlDetailAnalyse;
private SqlDetailAnalyseFactory sqlDetailAnalyseFactory;

public MysqlUpdateAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){
this.sqlDetailAnalyse = sqlDetailAnalyse;
public MysqlUpdateAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyseFactory){
this.sqlDetailAnalyseFactory = sqlDetailAnalyseFactory;
}

@Override
public String analyse(String sql, Connection connection , Statement stmt) throws SQLException, JSQLParserException {
public String analyse(String sqlType,String sql, Connection connection , Statement stmt) throws SQLException, JSQLParserException {
String catalog = connection.getCatalog();
TableList tableList = DataBaseContext.getInstance().get(catalog);
Update statement = (Update) stmt;
Table table = statement.getTable();
FilterFacaer filterFacaer = FilterFacaer.builder().tableList(tableList).table(table).updateStatement(statement).build();
FilterFacade filterFacade = FilterFacade.builder().tableList(tableList).table(table).updateStatement(statement).build();
SqlAnalysqFilterChain filter = new SqlAnalysqFilterChain();
filter.add(new WhereFilter()).add(new CheckTableContainsPkFilter()).add(new CheckWhereContainsPkFilter());
if(!filter.doFilter(filterFacaer)){
if(!filter.doFilter(filterFacade)){
return sql;
}
//TODO now() 之类的函数有待分析
SqlAnalyseInfo sqlAnalyseInfo = sqlDetailAnalyse.sqlAnalyseSingleTable(tableList, table, statement.getWhere(),statement.getStartJoins());
SqlDetailAnalyse invokeStrategy = sqlDetailAnalyseFactory.getInvokeStrategy(sqlType);
SqlAnalyseInfo sqlAnalyseInfo = invokeStrategy.sqlAnalyseSingleTable(tableList, table, statement.getWhere(),statement.getStartJoins());
QueryRunner queryRunner = new QueryRunner();
List<Map<String, Object>> query = queryRunner.query(connection, sqlAnalyseInfo.getQuerySql(), new MapListHandler());
if(ListUtil.isEmpty(query)){
return sql;
}
sql = sqlDetailAnalyse.splicingNewSql(sql, sqlAnalyseInfo, query);
sql = invokeStrategy.splicingNewSql(sql, sqlAnalyseInfo, query);
log.info("newSql=[{}]",sql);
return sql;
}
Expand Down
Loading