package io.mycat.route.parser.druid;
import io.mycat.server.config.node.SystemConfig;
import io.mycat.server.sequence.IncrSequenceMySQLHandler;
import io.mycat.server.sequence.IncrSequencePropHandler;
import io.mycat.server.sequence.IncrSequenceTimeHandler;
import io.mycat.server.sequence.SequenceHandler;
import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 使用Druid解析器实现对Sequence处理
* @author 兵临城下
* @date 2015/03/13
*/
public class DruidSequenceHandler {
private final SequenceHandler sequenceHandler;
/** 获取MYCAT SEQ的匹配语句 */
private final static String MATCHED_FEATURE = "NEXT VALUE FOR MYCATSEQ_";
private final static Pattern pattern = Pattern.compile("(?:(\\s*next\\s+value\\s+for\\s*MYCATSEQ_(\\w+))(,|\\)|\\s)*)+", Pattern.CASE_INSENSITIVE);
public DruidSequenceHandler(int seqHandlerType) {
switch(seqHandlerType){
case SystemConfig.SEQUENCEHANDLER_MYSQLDB:
sequenceHandler = IncrSequenceMySQLHandler.getInstance();
break;
case SystemConfig.SEQUENCEHANDLER_LOCALFILE:
sequenceHandler = IncrSequencePropHandler.getInstance();
break;
case SystemConfig.SEQUENCEHANDLER_LOCAL_TIME:
sequenceHandler = IncrSequenceTimeHandler.getInstance();
break;
default:
throw new java.lang.IllegalArgumentException("Invalid sequnce handler type "+seqHandlerType);
}
}
/**
* 根据原sql获取可执行的sql
* @param sql
* @return
* @throws UnsupportedEncodingException
*/
public String getExecuteSql(String sql,String charset) throws UnsupportedEncodingException{
String executeSql = null;
if (null!=sql && !"".equals(sql)) {
//sql不能转大写,因为sql可能是insert语句会把values也给转换了
// 获取表名。
Matcher matcher = pattern.matcher(sql);
if(matcher.find())
{
String tableName = matcher.group(2);
long value = sequenceHandler.nextId(tableName.toUpperCase());
// 将MATCHED_FEATURE+表名替换成序列号。
executeSql = sql.replace(matcher.group(1), " "+value);
}
}
return executeSql;
}
//just for test
public String getTableName(String sql) {
Matcher matcher = pattern.matcher(sql);
if(matcher.find())
{
return matcher.group(2);
}
return null;
}
}