package jef.database.dialect;
import java.util.Arrays;
import jef.database.ConnectInfo;
import jef.database.DbFunction;
import jef.database.dialect.handler.LimitHandler;
import jef.database.dialect.handler.LimitOffsetLimitHandler;
import jef.database.meta.DbProperty;
import jef.database.meta.Feature;
import jef.database.support.RDBMS;
import jef.tools.collection.CollectionUtils;
/**
* GBase的dialect
* <p>
* TODO Gbase方言待测试
* <ul>
* <li>1) 数据插入后自增列的值获取;</li>
* <li>2) 批量删除时,异常:can't lock file</li>
* <li>3) 批量更新时,异常:refreshRow() called on row that has been deleted or had primary key changed.</li>
* </ul>
* </p>
*
* @Company Asiainfo-Linkage Technologies (China), Inc.
* @author luolp@asiainfo-linkage.com
* @Date 2013-1-28
*/
public class GBaseDialect extends AbstractDialect {
protected static final String DRIVER_CLASS = "com.gbase.jdbc.Driver";
protected static final int DEFAULT_PORT = 5258;
public GBaseDialect() {
features = CollectionUtils.identityHashSet();
features.addAll(Arrays.asList(
Feature.AUTOINCREMENT_MUSTBE_PK,
Feature.SUPPORT_COMMENT
));
setProperty(DbProperty.ADD_COLUMN, "ADD COLUMN");
setProperty(DbProperty.MODIFY_COLUMN, "ALTER");
setProperty(DbProperty.DROP_COLUMN, "DROP COLUMN");
setProperty(DbProperty.CHECK_SQL,"select 1");
setProperty(DbProperty.INDEX_USING_HASH," USING HASH");
}
public RDBMS getName() {
return RDBMS.gbase;
}
public String getDriverClass(String url) {
return DRIVER_CLASS;
}
@Override
public String getCatlog(String schema) {
return schema;
}
// @Override
// public void processAutoIncrement(List<String> cStr, List<String> vStr, InsertSqlResult result,
// String columnName, Field field, TableMetadata meta, AbstractDbClient parent)
// throws SQLException {
// cStr.add(columnName);
// vStr.add("DEFAULT");
// }
@Override
protected String getComment(ColumnType.AutoIncrement column,boolean flag) {
StringBuilder sb = new StringBuilder();
sb.append("INT AUTO_INCREMENT ");
if(flag){
if (!column.nullable) {
sb.append(" NOT NULL");
}
}
return sb.toString();
}
public String getFunction(DbFunction func, Object... params) {
if(func instanceof jef.database.query.Func){
switch ((jef.database.query.Func)func) {
case current_date:
return "CURRENT_DATE";
case current_time:
return "CURRENT_TIME";
case current_timestamp:
return "NOW()";
default:
throw new IllegalArgumentException("Unknown database function " + func.name());
}
}else{
throw new IllegalArgumentException("Unknown database function " + func.name());
}
}
public void parseDbInfo(ConnectInfo connectInfo) {
}
private final LimitHandler limit=new LimitOffsetLimitHandler();
@Override
public LimitHandler getLimitHandler() {
return limit;
}
}