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

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

import org.postgresforest.tool.bean.ConfigInfo;
import org.postgresforest.tool.bean.LoginInfo;
import org.postgresforest.tool.bean.ServerInfo;
import org.postgresforest.tool.db.GSCdata;
import org.postgresforest.tool.util.MessagesCommandLine;

/**
 * グローバルシステムカタログ作成クラス
 * 
 * グローバルシステムカタログの作成を行う。
 */
public class GscAction extends ActionBase{
	/**
	 * @param gsc
	 */
	public GscAction(GSCdata gsc) {
		super(gsc);
		// TODO 自動生成されたコンストラクター・スタブ
	}
	/**
	 * GSC作成メイン処理
	 * 
	 */
	public boolean makeGsc(LoginInfo login)  {


		
		//入力情報取得
		String userName = login.getUser();
		String password = login.getPassword();

		//GSCクラス生成
		GSCdata gsc = new GSCdata(userName, password);

		//接続情報設定
		String hostName = login.getHostname();
		String portNo = login.getPortno();
		String dbName = login.getDbname();
		if(dbName != null && dbName.compareTo("") != 0 ){
			gsc.addUrl(hostName, portNo, dbName);
		}
		
		//GSC設定チェック
		if (gsc.getURL().length == 0) {
			System.out.println(MessagesCommandLine.getString("errors.gsc.input"));
			return false;
		}

		//------------------------------
		//GSCデータベース作成
		//------------------------------
		try {
			//template1に接続
			if (!connectTemlate(gsc)) {
				return false;
			}

			//DB作成
			if (!gsc.makeDB()) {
				setAccessErrs("errors.db.create", gsc);
				return false;
			}
			gsc.close();

			if (!connect(gsc)) {
				return false;
			}

			//スキーマ作成
			if (!gsc.makeGscTables()) {
				setAccessErrs(gsc);
				gsc.rollback();
				return false;
			}
			
			//GSCインスタンス登録
			if (!gsc.addGscServer(dbName, hostName, portNo)) {
				setAccessErrs(gsc);
				gsc.rollback();
				return false;
			}
			
			//デフォルトコンフィグの登録
			//データ更新
			if (!gsc.addConfig(new ConfigInfo()) ) {
				setAccessErrs(gsc);
				gsc.rollback();
				return false;
			}
			
			gsc.commit();

		} finally {
			gsc.close();
		}

		
		return true;
	}

