/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.database;

import java.util.*;
import java.sql.*;
import org.apache.log4j.Category;
import jp.co.sint.tools.*;
import jp.co.sint.config.*;

/**
 * @version $Id: SIPrepared.java,v 1.0 Exp $
 * @author     : Jinwang Chen
 * <br>Description: SQL文のキーを設定して、SQL文の設定ファイルからプリペアドSQL文を
 *               取得して、?部分の値をListオブジェクトに に順番に追加します。
 *               上記の設定を基づいて、DBへの更新をします。
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 * ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * J.W.Chen       2003/07/30  Original
 */

public class SIPrepared {
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  //キーの定義
  private String preparedKey;
  //SQL文の「?」部分の値リスト
  private ArrayList valuesList=new ArrayList();
  //SQL文の定義ファイル
  ResourceBundle preparedConfigBundle = ResourceBundle.getBundle(SIConfig.SICONFIG_PREPQREDSQL_FILE_NAME,new Locale("ja","JP"));

  /**
   * <b>SIPrepared</b>
   * コンストラクタ
   * @param  なし
   * @return なし
   * @throws なし
   */
  public SIPrepared(){}

  /**
   * <b>SIPrepared</b>
   * コンストラクタ
   * @param  lPreparedKey 設定ファイルからSQL文を取得するために、キーの値
   * @return なし
   * @throws なし
   */
  public SIPrepared(String lPreparedKey){
    log.debug("lPreparedKey="+lPreparedKey);
    this.preparedKey=lPreparedKey;
  }

  /**
   * <b>setPreparedKey</b>
   * キーのsetter
   * @param  lPreparedKey 設定ファイルからSQL文を取得するために、キーの値
   * @return なし
   * @throws なし
   */
  public void setPreparedKey(String lPreparedKey){
    this.preparedKey=lPreparedKey;
  }

  /**
   * <b>add</b>
   * 文字列という値をリストに追加します。
   * @param  lValue ?の文字値
   * @return なし
   * @throws なし
   */
  public void add(String lValue){
    valuesList.add(lValue);
  }

  /**
   * <b>add</b>
   * 整数という値をリストに追加します。
   * @param  lValue ?の整数値
   * @return なし
   * @throws なし
   */
  public void add(int lValue){
    valuesList.add(new Integer(lValue));
  }

  /**
   * <b>add</b>
   * longという値をリストに追加します。
   * @param  lValue ?のlong値
   * @return なし
   * @throws なし
   */
  public void add(long lValue){
    valuesList.add(new Long(lValue));
  }

  public void add(float lValue){
    valuesList.add(new Float(lValue));
  }

  /**
   * <b>add</b>
   * 日付という値をリストに追加します。
   * @param  lValue ?の日付値
   * @return なし
   * @throws なし
   */
  public void add(SIDateTime lValue){
    valuesList.add(lValue);
  }

  /**
   * <b>execute</b>
   * プリペアドSQL文を実行します。
   * @param  lConnection DBへのコネクション
   * @return なし
   * @throws SIDBAccessException
   */
  public void execute(Connection lConnection)throws SIDuplicateKeyException,SIDBAccessException{
    String lPreparedSQL="";
    try {
      lPreparedSQL=preparedConfigBundle.getString(preparedKey);
    }catch(Exception e){
      log.error("execute:"+e.toString());
      throw new SIDBAccessException("null prepared sql");
    }
    log.debug("lPreparedSQL="+lPreparedSQL);

    if (SIUtil.isNull(lPreparedSQL)) {
      log.error("execute:null prepared sql.");
      throw new SIDBAccessException("null prepared sql");
    }
    log.debug("execute:lPreparedSQL="+SIUtil.changeToJIS(lPreparedSQL));
    SIDBUtil.executePrepared(lConnection,SIUtil.changeToJIS(lPreparedSQL),valuesList);
  }
}