package prefuse.data.io.sql; import java.math.BigDecimal; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.Date; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.sql.Types; import prefuse.data.Table; /** * Default data value handler for mapping SQL data types to Java objects. * Performs a straightforward mapping of common SQL data types to Java * primitives or objects. * * @author <a href="http://jheer.org">jeffrey heer</a> */ public class DefaultSQLDataHandler implements SQLDataHandler { private boolean m_ignoreUnknownTypes; // ------------------------------------------------------------------------ /** * Create a new DefaultSQLDataHandler. */ public DefaultSQLDataHandler() { this(true); } /** * Create a new DefaultSQLDataHandler. * @param ignoreUnknownTypes instructs the data handler whether or not * unknown or unrecognized SQL data types should simply be ignored */ public DefaultSQLDataHandler(boolean ignoreUnknownTypes) { m_ignoreUnknownTypes = ignoreUnknownTypes; } // ------------------------------------------------------------------------ /** * Set if unknown or unrecognized SQL data types should simply be ignored. * @param ignore the ignore unknown types setting to use */ public void setIgnoreUnknownTypes(boolean ignore) { m_ignoreUnknownTypes = ignore; } /** * Indicates if unknown or unrecognized SQL data types should simply be * ignored. * @return the ignore unknown types setting */ public boolean isIgnoreUnknownTypes() { return m_ignoreUnknownTypes; } // ------------------------------------------------------------------------ /** * @see prefuse.data.io.sql.SQLDataHandler#process(prefuse.data.Table, int, java.sql.ResultSet, int) */ public void process(Table t, int trow, ResultSet rset, int rcol) throws SQLException { ResultSetMetaData metadata = rset.getMetaData(); String field = metadata.getColumnName(rcol); int type = metadata.getColumnType(rcol); switch ( type ) { case Types.ARRAY: t.set(trow, field, rset.getArray(rcol)); break; case Types.BIGINT: t.setLong(trow, field, rset.getLong(rcol)); break; case Types.BINARY: case Types.LONGVARBINARY: case Types.VARBINARY: t.set(trow, field, rset.getBytes(rcol)); break; case Types.BIT: case Types.BOOLEAN: t.setBoolean(trow, field, rset.getBoolean(rcol)); break; case Types.BLOB: t.set(trow, field, rset.getBlob(rcol)); break; case Types.CHAR: case Types.LONGVARCHAR: case Types.VARCHAR: t.setString(trow, field, rset.getString(rcol)); break; case Types.CLOB: t.set(trow, field, rset.getClob(rcol)); break; case Types.DATE: t.setDate(trow, field, rset.getDate(rcol)); break; case Types.DECIMAL: case Types.DOUBLE: case Types.FLOAT: case Types.NUMERIC: t.setDouble(trow, field, rset.getDouble(rcol)); break; case Types.INTEGER: case Types.SMALLINT: case Types.TINYINT: t.setInt(trow, field, rset.getInt(rcol)); break; case Types.JAVA_OBJECT: t.set(trow, field, rset.getObject(rcol)); break; case Types.REAL: t.setFloat(trow, field, rset.getFloat(rcol)); break; case Types.REF: t.set(trow, field, rset.getRef(rcol)); break; case Types.TIME: t.setDate(trow, field, rset.getTime(rcol)); break; case Types.TIMESTAMP: t.setDate(trow, field, rset.getTimestamp(rcol)); break; case Types.DATALINK: case Types.DISTINCT: case Types.NULL: case Types.OTHER: case Types.STRUCT: default: if ( !m_ignoreUnknownTypes ) { t.set(trow, field, rset.getObject(rcol)); } break; } } /** * @see prefuse.data.io.sql.SQLDataHandler#getDataType(java.lang.String, int) */ public Class getDataType(String columnName, int sqlType) { switch ( sqlType ) { case Types.ARRAY: return Array.class; case Types.BIGINT: return long.class; case Types.BINARY: case Types.LONGVARBINARY: case Types.VARBINARY: return byte[].class; case Types.BIT: case Types.BOOLEAN: return boolean.class; case Types.BLOB: return Blob.class; case Types.CHAR: case Types.LONGVARCHAR: case Types.VARCHAR: return String.class; case Types.CLOB: return Clob.class; case Types.DATE: return Date.class; case Types.DECIMAL: case Types.NUMERIC: return BigDecimal.class; case Types.DOUBLE: case Types.FLOAT: return double.class; case Types.INTEGER: case Types.SMALLINT: case Types.TINYINT: return int.class; case Types.JAVA_OBJECT: return Object.class; case Types.REAL: return float.class; case Types.REF: return Ref.class; case Types.TIME: return Time.class; case Types.TIMESTAMP: return Timestamp.class; case Types.DATALINK: case Types.DISTINCT: case Types.NULL: case Types.OTHER: case Types.STRUCT: default: if ( !m_ignoreUnknownTypes ) { return Object.class; } else { return null; } } } } // end of class DefaultSQLDataValueHandler