package org.quickbundle.base.beans;
import org.quickbundle.ICoreConstants;
import org.quickbundle.config.RmBaseConfig;
public abstract class AbstractDbWrapper {
public final static int MAX_LONG_LENGTH = String.valueOf(Long.MAX_VALUE).length();
protected TableIdRuleVo ruleVo = null;
public AbstractDbWrapper(TableIdRuleVo ruleVo) {
this.ruleVo = ruleVo;
}
//根据 集群+table的前缀和maxId,获取下一个可用值或默认起始值
protected long getMaxIdOrDefault(String maxId) {
long result = 0L;
if(maxId != null && maxId.length() > 0) {
if(maxId.length() > MAX_LONG_LENGTH) {
result = Long.parseLong(maxId.substring(0, MAX_LONG_LENGTH)) + 1;
} else {
result = Long.parseLong(maxId) + 1;
}
} else {
result = Long.parseLong(firstValue());
}
return result;
}
protected String firstValue() {
String idPrefix = getIdPrefix();
StringBuilder result = new StringBuilder(idPrefix);
for(int i=0; i<MAX_LONG_LENGTH-idPrefix.length()-1; i++) {
result.append("0");
}
result.append("1");
return result.toString();
}
private String getIdPrefix() {
return RmBaseConfig.getSingleton().getShardingPrefix() + ruleVo.getTableCode();
}
//根据<table table_code="2003" table_name="RM_AFFIX" id_name="ID"/>和shardingPrefix,获得查询最大值的sql
protected String getSqlSelectMax() {
StringBuilder sql = new StringBuilder();
sql.append("select max(");
sql.append(ruleVo.getIdName());
sql.append(") max_id from ");
sql.append(ruleVo.getTableName());
sql.append(" where ");
sql.append(parseColumn(ruleVo.getIdName()));
sql.append(" like '");
sql.append(getIdPrefix());
sql.append("%'");
return sql.toString();
}
private String parseColumn(String idName) {
StringBuilder result = new StringBuilder();
String dpn = RmBaseConfig.getSingleton().getDatabaseProductName();
//db2需要char(columnName) like '10001000%'
if(dpn == null
|| ICoreConstants.DatabaseProductType.DB2.getDatabaseProductName().equals(dpn)
|| dpn.startsWith(ICoreConstants.DatabaseProductType.DB2.getDatabaseProductName() + "/")) {
result.append("char(").append(idName).append(")");
return result.toString();
} else {
return idName;
}
}
}