	/**
	 * グローバルシステムカタログ作成処理
	 * 
	 */
	public boolean addGsc(String dbName, String serverid)  {
		
		
		//追加GSC用のGSCクラスを作成
		GSCdata makegsc = new GSCdata(m_gsc.getUserPassword());
		
		try {
			//------------------------------
			//GSC更新
			//------------------------------
			if (!connect(m_gsc)) {
				return false; 
			}
			
			// サーバIDからホスト名、ポートNoを取得
			Integer[] serverIdList = new Integer[1];
			serverIdList[0] = Integer.valueOf(serverid);
			ArrayList serverList;
			try {
				serverList = m_gsc.getServerList(serverIdList);
			} catch (SQLException e) {
				setAccessErrs(m_gsc);
				return false; 
			}
			ServerInfo info = (ServerInfo)serverList.get(0);
			String hostName = info.getHost();
			String portNo = info.getPort();
			
			//追加GSC用のGSCクラスにURLを追加
			if(dbName.compareTo("") != 0 ){
				makegsc.addUrl(hostName, portNo, dbName);
			}
			else{
				setAccessErrs(m_gsc);
				return false; 
			}
			
			//GSCインスタンス登録
			if (!m_gsc.addGscServer(Integer.parseInt(serverid), dbName)) {
				setAccessErrs(m_gsc);
				m_gsc.rollback();
				return false; 
			}

			//GSC情報インサート用SQL取得
			ArrayList sqlList;
			try {
				sqlList = m_gsc.getGscInsertSql();
			} catch (SQLException e1) {
				setAccessErrs(m_gsc);
				m_gsc.rollback();
				return false; 
			}

			//----------------
			//GSC更新日時更新
			//----------------
			if (!m_gsc.updateConfigDate()) {
				m_gsc.rollback();
				setAccessErrs(m_gsc);
				return false; 
			}
			
			//------------------------------
			//GSCデータベース作成
			//------------------------------
			//template1に接続
			if (!connectTemlate(makegsc)) {
				m_gsc.rollback();
				return false; 
			}

			//GSCデータベース作成
			if (!makegsc.makeDB()) {
				setAccessErrs("errors.db.create", makegsc);
				m_gsc.rollback();
				return false; 
			}
			makegsc.close();

			//作成したGSCに接続
			if (!connect(makegsc)) {
				m_gsc.rollback();
				return false; 
			}

			//スキーマ作成
			if (!makegsc.makeGscTables()) {
				setAccessErrs(makegsc);
				makegsc.rollback();
				m_gsc.rollback();
				return false; 
			}

			//GSC情報インサート用SQL実行
			if (!makegsc.setGscInsertSql(sqlList)) {
				setAccessErrs(makegsc);
				makegsc.rollback();
				m_gsc.rollback();
				return false; 
			}
			
			
			makegsc.commit();
			m_gsc.commit();

			//GSC情報を更新
			m_gsc.updateGscServer();
		
		} finally {
			makegsc.close();
			m_gsc.close();
		}
		
		return true;
	}
	/**
	 * グローバルシステムカタログ削除処理
	 * 
	 */
	public boolean delGsc(String dbName, String serverid)  {
		
		
		String hostName = "";
		String portNo = "";
		
		//削除GSC用のGSCクラスを作成
		GSCdata makegsc = new GSCdata(m_gsc.getUserPassword());
		
		try {
			//--------------
			// GSC　更新
			//--------------
			if (!connect(m_gsc)) {
				return false; 
			}
			
			// サーバIDからホスト名、ポートNoを取得
			Integer[] serverIdList = new Integer[1];
			serverIdList[0] = Integer.valueOf(serverid);

			ArrayList serverList;
			try {
				serverList = m_gsc.getServerList(serverIdList);
			} catch (SQLException e) {
				setAccessErrs(m_gsc);
				return false; 
			}
			
			ServerInfo info = (ServerInfo)serverList.get(0);
			hostName = info.getHost();
			portNo = info.getPort();
			
			//削除するGSC用のGSCクラスにURLを追加
			makegsc.addUrl(hostName, portNo, dbName);
			
			//GSCインスタンス削除
			if (!m_gsc.delGscServer(Integer.parseInt(serverid), dbName)) {
				setAccessErrs(m_gsc);
				m_gsc.rollback();
				return false; 
			}

			//----------------
			//GSC更新日時更新
			//----------------
			if (!m_gsc.updateConfigDate()) {
				m_gsc.rollback();
				setAccessErrs(m_gsc);
				return false; 
			}
			
			m_gsc.commit();
			
			//GSC情報を更新
			m_gsc.updateGscServer();
			
			//GSC接続をクローズ（ここでクローズしないと、GSCに接続されたままとなるのでDROPできない。）
			m_gsc.close();

			//--------------
			// GSCデータベース削除
			//--------------
			//接続
			if (connectTemlate(makegsc)) {
				//GSCデータベース削除
				if (!makegsc.delDB()) {
					setAccessErrs("errors.db.drop", makegsc);
					return false;
				}
			}
		} finally {
			m_gsc.close();
			makegsc.close();
		}

		return true; 
		
	}	
	/**
	 * サーバ情報取得処理
	 * 
	 */
	public ArrayList getGscList() throws Exception {
		ArrayList gscList = null;
			

		try {
			if (!connectSelect(m_gsc)) {
				throw new Exception();
			}

			//--------------
			// GSC情報を生成
			//--------------
			gscList = m_gsc.getGscList();

		} catch (Exception e) {
			setAccessErrs(m_gsc);
			throw new Exception();

		} finally {
			m_gsc.close();
		}
		
		return gscList;
	}	
}
