/**************************************************************************************
* Copyright (C) 2008 EsperTech, Inc. All rights reserved. *
* http://esper.codehaus.org *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package com.espertech.esper.util;
import java.sql.Types;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* Utility for mapping SQL types of {@link java.sql.Types} to Java classes.
*/
public class SQLTypeMapUtil
{
private static Map<String, Integer> sqlTypeMap;
static {
sqlTypeMap = new HashMap<String, Integer>();
sqlTypeMap.put("BIT", Types.BIT);
sqlTypeMap.put("TINYINT", Types.TINYINT);
sqlTypeMap.put("SMALLINT", Types.SMALLINT );
sqlTypeMap.put("INTEGER",Types.INTEGER);
sqlTypeMap.put("BIGINT", Types.BIGINT);
sqlTypeMap.put("FLOAT",Types.FLOAT);
sqlTypeMap.put("REAL",Types.REAL);
sqlTypeMap.put("DOUBLE",Types.DOUBLE);
sqlTypeMap.put("NUMERIC",Types.NUMERIC);
sqlTypeMap.put("DECIMAL",Types.DECIMAL);
sqlTypeMap.put("CHAR",Types.CHAR);
sqlTypeMap.put("VARCHAR", Types.VARCHAR);
sqlTypeMap.put("LONGVARCHAR", Types.LONGVARCHAR);
sqlTypeMap.put("DATE", Types.DATE);
sqlTypeMap.put("TIME", Types.TIME);
sqlTypeMap.put("TIMESTAMP", Types.TIMESTAMP);
sqlTypeMap.put("BINARY", Types.BINARY);
sqlTypeMap.put("VARBINARY", Types.VARBINARY);
sqlTypeMap.put("LONGVARBINARY", Types.LONGVARBINARY);
sqlTypeMap.put("NULL",Types.NULL);
sqlTypeMap.put("OTHER", Types.OTHER);
sqlTypeMap.put("JAVA_OBJECT", Types.JAVA_OBJECT);
sqlTypeMap.put("DISTINCT", Types.DISTINCT);
sqlTypeMap.put("STRUCT", Types.STRUCT);
sqlTypeMap.put("ARRAY", Types.ARRAY);
sqlTypeMap.put("BLOB", Types.BLOB);
sqlTypeMap.put("CLOB", Types.CLOB);
sqlTypeMap.put("REF", Types.REF);
sqlTypeMap.put("DATALINK", Types.DATALINK);
sqlTypeMap.put("BOOLEAN", Types.BOOLEAN);
}
/**
* Mapping as defined by JDBC 3 Spec , page B-177, table B-1 JBDC Types mapped to Java Types.
* @param sqlType to return Java class for
* @param className is the classname that result metadata returns for a column
* @return Java class for JDBC sql types
*/
public static Class sqlTypeToClass(int sqlType, String className)
{
if ((sqlType == Types.BOOLEAN) ||
(sqlType == Types.BIT))
{
return Boolean.class;
}
if ((sqlType == Types.CHAR) ||
(sqlType == Types.VARCHAR) ||
(sqlType == Types.LONGVARCHAR))
{
return String.class;
}
if ((sqlType == Types.CHAR) ||
(sqlType == Types.VARCHAR))
{
return String.class;
}
if ((sqlType == Types.DOUBLE) ||
(sqlType == Types.FLOAT))
{
return Double.class;
}
if (sqlType == Types.REAL)
{
return Float.class;
}
if (sqlType == Types.INTEGER)
{
return Integer.class;
}
if (sqlType == Types.BIGINT)
{
return Long.class;
}
if (sqlType == Types.TINYINT)
{
return Byte.class;
}
if (sqlType == Types.SMALLINT)
{
return Short.class;
}
if ((sqlType == Types.NUMERIC) ||
(sqlType == Types.DECIMAL))
{
return BigDecimal.class;
}
if ((sqlType == Types.BINARY) ||
(sqlType == Types.VARBINARY) ||
(sqlType == Types.LONGVARBINARY))
{
return byte[].class;
}
if (sqlType == Types.DATE)
{
return java.sql.Date.class;
}
if (sqlType == Types.TIME)
{
return java.sql.Time.class;
}
if (sqlType == Types.TIMESTAMP)
{
return java.sql.Timestamp.class;
}
if (sqlType == Types.CLOB)
{
return java.sql.Clob.class;
}
if (sqlType == Types.BLOB)
{
return java.sql.Blob.class;
}
if (sqlType == Types.ARRAY)
{
return java.sql.Array.class;
}
if (sqlType == Types.STRUCT)
{
return java.sql.Struct.class;
}
if (sqlType == Types.REF)
{
return java.sql.Ref.class;
}
if (sqlType == Types.DATALINK)
{
return java.net.URL.class;
}
if ((sqlType == Types.JAVA_OBJECT) ||
(sqlType == Types.DISTINCT))
{
if (className == null)
{
throw new IllegalArgumentException("No class supplied for sql type " + sqlType);
}
try
{
ClassLoader cl = Thread.currentThread().getContextClassLoader();
return Class.forName(className, true, cl);
}
catch (ClassNotFoundException e)
{
throw new IllegalArgumentException("Cannot load class for sql type " + sqlType + " and class " + className);
}
}
throw new IllegalArgumentException("Cannot map java.sql.Types type " + sqlType);
}
/**
* Returns the SQL type by type name.
* @param type sql type name
* @return type sql type
*/
public static int getSQLTypeByName(String type)
{
Integer val = sqlTypeMap.get(type.toUpperCase());
if (val != null) {
return val;
}
throw new RuntimeException("Type by name '" + type + "' is not a recognized java.sql.Types type");
}
}