abhrshのSeasarにっき

 | 

2004-08-01

[]reload

2.0.15でS2TestCaseにreloadメソッドが追加されました。私が以前提案したassertEquals(DataSet, DataSource)より使いやすそうです。

ただ、日付の値があるとうまく動かなかったので、とりあえず勝手にこれを修正してみようと思います。

調査したところ、DataRowImpl#equals(Object)メソッド内のColumnType#doEquals(Object, Object)の結果が怪しいので、ColumnTypeを正しく設定すれば良さそうだと思いました。

具体的には、DataTableImpl#setMetaData(DatabaseMetaData)メソッドでColumnTypeを更新してしまおうと思ってます。

そのための準備としてまず、DataColumnインターフェースに以下のメソッドを追加します。(DataColumnImplクラスに実装)

public void setColumnType(ColumnType);

次に、DatabaseMetaDataUtilにカラムのタイプを取得するメソッドを追加します。

public static Map getColumnTypeMap(DatabaseMetaData dbMetaData, String tableName) {
    tableName = convertIdentifier(dbMetaData, tableName);
    int index = tableName.indexOf('.');
    if (index >= 0) {
        tableName = tableName.substring(index + 1);
    }
    Map map = new HashMap();
    try {
        ResultSet rs = dbMetaData.getColumns(null, null, tableName, null);
        while (rs.next()) {
            map.put(rs.getString(4), new Integer(rs.getInt(5)));
        }
        rs.close();
    } catch (SQLException ex) {
        throw new SQLRuntimeException(ex);
    }
    return map;
}

このメソッドが返すMapには{カラム名:String, タイプ:Integer}が入っています。

そして、DataTableImpl#setMetaData(DatabaseMetaData)を以下のように修正します。

public void setupMetaData(DatabaseMetaData dbMetaData) {
    Set primaryKeySet = DatabaseMetaDataUtil.getPrimaryKeySet(dbMetaData,
            tableName_);
    Map columnTypeMap = DatabaseMetaDataUtil.getColumnTypeMap(dbMetaData,
            tableName_);
    for (int i = 0; i < getColumnSize(); ++i) {
        DataColumn column = getColumn(i);
        if (primaryKeySet.contains(column.getColumnName())) {
            column.setPrimaryKey(true);
        } else {
            column.setPrimaryKey(false);
        }
        if (columnTypeMap.containsKey(column.getColumnName())) {
            column.setWritable(true);
            Integer type = (Integer) columnTypeMap.get(column.getColumnName());
            column.setColumnType(ColumnTypes.getColumnType(type.intValue()));
        } else {
            column.setWritable(false);
        }
    }
    hasMetaData_ = true;
}

修正個所はcolumnTypeMapを取得する部分と、column.setColumnType()の部分です。

これで修正は終わりです。自分の環境では日付が含まれていてもちゃんとテストが通りました。

今回はColumnTypeを変更したかったのでDataColumnのインターフェースを変えてしまいました。

こんな方法で良いのかは分かりませんが、ColumnTypeが設定されるように修正してもらえないでしょうか>ひがさん

トラックバック - http://seasarproject.g.hatena.ne.jp/abhrsh/20040801
 |