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 mg */ public class MySqlTypesResolver implements TypesResolver { protected static final Map<String, String> rdbmsTypes2ApplicationTypes = new LinkedHashMap<>(); protected static final int MAXIMUM_NUMBERS_PRECISION = 65; 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("int", Scripts.NUMBER_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("decimal", Scripts.NUMBER_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("boolean", Scripts.BOOLEAN_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("timestamp", Scripts.DATE_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("datetime", Scripts.DATE_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("geometry", Scripts.GEOMETRY_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("tinyint", Scripts.NUMBER_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("smallint", Scripts.NUMBER_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("mediumint", Scripts.NUMBER_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("integer", Scripts.NUMBER_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("bigint", Scripts.NUMBER_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("serial", 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("dec", Scripts.NUMBER_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("numeric", Scripts.NUMBER_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("bool", Scripts.BOOLEAN_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("bit", Scripts.BOOLEAN_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("char", Scripts.STRING_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("tinytext", Scripts.STRING_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("long varchar", Scripts.STRING_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("text", Scripts.STRING_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("mediumtext", Scripts.STRING_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("longtext", Scripts.STRING_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("date", Scripts.DATE_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("time", Scripts.DATE_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("year", Scripts.DATE_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("enum", Scripts.STRING_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("set", Scripts.STRING_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("binary", null); rdbmsTypes2ApplicationTypes.put("varbinary", null); rdbmsTypes2ApplicationTypes.put("tinyblob", null); rdbmsTypes2ApplicationTypes.put("blob", null); rdbmsTypes2ApplicationTypes.put("mediumblob", null); rdbmsTypes2ApplicationTypes.put("longblob", null); rdbmsTypes2ApplicationTypes.put("long varbinary", null); // gis types rdbmsTypes2ApplicationTypes.put("point", Scripts.GEOMETRY_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("linestring", Scripts.GEOMETRY_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("polygon", Scripts.GEOMETRY_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("multipoint", Scripts.GEOMETRY_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("multilinestring", Scripts.GEOMETRY_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("multipolygon", Scripts.GEOMETRY_TYPE_NAME); rdbmsTypes2ApplicationTypes.put("geometrycollection", Scripts.GEOMETRY_TYPE_NAME); //typeName(M,D) jdbcTypesWithScale.add("float"); jdbcTypesWithScale.add("real"); jdbcTypesWithScale.add("double"); jdbcTypesWithScale.add("double precision"); jdbcTypesWithScale.add("numeric"); jdbcTypesWithScale.add("decimal"); jdbcTypesWithScale.add("dec"); //typeName(M) jdbcTypesWithSize.add("float"); jdbcTypesWithSize.add("real"); jdbcTypesWithSize.add("double"); jdbcTypesWithSize.add("double precision"); jdbcTypesWithSize.add("numeric"); jdbcTypesWithSize.add("decimal"); jdbcTypesWithSize.add("dec"); jdbcTypesWithSize.add("char"); jdbcTypesWithSize.add("varchar"); jdbcTypesWithSize.add("binary"); jdbcTypesWithSize.add("varbinary"); // max sizes for types // ??? numeric ???? jdbcTypesMaxSize.put("char", 255); jdbcTypesMaxSize.put("varchar", 65535); jdbcTypesMaxSize.put("tinytext", 255); jdbcTypesMaxSize.put("text", 65535); jdbcTypesMaxSize.put("mediumtext", 16777215); jdbcTypesMaxSize.put("longvarchar", 16777215); jdbcTypesMaxSize.put("longtext", 2147483647); jdbcTypesMaxSize.put("binary", 255); jdbcTypesMaxSize.put("varbinary", 255); jdbcTypesMaxSize.put("long varbinary", 16777215); jdbcTypesMaxSize.put("tinyblob", 255); jdbcTypesMaxSize.put("blob", 65535); jdbcTypesMaxSize.put("mediumblob", 16777215); jdbcTypesMaxSize.put("longblob", 2147483647); //????? изменить Field.setSize(Long) //????? jdbcTypesMaxSize.put(Types.VARCHAR,4294967295); //????? jdbcTypesMaxSize.put(Types.NVARCHAR,4294967295); //????? jdbcTypesMaxSize.put(Types.VARBINARY,4294967295); // default sizes for types ?????????????????????????????????????????????? jdbcTypesDefaultSize.put("char", 1); jdbcTypesDefaultSize.put("varchar", 200); jdbcTypesDefaultSize.put("binary", 1); jdbcTypesDefaultSize.put("varbinary", 200); } @Override public String toApplicationType(int aJdbcType, String aRDBMSType) { return aRDBMSType != null ? rdbmsTypes2ApplicationTypes.get(aRDBMSType.toLowerCase()) : null; } @Override public Set<String> getSupportedTypes() { return Collections.unmodifiableSet(rdbmsTypes2ApplicationTypes.keySet()); } @Override public boolean isSized(String aRDBMSType) { return jdbcTypesWithSize.contains(aRDBMSType.toLowerCase()); } @Override public boolean isScaled(String aRDBMSType) { return jdbcTypesWithScale.contains(aRDBMSType.toLowerCase()); } @Override public void resolveSize(JdbcField aField) { String sqlTypeName = aField.getType(); if (sqlTypeName != null) { sqlTypeName = sqlTypeName.toLowerCase(); // 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)); } } } }