package io.mycat.route.handler;
import java.sql.SQLNonTransientException;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.alibaba.fastjson.JSON;
import io.mycat.MycatServer;
import io.mycat.backend.PhysicalDBNode;
import io.mycat.cache.LayerCachePool;
import io.mycat.route.RouteResultset;
import io.mycat.route.RouteStrategy;
import io.mycat.route.factory.RouteStrategyFactory;
import io.mycat.route.util.RouterUtil;
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;
/**
* 处理情况 sql hint: mycat:db_type=master/slave
*
* @author digdeep@126.com
*/
// /*#mycat:db_type=master*/
// /*#mycat:db_type=slave*/
// 强制走 master 和 强制走 slave
public class HintMasterDBHandler implements HintHandler {
private static final Logger LOGGER = Logger.getLogger(HintMasterDBHandler.class);
@Override
public RouteResultset route(SystemConfig sysConfig, SchemaConfig schema,
int sqlType, String realSQL, String charset,
MySQLFrontConnection sc, LayerCachePool cachePool,
String hintSQLValue)throws SQLNonTransientException {
RouteResultset rrs = RouteStrategyFactory.getRouteStrategy()
.route(sysConfig, schema, sqlType,
realSQL, charset, sc, cachePool);
Boolean isRouteToMaster = null; // 默认不施加任何影响
if(StringUtils.isNotBlank(hintSQLValue)){
if(hintSQLValue.trim().equalsIgnoreCase("master"))
isRouteToMaster = true;
if(hintSQLValue.trim().equalsIgnoreCase("slave")){
if(sqlType == ServerParse.DELETE || sqlType == ServerParse.INSERT
||sqlType == ServerParse.REPLACE || sqlType == ServerParse.UPDATE
|| sqlType == ServerParse.DDL){
LOGGER.warn("should not use hint 'db_type' to route 'delete', 'insert', 'replace', 'update', 'ddl' to a slave db.");
isRouteToMaster = null; // 不施加任何影响好
}else{
isRouteToMaster = false;
}
}
}
if(isRouteToMaster == null){ // 默认不施加任何影响好
LOGGER.warn(" sql hint 'db_type' error, ignore this hint.");
return rrs;
}
if(isRouteToMaster) // 强制走 master
rrs.setRunOnSlave(false);
if(!isRouteToMaster)// 强制走slave
rrs.setRunOnSlave(true);
LOGGER.debug("isRouteToMaster:::::::::" + isRouteToMaster); // false
return rrs;
}
}