package org.hivedb.util.database; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.sql.Types; import java.util.Date; import org.hivedb.HiveRuntimeException; public class JdbcTypeMapper { public static String BIGINT = "BIGINT"; public static String CHAR = "CHAR"; public static String DATE = "DATETIME"; public static String DOUBLE = "DOUBLE"; public static String FLOAT = "FLOAT"; public static String INTEGER = "INTEGER"; public static String SMALLINT = "SMALLINT"; public static String TIMESTAMP = "TIMESTAMP"; public static String TINYINT = "TINYINT"; public static String VARCHAR = "VARCHAR"; public static String jdbcTypeToString(int jdbcType) { switch (jdbcType) { case Types.BIGINT: return BIGINT; case Types.CHAR: return CHAR; case Types.DATE: return DATE; case Types.DOUBLE: return DOUBLE; case Types.FLOAT: return FLOAT; case Types.INTEGER: return INTEGER; case Types.SMALLINT: return SMALLINT; case Types.TINYINT: return TINYINT; case Types.TIMESTAMP: return TIMESTAMP; case Types.VARCHAR: return VARCHAR; } throw new HiveRuntimeException("No known JDBC type: " + jdbcType, null); } public static int parseJdbcType(String dbString) { String upperDbString = dbString.toUpperCase(); if (BIGINT.equals(upperDbString)) return Types.BIGINT; if (CHAR.equals(upperDbString)) return Types.CHAR; if (DATE.equals(upperDbString)) return Types.DATE; if (DOUBLE.equals(upperDbString)) return Types.DOUBLE; if (FLOAT.equals(upperDbString)) return Types.FLOAT; if (INTEGER.equals(upperDbString)) return Types.INTEGER; if (SMALLINT.equals(upperDbString)) return Types.SMALLINT; if (TIMESTAMP.equals(upperDbString)) return Types.TIMESTAMP; if (TINYINT.equals(upperDbString)) return Types.TINYINT; if (VARCHAR.equals(upperDbString)) return Types.VARCHAR; throw new HiveRuntimeException("No known JDBC type: " + upperDbString); } public static int primitiveTypeToJdbcType(Class<?> classType) { if (classType.equals(int.class) || classType.equals(Integer.class)) return Types.INTEGER; if (classType.equals(short.class) || classType.equals(Short.class)) return Types.SMALLINT; if (classType.equals(long.class) || classType.equals(Long.class)) return Types.BIGINT; if (classType.equals(float.class) || classType.equals(Float.class)) return Types.FLOAT; if (classType.equals(double.class) || classType.equals(Double.class)) return Types.DOUBLE; if (classType.equals(String.class)) return Types.VARCHAR; if (classType.equals(Date.class)) return Types.DATE; if (classType.equals(Timestamp.class)) return Types.TIMESTAMP; if (classType.equals(char.class) || classType.equals(Character.class)) return Types.CHAR; throw new HiveRuntimeException("No known database type for class " + classType.getCanonicalName(), null); } public static Class jdbcTypeToPrimitiveClass(Integer jdbcType) { if (jdbcType.equals(Types.INTEGER)) return Integer.class; if (jdbcType.equals(Types.SMALLINT)) return Short.class; if (jdbcType.equals(Types.BIGINT)) return Long.class; if (jdbcType.equals(Types.FLOAT)) return Float.class; if (jdbcType.equals(Types.DOUBLE)) return Double.class; if (jdbcType.equals(Types.VARCHAR)) return String.class; if (jdbcType.equals(Types.DATE)) return Date.class; if (jdbcType.equals(Types.TIMESTAMP)) return Timestamp.class; if (jdbcType.equals(Types.CHAR)) return Character.class; throw new HiveRuntimeException("No known database type for class " + jdbcType); } public static void insertJdbcTypeParameter( PreparedStatement preparedStatement, int index, Object value) throws SQLException { Class classType = value.getClass(); if (classType.equals(int.class) || classType.equals(Integer.class)) preparedStatement.setInt(index, (Integer) value); if (classType.equals(short.class) || classType.equals(Short.class)) preparedStatement.setShort(index, (Short) value); else if (classType.equals(long.class) || classType.equals(Long.class)) preparedStatement.setLong(index, (Long) value); else if (classType.equals(float.class) || classType.equals(Float.class)) preparedStatement.setFloat(index, (Float) value); else if (classType.equals(double.class) || classType.equals(Double.class)) preparedStatement.setDouble(index, (Double) value); else if (classType.equals(String.class)) preparedStatement.setString(index, (String) value); else if (classType.equals(Date.class)) preparedStatement.setDate(index, new java.sql.Date(((Date) value) .getTime())); else if (classType.equals(Timestamp.class)) preparedStatement.setTimestamp(index, (Timestamp) value); else if (classType.equals(char.class) || classType.equals(Character.class)) preparedStatement.setString(index, value.toString()); else if (classType.equals(boolean.class) || classType.equals(Boolean.class)) preparedStatement.setBoolean(index, (Boolean) value); else throw new HiveRuntimeException("No known database type for class " + classType.getCanonicalName(), null); } /** * This method exists instead of use resultSet.getObject() to give us more * control over the resulting Java type * * @param resultSet * @param index * @param jdbcType * @return * @throws HiveException * @throws SQLException */ public static Object getJdbcTypeResult(ResultSet resultSet, int index, int jdbcType) throws SQLException { switch (jdbcType) { case Types.BIGINT: return resultSet.getLong(index); case Types.CHAR: String str = resultSet.getString(index); return (str.length() == 1) ? str.toCharArray()[0] : null; case Types.DATE: return new Date(resultSet.getDate(index).getTime()); case Types.DOUBLE: return resultSet.getDouble(index); case Types.FLOAT: return resultSet.getFloat(index); case Types.INTEGER: return resultSet.getInt(index); case Types.SMALLINT: return resultSet.getShort(index); case Types.TIMESTAMP: return new Date(resultSet.getTime(index).getTime()); case Types.VARCHAR: return resultSet.getString(index); } throw new HiveRuntimeException("No known JDBC type: " + jdbcType, null); } }