package nebula.data.db; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import nebula.lang.RawTypes; /* * 根据内部类型构建实际DB类型的字段说明 */ public class TypeNames { private Map<RawTypes, Map<Integer, String>> weighted = new HashMap<RawTypes, Map<Integer, String>>(); private Map<RawTypes, String> defaults = new HashMap<RawTypes, String>(); public String get(RawTypes typecode) { String result = defaults.get( typecode ); if (result==null) throw new RuntimeException("No Dialect mapping for JDBC type: " + typecode); return result; } public String get(RawTypes typeCode, int size, int precision, int scale) { Map<Integer, String> map = weighted.get( typeCode ); if ( map!=null && map.size()>0 ) { // iterate entries ordered by capacity to find first fit for (Map.Entry<Integer, String> entry: map.entrySet()) { if ( size <= entry.getKey() ) { return replace( entry.getValue(), size, precision, scale ); } } } return replace( get(typeCode), size, precision, scale ); } private static String replace(String type, int size, int precision, int scale) { type = type.replaceFirst("$s", Integer.toString(scale) ); type = type.replaceFirst("$l", Long.toString(size) ); return type.replaceFirst("$p", Integer.toString(precision) ); } public void put(RawTypes typecode, int capacity, String value) { Map<Integer, String> map = weighted.get( typecode ); if (map == null) {// add new ordered map map = new TreeMap<Integer, String>(); weighted.put( typecode, map ); } map.put(capacity, value); } public void put(RawTypes typecode, String value) { defaults.put( typecode, value ); } }