/*
 * Copyright (C) 2005 NTT DATA Corporation
 * 
 */
package org.postgresforest.tool.action;

import java.sql.SQLException;
import java.util.ArrayList;

import org.postgresforest.tool.bean.TableInfo;
import org.postgresforest.tool.db.GSCdata;
import org.postgresforest.tool.db.UserData;

/**
 * TODO この生成された型コメントのテンプレートを変更するには次へジャンプ: ウィンドウ - 設定 - Java - コード・スタイル -
 * コード・テンプレート
 */
public class PartitionAction extends ActionBase {

	
	private UserData m_userData;
	
	
	
	
	/**
	 * @param gsc
	 */
	public PartitionAction(GSCdata gsc,String dbName) {
		super(gsc);
		//ユーザーデータクラスを取得
		m_userData = new UserLoginMng(gsc).getUserDb(dbName);

		
	}
	/**
	 * インスタンス削除処理
	 * 
	 */
	public boolean del(TableInfo tableInfo)  {

		boolean  ret = false;
		//入力情報取得

		
		String dbName = m_userData.getDbName();		
		String tableName = tableInfo.getName();
		
		try {
			if (!connect(m_gsc ) || !connect(m_userData )) {
				return ret; 
			}
			
			//インスタンスリスト作成
			ArrayList serverList = tableInfo.getServer();
			int partitionCount = tableInfo.getPartCount();

			//--------------
			// GSCへパーティション情報を設定
			//--------------
			if (!m_gsc.releasePartition(dbName, tableName, serverList)) {
				m_gsc.rollback();
				setAccessErrs(m_gsc );
				return ret; 
			}

			//----------------
			//GSC更新日時更新
			//----------------
			if (!m_gsc.updateConfigDate()) {
				m_gsc.rollback();
				setAccessErrs(m_gsc);
				return ret; 
			}

			//--------------
			// ユーザDBへパーティション化テーブルの解除実行
			//--------------
			if(tableInfo.getPartType() == TableInfo.TYPE_PARTITION_2){
				ret = m_userData.releasePartition2(tableName, partitionCount,serverList);
			}else{
				ret = m_userData.releasePartition(tableName, partitionCount);
			}

			if (ret != true) {
				m_gsc.rollback();
				m_userData.rollback();
				setAccessErrs(m_userData);
				return ret; 
			}
			
			
			m_gsc.commit();
			m_userData.commit();

			ret = true;

		} finally {
			m_gsc.close();
			m_userData.close();
			if( m_gsc.isErrInfo() ){
				setAccessErrs(m_gsc);
				return false;
			}
			if( m_userData.isErrInfo() ){
				setAccessErrs(m_userData);
				return false;
			}
			
		}

		return ret; 

		
	}

	public boolean make(boolean dataShift, int partCount, TableInfo tableInfo, String newHashName )  {

		boolean  ret = false;


		
		//データベース名取得
		String dbName = m_userData.getDbName();	

		
		try {
			//データベースへ接続
			if (!connect(m_gsc ) || !connect(m_userData )) {
				return ret;
			}

			//--------------
			// GSCへパーティション情報を設定
			//--------------
			if(tableInfo.getPartType() == TableInfo.TYPE_PARTITION_2){
				ret = m_gsc.setPartition2(dbName, tableInfo, partCount, newHashName);
			}else{
				ret = m_gsc.setPartition(dbName, tableInfo, partCount, newHashName);
			}
			if (ret != true) {
				m_gsc.rollback();
				setAccessErrs(m_gsc);
				return ret;
			}

			//----------------
			//GSC更新日時更新
			//----------------
			if (!m_gsc.updateConfigDate()) {
				m_gsc.rollback();
				setAccessErrs(m_gsc);
				return ret; 
			}

			
			//--------------
			// ハッシュ関数イメージ取得
			//--------------
			byte[] hashImage;
			try {
				hashImage = m_gsc.getHashImage(newHashName);
			} catch (SQLException e) {
				m_gsc.rollback();
				setAccessErrs(m_gsc);
				return ret;
			}
			
			
			
			//--------------
			// ユーザDBへパーティション化テーブルの作成
			//--------------
			if(tableInfo.getPartType() == TableInfo.TYPE_PARTITION_2){
				ret = m_userData.setPartition2(tableInfo, partCount, dataShift, newHashName, hashImage);
			}else{
				ret = m_userData.setPartition(tableInfo, partCount, dataShift, newHashName, hashImage);
			}
			if (ret != true) {
				m_gsc.rollback();
				m_userData.rollback();
				setAccessErrs(m_userData);
				return ret;
			}
			m_gsc.commit();
			m_userData.commit();

		} finally {
			m_gsc.close();
			m_userData.close();
			if( m_gsc.isErrInfo() ){
				setAccessErrs(m_gsc);
				return false;
			}
			if( m_userData.isErrInfo() ){
				setAccessErrs(m_userData);
				return false;
			}
		}
		return true;
	}

	
	public boolean repartition(int partCount,TableInfo tableInfo, String newHashName )  {

		 String dbName = m_userData.getDbName();
		
		try {
			if (!connect(m_gsc ) || !connect(m_userData )) {
				return false;
			}
			
			//--------------
			// GSCへパーティション情報を設定
			//--------------
			if (!m_gsc.rePartition(dbName, tableInfo, partCount)) {
				m_gsc.rollback();
				setAccessErrs(m_gsc );
				return false;
			}

			//----------------
			//GSC更新日時更新
			//----------------
			if (!m_gsc.updateConfigDate()) {
				m_gsc.rollback();
				setAccessErrs(m_gsc);
				return false;
			}


			//--------------
			// ハッシュ関数イメージ取得
			//--------------
			byte[] hashImage;
			try {
				hashImage = m_gsc.getHashImage(newHashName);
			} catch (SQLException e) {
				m_gsc.rollback();
				setAccessErrs(m_gsc);
				return false;
			}

			//--------------
			// ユーザDBへパーティション化テーブルのリパーティション実行
			//--------------
			if (!m_userData.rePartition(tableInfo, partCount,newHashName,hashImage)) {
				m_gsc.rollback();
				m_userData.rollback();
				setAccessErrs(m_userData );
				return false;
			}
			m_gsc.commit();
			m_userData.commit();


		} finally {
			m_gsc.close();
			m_userData.close();
			if( m_gsc.isErrInfo() ){
				setAccessErrs(m_gsc);
				return false;
			}
			if( m_userData.isErrInfo() ){
				setAccessErrs(m_userData);
				return false;
			}
		}

		return true;
		
		
	}

}