package ca.sqlpower.sql; import ca.sqlpower.sqlobject.SQLType; import java.sql.Connection; import java.sql.Types; /** * A class that converts JDBC result set metadata sql types into names * that can be used to create and alter columns in a specific * database. * * @author Jonathan Fuerth * @version $Id$ */ public abstract class SqlTypeConverter { public static SqlTypeConverter getInstance(Connection con) { if (con.getClass().getName().indexOf("postgresql") >= 0) { return new PostgreSQLTypeConverter(); } else if (con.getClass().getName().indexOf("SQLServer") >= 0) { return new SQLServerTypeConverter(); } else { throw new UnsupportedOperationException("Unknown database type for driver " +con.getClass().getName()); } } /** * A generic type converter. May not work with any database at * all, but provides (what I hope is) a maximally standard set of * defaults. This way, subclasses will be kept as small as * possible. */ public String convertType(int sqlType, int precision, int scale) { switch (sqlType) { case Types.CHAR: return "CHARACTER("+precision+")"; case SQLType.NCHAR: return "NCHAR("+precision+")"; case Types.DATE: return "DATE"; case Types.DECIMAL: case Types.INTEGER: case Types.SMALLINT: case Types.TINYINT: return "DECIMAL("+precision+")"; case Types.DOUBLE: case Types.FLOAT: case Types.NUMERIC: case Types.REAL: return "NUMBER("+precision+","+scale+")"; case Types.TIME: return "TIME"; case Types.TIMESTAMP: return "TIMESTAMP"; case Types.VARCHAR: return "VARCHAR("+precision+")"; case SQLType.NVARCHAR: return "NVARCHAR("+precision+")"; // we don't try to provide generic defaults for these types case Types.ARRAY: case Types.BIGINT: case Types.BINARY: case Types.BIT: case Types.BLOB: //case Types.BOOLEAN: JDBC 3 case Types.CLOB: //case Types.DATALINK: JDBC 3 case Types.DISTINCT: case Types.JAVA_OBJECT: case Types.LONGVARBINARY: case Types.LONGVARCHAR: case Types.NULL: case Types.OTHER: case Types.REF: case Types.STRUCT: case Types.VARBINARY: default: throw new UnsupportedOperationException ("SQL Type "+sqlType+" is not implemented for this database."); } } }