/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
//	共通DBアクセスクラス
//			変更履歴
//				2004.01.08	新規作成	五木田 泰史

package jp.co.ntt.lms.xmo.util;

import jp.co.ntt.lms.xmo.DataAccessHandler;

import java.util.Vector;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

/**
 * 共通DBアクセスクラス
 * <PRE>
 * 処理内容：SQL文字列を作成する。
 *           SQL文を実行する。
 * </PRE>
 */
public class DBAccess
{
	//////////////////////////////////////////////////////////////////
	// メンバ変数
	//////////////////////////////////////////////////////////////////
	
	/** 選択コマンド **/
	public static final String CMD_SELECT = "SELECT";
	/** 追加コマンド **/
	public static final String CMD_INSERT = "INSERT";
	/** 更新コマンド **/
	public static final String CMD_UPDATE = "UPDATE";
	/** 削除コマンド **/
	public static final String CMD_DELETE = "DELETE";
	/** すべての項目 **/
	public static final String ITEM_ALL   = " * ";
	
	/** DBアクセス操作クラス **/
	DataAccessHandler mobjDah;
	/** DBドライバ **/
	String mstrDriver;
	/** DB接続文字列 **/
	String mstrConStr;
	/** DBユーザ **/
	String mstrUser;
	/** DBパスワード **/
	String mstrPass;
	/** SQL文字列 **/
	String mstrSQL;
	/** コマンド(Select,Insert,Delete,Update) **/
	String mstrCommand;
	/** 項目名 **/
	String mstrItem;
	/** テーブル名 **/
	String mstrTableName;
	/** Where句 **/
	String mstrWhere;
	/** GroupBy句 **/
	String mstrGroupBy;
	/** OrderBy句 **/
	String mstrOrderBy;
	
	//////////////////////////////////////////////////////////////////
	// メンバ関数
	//////////////////////////////////////////////////////////////////
	
	/**
	 * コンストラクタ
	 *
	 */
	public DBAccess()
	{
		;
	}
	
	/**
	 * 初期化
	 *
	 * @return void
	 */
	public void initialize()
	{
		mstrDriver    = "";
		mstrConStr    = "";
		mstrUser      = "";
		mstrPass      = "";
		mstrSQL       = "";
		mstrCommand   = "";
		mstrItem      = "";
		mstrTableName = "";
		mstrWhere     = "";
		mstrGroupBy   = "";
		mstrOrderBy   = "";
	}
	
	/**
	 * DBドライバ設定
	 *
	 * @param String DBドライバ
	 * @return void
	 */
	public void setDriver(String strDriver)
	{
		mstrDriver = strDriver;
	}
	
	/**
	 * DBドライバ取得
	 * <PRE>
	 * 実装するが未使用
	 * </PRE>
	 *
	 * @return String DBドライバ
	 */
	public String getDriver()
	{
		return mstrDriver;
	}
	
	/**
	 * DB接続文字列設定
	 *
	 * @param String DB接続文字列
	 * @return void
	 */
	public void setConStr(String strConStr)
	{
		mstrConStr = strConStr;
	}
	
	/**
	 * DB接続文字列取得
	 * <PRE>
	 * 実装するが未使用
	 * </PRE>
	 *
	 * @return String DB接続文字列
	 */
	public String getConStr()
	{
		return mstrConStr;
	}
	
	/**
	 * DBユーザ設定
	 *
	 * @param String DBユーザ
	 * @return void
	 */
	public void setUser(String strUser)
	{
		mstrUser = strUser;
	}
	
	/**
	 * DBユーザ取得
	 * <PRE>
	 * 実装するが未使用
	 * </PRE>
	 *
	 * @return String DBユーザ
	 */
	public String getUser()
	{
		return mstrUser;
	}
	
	/**
	 * DBパスワード設定
	 *
	 * @param String DBパスワード
	 * @return void
	 */
	public void setPass(String strPass)
	{
		mstrPass = strPass;
	}
	
	/**
	 * DBパスワード取得
	 * <PRE>
	 * 実装するが未使用
	 * </PRE>
	 *
	 * @return String DBパスワード
	 */
	public String getPass()
	{
		return mstrPass;
	}
	
