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

import java.util.ArrayList;
import java.util.Iterator;

import org.postgresforest.tool.bean.AddDbInfo;
import org.postgresforest.tool.bean.ServerDumpDataInfo;
import org.postgresforest.tool.bean.ServerInfo;
import org.postgresforest.tool.db.GSCdata;

/**
 * データベースリンク情報生成
 * 
 * データベースリンク情報を作成する。
 *
 */
public class DbInstanceAction extends ActionBase {

	/**
	 * @param gsc
	 */
	public DbInstanceAction(GSCdata gsc) {
		super(gsc);
	}
	/**
	 * データベースリンク情報作成処理
	 * 
	 */
	public ArrayList getDbLinkList() throws Exception {
		ArrayList dbLinkList = null;
		

		//データ作成
		try {
			//接続
			if (!connectSelect(m_gsc)) {
				return null;
			}
			
			//サーバ情報を生成
			ArrayList serverList = m_gsc.getServerList();

			//DB-サーバ情報のリンク情報を生成
			dbLinkList = m_gsc.getDbLinkList(serverList);
			
		} finally {
			//TODOMASU ほんとにこんなことしていいの？
			if(m_gsc != null){
				m_gsc.close();
			}
		}

		return dbLinkList;
	}
	
	/**
	 * データベース作成情報作成処理
	 * 
	 */
	public AddDbInfo getAddDbInfo() throws Exception {
		AddDbInfo addDb = null;
		
		//データ作成
		try {
			//接続
			if (!connectSelect(m_gsc)) {
				throw new Exception();
			}
			
			//サーバ情報を生成
			ArrayList serverList = m_gsc.getServerList();

			//--------------
			//DB作成用のフォームセット
			//--------------
			addDb = new AddDbInfo();
			ArrayList serverDumpDataList = new ArrayList();
			for (Iterator iterator = serverList.iterator();iterator.hasNext();) {
				ServerInfo serverInfo = (ServerInfo) iterator.next();
				ServerDumpDataInfo info =
					new ServerDumpDataInfo();
				info.setHost(serverInfo.getHost());
				info.setId(serverInfo.getId());
				info.setPort(serverInfo.getPort());
				info.setStatus(serverInfo.getStatus());
				info.setChangeStatus(serverInfo.getChangeStatus());
				info.setChkFlag(true);
				info.setDumpData("");
				serverDumpDataList.add(info);
			}
			addDb.setServer(serverDumpDataList);
			
		} finally {
			m_gsc.close();
		}

		return addDb;
	}
	/**
	 * インスタンス登録処理
	 * 
	 */
	public boolean addInstance(String host, String port)  {
		
		try {
			//GSCへ接続
			if (!connect(m_gsc)) {
				return false; 
			}
			
			//データ更新
			if (!m_gsc.addServer(host, port)) {
				m_gsc.rollback();
				setAccessErrs(m_gsc);
				return false;
			}
			//----------------
			//GSC更新日時更新
			//----------------
			if (!m_gsc.updateConfigDate()) {
				m_gsc.rollback();
				setAccessErrs(m_gsc);
				return false;
			}

			m_gsc.commit();

		} finally {
			m_gsc.close();
		}
		
		return true;
	}	
	/**
	 * インスタンス削除処理
	 * 
	 */
	public boolean delInstance(String id)  {
		
		try {
			if (!connect(m_gsc)) {
				return false; 
			}

			//データ更新
			if (!m_gsc.delServer(Integer.parseInt(id))) {
				m_gsc.rollback();
				setAccessErrs(m_gsc);
				return false;
			}

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

			m_gsc.commit();

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