2008年2月28日木曜日

DBUnitとPostgreSQLとbit型

DBUnitとPostgreSQLでbit型が存在するとうまく動かない。どうやらPreparedStatementがbit型をbool型として扱うようで困った。がしかし、今回はやらねばならないのです。

で、jdbcのソースを読んだらjava.sql.Types.OTHERとorg.postgresql.util.PGobjectの組み合わせで回避できそうだったので実装しみました。データの取得にはResultSet#getString(int)を使用して文字列を取得できます。登録などではStatement#setObject(int, Object, int)を使用してPGobjectインスタンスを渡しています。

public class BitDataType extends AbstractDataType {
public BitDataType(String name, int sqlType) {
super("bit", Types.OTHER, String.class, false);
}

public Object typeCast(Object value) throws TypeCastException {
if (value == null) {
return null;
}
PGobject obj = new PGobject()
obj.setType("bit");
obj.setValue(value.toString());
return obj;
}

public Object getSqlValue(int column, ResultSet resultSet)
throws SQLException, TypeCastException {
return resultSet.getString(column);
}

}

public class PostgresqlDataTypeFactory extends DefaultDataTypeFactory {
private static final DataType BIT = new BitDataType();
public DataType createDataType(int sqlType, String sqlTypeName)
throws DataTypeException {
if ("bit".equals(sqlTypeName)) {
return BIT;
}
return super.createDataType(sqlType, sqlTypeName);
}
}