	/**
	 * SQL文設定
	 * <PRE>
	 * 実装するが未使用 → 使用
	 * </PRE>
	 *
	 * @param String SQL文
	 * @return void
	 */
	public void setSQL(String strSQL)
	{
		mstrSQL = strSQL;
	}
	
	/**
	 * SQL文取得
	 * <PRE>
	 * 実装するが未使用
	 * </PRE>
	 *
	 * @return String SQL文
	 */
	public String getSQL()
	{
		return mstrSQL;
	}
	
	/**
	 * コマンド設定
	 *
	 * @param String コマンド : select
	 *                        : insert
	 *                        : update
	 *                        : delete
	 * @return void
	 */
	public void setCommand(String strCommand)
	{
		mstrCommand = strCommand;
	}
	
	/**
	 * コマンド取得
	 * <PRE>
	 * 実装するが未使用
	 * </PRE>
	 *
	 * @return String コマンド
	 */
	public String getCommand()
	{
		return mstrCommand;
	}
	
	/**
	 * 項目設定
	 *
	 * @param String DB項目
	 * @return void
	 */
	public void setItem(String strItem)
	{
		mstrItem = strItem;
	}
	
	/**
	 * 項目取得
	 * <PRE>
	 * 実装するが未使用
	 * </PRE>
	 *
	 * @return String DB項目
	 */
	public String getItem()
	{
		return mstrItem;
	}
	
	/**
	 * テーブル名設定
	 *
	 * @param String テーブル名
	 * @return void
	 */
	public void setTableName(String strTableName)
	{
		mstrTableName = strTableName;
	}
	
	/**
	 * テーブル名取得
	 * <PRE>
	 * 実装するが未使用
	 * </PRE>
	 *
	 * @return String テーブル名
	 */
	public String getTableName()
	{
		return mstrTableName;
	}
	
	/**
	 * Where句設定
	 *
	 * @param String DBWhere句
	 * @return void
	 */
	public void setWhere(String strWhere)
	{
		mstrWhere = strWhere;
	}
	
	/**
	 * Where句取得
	 * <PRE>
	 * 実装するが未使用
	 * </PRE>
	 *
	 * @return String DBWhere句
	 */
	public String getWhere()
	{
		return mstrWhere;
	}
	
	/**
	 * OrderBy句設定
	 *
	 * @param String DBOrderBy句
	 * @return void
	 */
	public void setOrderBy(String strOrderBy)
	{
		mstrOrderBy = strOrderBy;
	}
	
	/**
	 * OrderBy句取得
	 * <PRE>
	 * 実装するが未使用
	 * </PRE>
	 *
	 * @return String DBOrderBy句
	 */
	public String getOrderBy()
	{
		return mstrOrderBy;
	}
	
	/**
	 * GroupBy句設定
	 *
	 * @param String DBGroupBy句
	 * @return void
	 */
	public void setGroupBy(String strGroupBy)
	{
		mstrGroupBy = strGroupBy;
	}
	
	/**
	 * GroupBy句取得
	 * <PRE>
	 * 実装するが未使用
	 * </PRE>
	 *
	 * @return String DBGroupBy句
	 */
	public String getGroupBy()
	{
		return mstrGroupBy;
	}
	
	/**
	 * SQL文実行処理
	 * <PRE>
	 * Select時のみVector戻り値を生成する。
	 * それ以外のコマンドはVector戻り値が生成されない(NULL)。
	 * </PRE>
	 *
	 * @return Vector SQL文実行結果リスト
	 * @exception Exception 例外エラー
	 */
	public Vector execute()
			throws SQLException, Exception
	{
		Vector vecRet = new Vector();
		String strSQL = "";
		
		try
		{
			// DBアクセスクラス生成
			if(mobjDah == null)
			{
				mobjDah = new DataAccessHandler(mstrDriver,
												mstrConStr,
												mstrUser,
												mstrPass);
			}
			
			// SQL文作成処理
			if(mstrSQL != null && !mstrSQL.equals(""))					
			{
				strSQL = mstrSQL;										
			}
			else														
			{
				strSQL = makeSQL();
			}
			if(mstrCommand.equals(CMD_SELECT))
			{
				ResultSet objRs = mobjDah.executeQuery(strSQL);
				vecRet          = convert(objRs);
			}
			else
			{
				mobjDah.execute(strSQL);
			}
		}
		catch(SQLException se)
		{
			throw se;
		}
		catch(Exception ex)
		{
			throw ex;
		}
		
		return vecRet;
	}
	
