package org.postgresql.pljava.RePartition;

import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;

import org.postgresql.vm.Hash_I;

/**
 * ハッシュ値取得クラス
 */
public class Hash {
	static Hash_I hash = null;

	/**
	 * パーティションNo取得
	 * 
	 * ハッシュクラスからパーティション数を取得する
	 * 
	 * @param ret		他メソッド返り値
	 * @return	パーティション数
	 */
	public static Integer getPartitionNo(boolean ret) {
		if (ret) {
			return new Integer(hash.getNodeNo());
		}
		else {
			return new Integer(-1);
		}
	}
	
	/**
	 * 属性値設定（Integer）
	 * 
	 * 指定された属性値をハッシュクラスに設定する
	 * 
	 * @param ret		他メソッド返り値
	 * @param value	属性値設定（Integer）
	 * @return	true:成功.false:失敗
	 */
	public static boolean setValue(boolean ret, Integer value) {
		if (ret) {
			hash.addCol(value.intValue());
			return true;
		}
		else {
			return false;
		}
	}
	
	/**
	 * 属性値設定（String）
	 * 
	 * 指定された属性値をハッシュクラスに設定する
	 * 
	 * @param ret		他メソッド返り値
	 * @param value	属性値設定（String）
	 * @return	true:成功.false:失敗
	 */
	public static boolean setValue(boolean ret, String value) {
		if (ret) {
			hash.addCol(value);
			return true;
		}
		else {
			return false;
		}
	}

	/**
	 * 属性値設定（Date）
	 * 
	 * 指定された属性値をハッシュクラスに設定する
	 * 
	 * @param ret		他メソッド返り値
	 * @param value	属性値設定（Date）
	 * @return	true:成功.false:失敗
	 */
	public static boolean setValue(boolean ret, Date value) {
		if (ret) {
			hash.addCol(value);
			return true;
		}
		else {
			return false;
		}
	}

	/**
	 * 属性値設定（Time）
	 * 
	 * 指定された属性値をハッシュクラスに設定する
	 * 
	 * @param ret		他メソッド返り値
	 * @param value	属性値設定（Time）
	 * @return	true:成功.false:失敗
	 */
	public static boolean setValue(boolean ret, Time value) {
		if (ret) {
			hash.addCol(value);
			return true;
		}
		else {
			return false;
		}
	}
	
	/**
	 * 属性値設定（Timestamp）
	 * 
	 * 指定された属性値をハッシュクラスに設定する
	 * 
	 * @param ret		他メソッド返り値
	 * @param value	属性値設定（Timestamp）
	 * @return	true:成功.false:失敗
	 */
	public static boolean setValue(boolean ret, Timestamp value) {
		if (ret) {
			hash.addCol(value);
			return true;
		}
		else {
			return false;
		}
	}
	
	/**
	 * ハッシュクラスインスタンス取得
	 * 
	 * 指定されたハッシュクラス名のクラスのインスタンスを生成する
	 * 生成したハッシュクラスにパーティション数を設定する
	 * 
	 * @param hashName	ハッシュクラス名
	 * @param partNum	パーティション数
	 * @return	true:成功.false:失敗
	 */
	public static boolean getHash(String hashName, Integer partNum) {
		try {
			if(hash == null){
				//HashLoader ld = new HashLoader();
				//ld.setClass(hashName, byteImg);
				//
				//hash = (Hash_I)Class.forName(hashName,true,ld).newInstance();
				hash = (Hash_I)Class.forName(hashName).newInstance();
			}
			hash.setPartNum(partNum.intValue());
			hash.clearCol();
			
			return true;
		}
		catch (ClassCastException e) {
			e.printStackTrace();
		}
		catch (InstantiationException e) {
			e.printStackTrace();
		}
		catch (IllegalAccessException e){
			e.printStackTrace(); 
		}
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return false;
	}
	/**
	 * ハッシュクラスインスタンス取得
	 * 
	 * 指定されたハッシュクラス名のクラスのインスタンスを生成する
	 * 生成したハッシュクラスにパーティション数を設定する
	 * ハッシュクラス名はnullのときは、デフォルトのハッシュ関数（Hash01）となる。
	 * 
	 * @param hashName	ハッシュクラス名
	 * @param classImage	ハッシュイメージ
	 * @param partNum	パーティション数
	 * @return	true:成功.false:失敗
	 */
	public static boolean getHash(String hashName, byte[] classImage, Integer partNum) {
		try {
			if(hash == null){
						
				HashLoader ld = new HashLoader(hashName, classImage);
				hash = (Hash_I)ld.loadClass(hashName).newInstance();
					
				
			}
			hash.setPartNum(partNum.intValue());
			hash.clearCol();
			
			return true;
		}
		catch (ClassCastException e) {
			e.printStackTrace();
		}
		catch (InstantiationException e) {
			e.printStackTrace();
		}
		catch (IllegalAccessException e){
			e.printStackTrace(); 
		}
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return false;
	}
	
}
