package jef.database.dialect.type;
import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
import jef.accelerator.bean.BeanAccessor;
import jef.accelerator.bean.FastBeanWrapperImpl;
import jef.database.Field;
import jef.database.IQueryableEntity;
import jef.database.ORMConfig;
import jef.database.dialect.ColumnType;
import jef.database.dialect.ColumnType.GUID;
import jef.database.meta.EntityType;
import jef.database.meta.ITableMetadata;
import jef.database.wrapper.clause.InsertSqlClause;
import jef.database.wrapper.processor.InsertStep.GUIDGenerateCallback;
import jef.database.wrapper.processor.InsertStep.SingleKeySetCallback;
import jef.tools.Assert;
import jef.tools.StringUtils;
import jef.tools.reflect.Property;
public class AutoGuidMapping extends VarcharStringMapping {
private boolean removeDash;
private Property accessor;
@Override
public void init(Field field, String columnName, ColumnType type, ITableMetadata meta) {
super.init(field, columnName, type, meta);
GUID cType = (GUID) type;
removeDash = cType.isRemoveDash();
// 初始化访问器
BeanAccessor ba = FastBeanWrapperImpl.getAccessorFor(meta.getThisType());
if(meta.getType()==EntityType.TUPLE){
Assert.isTrue(ba.getPropertyNames().contains(field.name()));
}
accessor = ba.getProperty(field.name());
}
public void processInsert(Object value, InsertSqlClause result, List<String> cStr, List<String> vStr, boolean smart, IQueryableEntity obj) throws SQLException {
String columnName = this.getColumnName(result.profile,true);
String key;
if (value != null && ORMConfig.getInstance().isManualSequence() && obj.isUsed(field)) {// 手动指定
key = String.valueOf(value);
} else {
key = UUID.randomUUID().toString();
if (removeDash)
key = StringUtils.remove(key, '-');
result.getCallback().addProcessor(new SingleKeySetCallback(accessor, key));
}
cStr.add(columnName);
vStr.add(String.valueOf(key));
}
@Override
public void processPreparedInsert(IQueryableEntity obj, List<String> cStr, List<String> vStr, InsertSqlClause result, boolean smart) {
String columnName = this.getColumnName(result.profile, true);
Object value = accessor.get(obj);
if (value != null && ORMConfig.getInstance().isManualSequence() && obj.isUsed(field)) {
//DO nothing
} else {
result.getCallback().addProcessor(new GUIDGenerateCallback(accessor, removeDash));
}
cStr.add(columnName);
vStr.add("?");
result.addField(this);
}
}