NetBeans 6.7のソースコードを落としてパッチ当ててみた その2

データベースウインドウのバグ2箇所のうち一つ目は前回修正できた。

今回は2つ目、データの保存処理の不具合を直してみる。

これはソースを読んではじめてわかったバグ。普通に触る分には気がつきにくい。
http://d.hatena.ne.jp/shin/20090609/p2


わかりやすくまとめると以下の2つ

  • BIGINTはLongで読み込み、Longでバリデーションをしているのに保存時にはBigDecimalを使用(弊害は特にないが)
  • DECIMALはBigDecimalで読み込み、BigDecimalでバリデーションをしてるのに保存時はDouble(完全にアウト)

読み込みとバリデーションはちゃんとしてるのに保存時のコードだけ変というのがどうにも腑に落ちないが、実際にそういうコードなので修正するしかない。

まず不具合を確認してみよう。

PostgreSQLはDECIMAL型がないので(PostgreSQLJDBCドライバのDECIMALはNUMERICにマッピングされる)動作確認ができない。そこで、今回はJavaDB(Derby)を利用する。

30桁のDECIMAL型を作成。

そして入力していく。20桁の数値を入れてみた。

保存しても画面はそのままなので不具合が発生したように見えない。


リフレッシュボタンや再検索をすると以下のようになる。

double型、つまり64bitIEEEフォーマットの浮動小数点は有効桁数が16桁だというのがよくわかる。
問題ありまくり。ほかにも精度誤差もあるし。


で、ここが問題のコード。クラスは前回と同じ「org.netbeans.modules.db.dataview.util.DBReadWriteHelper」。


これを以下のように修正する。


そして、実行。そしてリフレッシュ。

ちゃんと20桁保存された。

バグがちゃんと直ったのがわかりますね。