/*
 * Copyright (c) 2007, Going Dot Com Inc. All rights reserved.
 */

package jp.co.going.xbrl.taxonomy;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import jp.co.going.xbrl.common.XbException;

/**
 * @author Going Dot Com Inc.
 */
public class XbLinkLocNextIdDAO implements XbNextIdDAO {

    // singleton
    private static XbNextIdDAO nextId = null;
    // 最大値格納変数
    private long nextValue = 0;

    // コンストラクタ
    private XbLinkLocNextIdDAO(Connection conn) throws XbException {

        try {
            // ステートメントを作成
            PreparedStatement stmt;

            // TAXONOMY_GROUP_IDの最大値を取得する
            stmt = conn.prepareStatement("select max(locator_id) as id from xb_linkbase_locator");

            ResultSet rs = stmt.executeQuery();
            while(rs.next()) {
                nextValue = rs.getLong("id");
            }

            // 結果セットをクローズ
            rs.close();

            // ステートメントをクローズ
            stmt.close();
        } catch (SQLException e) {
            throw new XbException(e, "SQL設定エラー: SQLError : " + e.getMessage());
        }
    }

    /**
     * インスタンスを生成
     * @param conn コネクション
     * @return LinkLocNextIdDAOインスタンス
     * @throws XbException
     */
    public static synchronized XbNextIdDAO getInstance(Connection conn) throws XbException {
        // インスタンスを生成
        if (nextId == null) {
            nextId = new XbLinkLocNextIdDAO(conn);
        }

        return nextId;
    }

    /**
     * locator_idのシーケンス番号を取得する
     * @return locator_idの最大値
     */
    public synchronized long getNextValue() {
        return ++ nextValue;
    }
}