package com.eas.sqldrivers.resolvers;
import com.eas.client.metadata.JdbcField;
import com.eas.client.sqldrivers.resolvers.TypesResolver;
import com.eas.script.Scripts;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
/**
*
* @author kl
*/
public class Db2TypesResolver implements TypesResolver {
protected static final Map<String, String> rdbmsTypes2ApplicationTypes = new LinkedHashMap<>();
protected static final Set<String> jdbcTypesWithSize = new HashSet<>();
protected static final Set<String> jdbcTypesWithScale = new HashSet<>();
private static final Map<String, Integer> jdbcTypesMaxSize = new HashMap<>();
private static final Map<String, Integer> jdbcTypesDefaultSize = new HashMap<>();
static {
rdbmsTypes2ApplicationTypes.put("VARCHAR", Scripts.STRING_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("NUMERIC", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("DECIMAL", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("TIMESTAMP", Scripts.DATE_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("INT", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("SMALLINT", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("INTEGER", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("BIGINT", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("DEC", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("NUM", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("FLOAT", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("REAL", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("DOUBLE", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("DOUBLE PRECISION", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("DECFLOAT", Scripts.NUMBER_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("LONG VARCHAR", Scripts.STRING_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("CHAR", Scripts.STRING_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("CHARACTER", Scripts.STRING_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("CHAR VARYING", Scripts.STRING_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("CHARACTER VARYING", Scripts.STRING_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("CLOB", Scripts.STRING_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("CHAR LARGE OBJECT", Scripts.STRING_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("CHARACTER LARGE OBJECT", Scripts.STRING_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("DATE", Scripts.DATE_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("TIME", Scripts.DATE_TYPE_NAME);
rdbmsTypes2ApplicationTypes.put("XML", Scripts.STRING_TYPE_NAME); //?? OTHER || SQLXML || BLOB
rdbmsTypes2ApplicationTypes.put("BLOB", null);
rdbmsTypes2ApplicationTypes.put("BINARY LARGE OBJECT", null);
rdbmsTypes2ApplicationTypes.put("LONG VARCHAR FOR BIT DATA", null);
jdbcTypesWithScale.add("DECIMAL");
jdbcTypesWithScale.add("DEC");
jdbcTypesWithScale.add("NUMERIC");
jdbcTypesWithScale.add("NUM");
jdbcTypesWithSize.add("DECIMAL");
jdbcTypesWithSize.add("DEC");
jdbcTypesWithSize.add("NUMERIC");
jdbcTypesWithSize.add("NUM");
jdbcTypesWithSize.add("CHAR");
jdbcTypesWithSize.add("CHARACTER");
jdbcTypesWithSize.add("VARCHAR");
jdbcTypesWithSize.add("CHAR VARYING");
jdbcTypesWithSize.add("CHARACTER VARYING");
jdbcTypesWithSize.add("CLOB");
jdbcTypesWithSize.add("CHAR LARGE OBJECT");
jdbcTypesWithSize.add("CHARACTER LARGE OBJECT");
jdbcTypesWithSize.add("BLOB");
jdbcTypesWithSize.add("BINARY LARGE OBJECT");
// max sizes for types
jdbcTypesMaxSize.put("CHAR", 254);
jdbcTypesMaxSize.put("CHARACTER", 254);
jdbcTypesMaxSize.put("VARCHAR", 4000);
jdbcTypesMaxSize.put("CHAR VARYING", 4000);
jdbcTypesMaxSize.put("CHARACTER VARYING", 4000);
// default sizes for types
jdbcTypesDefaultSize.put("CHAR", 1);
jdbcTypesDefaultSize.put("CHARACTER", 1);
jdbcTypesDefaultSize.put("VARCHAR", 200);
jdbcTypesDefaultSize.put("CHAR VARYING", 200);
jdbcTypesDefaultSize.put("CHARACTER VARYING", 200);
jdbcTypesDefaultSize.put("CLOB", 2147483647);
jdbcTypesDefaultSize.put("CHAR LARGE OBJECT", 2147483647);
jdbcTypesDefaultSize.put("CHARACTER LARGE OBJECT", 2147483647);
jdbcTypesDefaultSize.put("BLOB", 2147483647);
jdbcTypesDefaultSize.put("BINARY LARGE OBJECT", 2147483647);
}
@Override
public String toApplicationType(int aJdbcType, String aRDBMSType) {
return aRDBMSType != null ? rdbmsTypes2ApplicationTypes.get(aRDBMSType.toUpperCase()) : null;
}
@Override
public Set<String> getSupportedTypes() {
return Collections.unmodifiableSet(rdbmsTypes2ApplicationTypes.keySet());
}
@Override
public boolean isSized(String aRDBMSType) {
return jdbcTypesWithSize.contains(aRDBMSType.toUpperCase());
}
@Override
public boolean isScaled(String aRDBMSType) {
return jdbcTypesWithScale.contains(aRDBMSType.toUpperCase());
}
@Override
public void resolveSize(JdbcField aField) {
String sqlTypeName = aField.getType();
if (sqlTypeName != null) {
sqlTypeName = sqlTypeName.toUpperCase();
// check on max size
int fieldSize = aField.getSize();
Integer maxSize = jdbcTypesMaxSize.get(sqlTypeName);
if (maxSize != null && maxSize < fieldSize) {
aField.setSize(maxSize);
}
// check on default size
if (fieldSize <= 0 && jdbcTypesDefaultSize.containsKey(sqlTypeName)) {
aField.setSize(jdbcTypesDefaultSize.get(sqlTypeName));
}
}
}
}