package org.oddjob.sql; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import org.apache.log4j.Logger; /** * A {@link ResultSetExtractor} that uses simple java types for most * column types. This was introduced for Oracle which uses it's own types * and this might not always be desirable. * <p> * This class is still a work in progress. * <p> * * @author rob * */ public class TypeBasedDialect implements DatabaseDialect { private static final Logger logger = Logger.getLogger(TypeBasedDialect.class); @Override public ResultSetExtractor resultSetExtractorFor(final ResultSet resultSet) throws SQLException { ResultSetMetaData metaData = resultSet.getMetaData(); final int columnCount = metaData.getColumnCount(); final ColumnExtractor<?>[] columnTypes = new ColumnExtractor[columnCount]; final String[] columnNames = new String[columnCount]; for (int i = 0; i < columnTypes.length; ++i) { int columnType = metaData.getColumnType(i + 1); ColumnExtractor<?> extractor = ColumnExtractor.getColumnExtractor(columnType); if (extractor == null) { extractor = ColumnExtractor.DEFAULT_EXTRACTOR; } columnTypes[i] = extractor; columnNames[i] = metaData.getColumnName(i + 1); } if (logger.isDebugEnabled()) { StringBuilder message = new StringBuilder("Columns and Types; Java Class, JDBC Sql Type, Database Type:\n"); for (int i = 0; i < columnCount; ++i) { message.append(columnNames[i]); message.append("="); message.append(columnTypes[i].getType().getName()); message.append(", "); message.append(ColumnExtractor.SQL_TYPE_NAMES.get( metaData.getColumnType(i + 1))); message.append(", "); message.append(metaData.getColumnTypeName(i + 1)); message.append("\n"); } logger.debug(message.toString()); } return new ResultSetExtractor() { @Override public Object getColumn(int columnIndex) throws SQLException { return columnTypes[columnIndex - 1].extract(resultSet, columnIndex); } @Override public Class<?> getColumnType(int columnIndex) { return columnTypes[columnIndex - 1].getType(); } @Override public String getColumnName(int columnIndex) { return columnNames[columnIndex - 1]; } @Override public int getColumnCount() { return columnCount; } @Override public boolean next() throws SQLException { return resultSet.next(); } }; } }