/*
 * blanco Framework
 * Copyright (C) 2004-2005 IGA Tosiki
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 */
package blanco.db.expander.query;

import blanco.db.definition.QueryIteratorDotNet;
import blanco.db.util.BlancoDbObjectStorageDotNet;
import blanco.ig.expander.IgType;
import blanco.ig.expander.IgValue;
import blanco.ig.expander.implementor.Implementor;
import blanco.ig.expander.method.MethodExpander;

/**
 * @author tosiki iga
 */
public class PrepareStatementMethod2DotNet extends MethodExpander {
    private BlancoDbObjectStorageDotNet storage = null;

    private IgValue queryArgument = new IgValue(new IgType("string"), "query");

    private QueryIteratorDotNet _iterator = null;

    public PrepareStatementMethod2DotNet(
            final BlancoDbObjectStorageDotNet storage,
            final QueryIteratorDotNet iterator) {
        super("PrepareStatement");
        this.storage = storage;
        _iterator = iterator;
    }

    public void setupSignature() {
        // 引数を追加してみる。
        addArgument(queryArgument);

        getJavaDoc().addLine("クエリのプリコンパイルを実施します。");
        getJavaDoc().addLine("動的に内容が変化するようなSQLを実行する必要がある場合にのみ、こちらのメソッドを利用します。");
        getJavaDoc()
                .addLine(
                        "※SQL文そのものをパラメータとして与えることができて自由度が高い一方、SQLインジェクションと呼ばれるセキュリティホールが発生する危険がある点に注意した上で利用してください。");
        getJavaDoc().addLine("内部的には SqlCommandのコンストラクタ を呼び出します。");
        getJavaDoc().addParameter("query", "利用したいクエリ(SQL文)");
    }

    public void implement() {
        final Implementor implementor = new Implementor(getData());

        if (storage.getSetting().isLogging()) {
            implementor.addLine("if (fLog.isDebugEnabled()) {");
            implementor.addLine("fLog.debug(\"" + getName()
                    + ": query = \" + query);");
            implementor.addLine("}");
            implementor.addLine("");
        }

        implementor.addLine("Close();");

        implementor.addLine("fStatement = new SqlCommand();");
        implementor.addLine("fStatement.Connection = fConnection;");
        implementor.addLine("fStatement.Transaction = fTransaction;");
        implementor.addLine("fStatement.CommandText = query;");

        if (storage.getSetting().getStatementTimeout() >= 0) {
            implementor.addLine("// ステートメントタイムアウト値についてデフォルト値をセットします。");
            implementor.addLine("fStatement.CommandTimeout = "
                    + storage.getSetting().getStatementTimeout() + ";");
        }
    }
}