package org.oddjob.sql;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import org.apache.log4j.Logger;
/**
* The simplest most generic dialect. The default that {@link SQLJob}
* uses.
*
* @author rob
*
*/
public class BasicGenericDialect implements DatabaseDialect {
private static final Logger logger = Logger.getLogger(BasicGenericDialect.class);
private ClassLoader classLoader;
@Override
public ResultSetExtractor resultSetExtractorFor(
final ResultSet resultSet)
throws SQLException {
ResultSetMetaData metaData = resultSet.getMetaData();
final int columnCount = metaData.getColumnCount();
final Class<?>[] columnTypes = new Class<?>[columnCount];
final String[] columnNames = new String[columnCount];
ClassLoader classLoader = this.classLoader;
if (classLoader == null) {
classLoader = metaData.getClass().getClassLoader();
}
for (int i = 0; i < columnCount ; ++i) {
columnNames[i] = metaData.getColumnName(i + 1);
String typeName = metaData.getColumnClassName(i + 1);
try {
columnTypes[i] = Class.forName(typeName, true, classLoader);
} catch (ClassNotFoundException e) {
logger.warn("Can't Load Class " + typeName + ", defaulting to Object.");
}
}
if (logger.isDebugEnabled()) {
StringBuilder message = new StringBuilder("Columns and Types:");
for (int i = 0; i < columnCount; ++i) {
if (i > 0) {
message.append(", ");
}
message.append(columnNames[i]);
message.append("=");
message.append(columnTypes[i].getName());
}
logger.debug(message.toString());
}
return new ResultSetExtractor() {
@Override
public Class<?> getColumnType(int columnIndex) {
return columnTypes[columnIndex - 1];
}
@Override
public Object getColumn(int columnIndex) throws SQLException {
return resultSet.getObject(columnIndex);
}
@Override
public int getColumnCount() {
return columnCount;
}
@Override
public String getColumnName(int columnIndex) {
return columnNames[columnIndex - 1];
}
@Override
public boolean next() throws SQLException {
return resultSet.next();
}
};
}
public ClassLoader getClassLoader() {
return classLoader;
}
public void setClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
}