	/**
	 * コミット処理
	 *
	 * @return void
	 * @exception Exception 例外エラー
	 */
	public void commit()
			throws SQLException, Exception
	{
		try
		{
			if(mobjDah != null)
			{
				mobjDah.commit();
			}
		}
		catch(SQLException se)
		{
			throw se;
		}
		catch(Exception ex)
		{
			throw ex;
		}
	}
	
	/**
	 * ロールバック処理
	 *
	 * @return void
	 * @exception Exception 例外エラー
	 */
	public void rollback()
			throws SQLException, Exception
	{
		try
		{
			if(mobjDah != null)
			{
				mobjDah.rollback();
			}
		}
		catch(SQLException se)
		{
			throw se;
		}
		catch(Exception ex)
		{
			throw ex;
		}
	}
	
	/**
	 * SQL文作成変数クリア
	 *
	 * @return void
	 */
	public void clearProperty()
	{
		mstrSQL       = "";
		mstrCommand   = "";
		mstrItem      = "";
		mstrTableName = "";
		mstrWhere     = "";
		mstrGroupBy   = "";
		mstrOrderBy   = "";
	}
	
	/**
	 * SQL文作成処理
	 *
	 * @return String SQL文
	 * @exception Exception 例外エラー
	 */
	private String makeSQL()
			throws Exception
	{
		String strRet = "";
		
		try
		{
			StringBuffer strBuf = new StringBuffer();
			
			// コマンド追加
			if(mstrCommand != null && !mstrCommand.equals(""))
			{
				strBuf.append(mstrCommand);
			}
			else
			{
				throw new Exception("コマンドがNULLあるいは空です");
			}
			// 項目追加
			if(mstrItem != null && !mstrItem.equals(""))
			{
				strBuf.append(mstrItem);
			}
			else
			{
				strBuf.append(ITEM_ALL);
			}
			// テーブル名追加
			if(mstrTableName != null && !mstrTableName.equals(""))
			{
				strBuf.append(" FROM ");
				strBuf.append(mstrTableName);
			}
			else
			{
				throw new Exception("テーブル名がNULLあるいは空です");
			}
			// Where句追加
			if(mstrWhere != null && !mstrWhere.equals(""))
			{
				strBuf.append(" WHERE ");
				strBuf.append(mstrWhere);
			}
			else
			{
				;
			}
			// GroupBy句追加
			if(mstrGroupBy != null && !mstrGroupBy.equals(""))
			{
				strBuf.append(" GROUP BY ");
				strBuf.append(mstrGroupBy);
			}
			else
			{
				;
			}
			// OrderBy句追加
			if(mstrOrderBy != null && !mstrOrderBy.equals(""))
			{
				strBuf.append(" ORDER BY ");
				strBuf.append(mstrOrderBy);
			}
			else
			{
				;
			}
			
			strRet = strBuf.toString();
		}
		catch(Exception ex)
		{
			throw ex;
		}
		
		DebugLog.write(this.getClass(), "SQL : " + strRet, DebugLog.ROW);
		
		return strRet;
	}
	/**
	 * セレクト実行結果ベクター変換
	 *
	 * @param ResultSet セレクト実行結果
	 * @return Vector セレクト実行結果ベクター
	 * @exception Exception 例外エラー
	 */
	private Vector convert(ResultSet objRs)
			throws SQLException, Exception
	{
		Vector vecRet     = new Vector();
		int i             = 0;
		int intColumCount = 0;									// 列数
		
		try
		{
			ResultSetMetaData objRsmd = objRs.getMetaData();	// ResultSetオブジェクト情報取得
			intColumCount = objRsmd.getColumnCount();			// ResultSetの列数取得
			// 項目リスト作成
			while(objRs.next())
			{
				String[] strList = new String[intColumCount];
				for(i = 0; i < intColumCount; i++)
				{
					strList[i] = objRs.getString(i + 1);		// 項目は1から開始する
				}
				vecRet.add(strList);
			}
		}
		catch(SQLException se)
		{
			throw se;
		}
		catch(Exception ex)
		{
			throw ex;
		}
		
		return vecRet;
	}
}
