[seasar-dev:606] [S2Dao.NET]正常なのにWarnログが発生する。

kubo jazzflute @ mbn.nifty.com
2006年 11月 16日 (木) 18:11:22 JST


久保です。

.NETチームの皆様方へ

実は業務の方で、S2Dao.NETで「正常なのにWarnログが発生する」という
現象を確認しています。ちょっと優先度を下げていたのですが、
夜間バッチとかで大量のWARNログが発生してしまうので、どうにかしたい
と考えておりました。

現象と原因を追究してみました。

現象
  A. 埋め込み変数コメントで{.}つなぎを使うと発生{dto.xxx}
  B. IFコメントで{.}つなぎを使うと発生{dto.xxx}

原因
  A. EmbeddedValueNodeにて、GetArgType()を呼び出しているが、
     その引数の値が、"dto"ではなく、"dto.xxx"になってしまっている。
     当然そんなArgTypeはないので、WARNが出力される。
     なぜ、"dto.xxx"になっているかと言うと、EmbeddedValueNodeの
     Splitの引数が、本来は{.}ドットであるべきところが、{,}カンマに
     なってしまっているからである。

  B. CommandContextImpl.GetArg()にて、値が取得できなかった場合に
     WARNが出力される。しかし、IFコメント的には、{!= null}と判定
     したいので、その値がNULLになるのは正常である。
     CommandContextImpl.GetArg()で、nullを返すときに
     WARNログを出力するのは、Java版でも同様。
     しかし違うのは、JavaではIFコメントをOGNLで解析していて、
     C#ではJScriptで解析している。C#の場合は、JScript内部で
     このGetArg()を呼び出してしまう。

解決方法
  A. EmbeddedValueNodeの処理をBindVariableNodeとほぼ同じようにする。
     (修正するctx.AddSqlの部分の引数の数だけが違う)
     そもそもGetArg()で取得したいValueが取得できてしまうので
     GetArgType()を呼び出す必要がない。
       →GetArg()内で、Splitして解析しているため

  B. 不明。
     CommandContextImpl.GetArg()は、共通Objectなので、
     WARNを出力するか否かは、呼び出し側の責任する?
       →CommandContextImpl内でWARNは出力せず、
         BindVariableNodeやEmbeddedValueNodeなどが、
         戻り値で判断してWARNを出す。


とりあえずは、「A」はローカルで修正してテストも通り、
業務においてバッチを実行してもWARNログが出力されないことを確認しました。
その他正常に動作しております。


まず「A」に関して、このような修正でよろしいでしょうか?

そして「B」に関して、どうしましょうか?



-- 
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
kubo   <jazzflute @ mbn.nifty.com>
jflute <http://d.hatena.ne.jp/jflute>
株式会社ビルドシステム <http://www.buildsystem.co.jp>
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/




Seasar-dev メーリングリストの案内