package io.mycat.route.handler; import io.mycat.cache.LayerCachePool; import io.mycat.route.RouteResultset; import io.mycat.route.RouteResultsetNode; import io.mycat.route.RouteStrategy; import io.mycat.route.factory.RouteStrategyFactory; import io.mycat.server.MySQLFrontConnection; import io.mycat.server.config.node.SchemaConfig; import io.mycat.server.config.node.SystemConfig; import io.mycat.server.parser.ServerParse; import java.sql.SQLNonTransientException; /** * 处理注释中 类型为sql的情况 (按照 注释中的sql做路由解析,而不是实际的sql) */ public class HintSQLHandler implements HintHandler { private RouteStrategy routeStrategy; public HintSQLHandler() { this.routeStrategy = RouteStrategyFactory.getRouteStrategy(); } @Override public RouteResultset route(SystemConfig sysConfig, SchemaConfig schema, int sqlType, String realSQL, String charset, MySQLFrontConnection sc, LayerCachePool cachePool, String hintSQLValue) throws SQLNonTransientException { RouteResultset rrs = routeStrategy.route(sysConfig, schema, sqlType, hintSQLValue, charset, sc, cachePool); // 替换RRS中的SQL执行 RouteResultsetNode[] oldRsNodes = rrs.getNodes(); RouteResultsetNode[] newRrsNodes = new RouteResultsetNode[oldRsNodes.length]; for (int i = 0; i < newRrsNodes.length; i++) { newRrsNodes[i] = new RouteResultsetNode(oldRsNodes[i].getName(), oldRsNodes[i].getSqlType(), realSQL); } rrs.setNodes(newRrsNodes); // 判断是否为调用存储过程的SQL语句,这里不能用SQL解析器来解析判断是否为CALL语句 int rs = ServerParse.parse(realSQL); int realSQLType = rs & 0xff; if (ServerParse.CALL == realSQLType) { rrs.setCallStatement(true); } return rrs; } }