ひがやすを技術ブログ

電通国際情報サービスのプログラマ

seasarのからさわぎ in 沖縄

6/12の飛行機が取れたんですが、早い時間は席がなくて、
14:20に那覇空港着になってしまいました。
もっとはやく予約しておけばよかった。心より恥じる。
そろそろタイムスケジュール・場所・内容を決めたいと思います。

内容

時間は3時間強くらい。
時間によってはどれかはしょっても良いと思ふ。

S2Unit

S2Unitを使って各テストメソッドが実行されるとき、どーいう順番で何が動くのかS2.0.8のソースを追っかけて纏めてみました。ソース追っかけたと言っても、S2TestCase#runBare()メソッドを読んだだけですけど(;^_^A
なんでこんなの書く気になったかというと、setUp()メソッドでreadXlsAllReplaceDb()メソッドを呼び出したら例外が発生したため、その原因を探ってたからだったりする。

マニュアルにreadXlsXxx()を呼び出すタイミングの記述がないですね。m(_ _)m
心より恥じる。
以下マニュアルに追加予定。


readXlsWriteDb()、readXlsAllReplaceDb()はテスト後に
ロールバックしてデータが元に戻るようにtestXxxTx()の
最初に実行してください。

ELSE

ELSEではバインド変数は使えるが、BEGINやIFなどのENDタグを
使うものは使えないという仕様に落ち着きました。
基本は1ラインコメントになると思います。


/*IF job != null*/
job = /*job*/'CLERK'
--ELSE job is null
/*END*/

SQLの解析

SQLの解析は、SqlParserが行い、解析結果は、Nodeのツリーになってます。


public interface Node {
public int getChildSize();
public Node getChild(int index);
public void addChild(Node node);
public void accept(QueryContext ctx);
}

public interface SqlParser {
public Node parse(String sql);
}
Nodeの具象クラスには、SqlNode(SQLの断片)、
BindVariableNode(バインド変数用)、IfNode(if文)、
BlockNode(BEGINからENDコメントまでを管理)などがあります。
実際の使い方は、

SqlParser parser = new SqlParserImpl();
Node root = parser.parse(sql);
QueryContext ctx = new QueryContextImpl();
//引数の設定
ctx.addArg(...);
root.accept(ctx);
//QueryContextからSQL文とバインド変数を取り出しS2JDBCで実行
のような感じです。id:masataka_kさん。