/*
 * 作成日: 2005/07/18
 * 作成者: KANO
 */
package org.itscool.commons.dao;

import java.util.List;
import org.itscool.commons.connection.Record;
import org.itscool.commons.connection.Records;
import org.itscool.commons.connection.Transaction;
import org.itscool.commons.connection.TransactionUtil;

/**
 * AutoNumberオブジェクトのデータアクセス用クラスです<BR>
 * このクラスは、永続化クラスをテーブルに登録する際、ユニークなID値を生成するための
 * データアクセスクラスです<BR>
 * ID値を生成するためには、あらかじめデータベースにID生成用の以下のテーブルが作成
 * されていなければなりません<P>
 *
 * テーブル名：AUTONUMBER<BR>
 * フィールド名：TABLE_NAME(255) （主キー)<BR>
 * フィールド名：NEXT_NUMBER(Integer)
 *
 * @author KANO
 * @version 1.00
 */
public class AutoNumberDao extends BaseDao {
    
    /**
     * 指定テーブルのプライマリーIDを生成します
     * @param tableName テーブル名
     * @return プライマリーID
     */
    public int getNext(String tableName){
        int id = 0;
        Criteria crt = new Criteria(AutoNumber.class);
        crt.eq(AutoNumber.TABLE+"."+AutoNumber.PK_COLUM_tableName, tableName);
        List lst = select(crt);
        if(lst != null && lst.size() > 0){
            AutoNumber autoNumber = (AutoNumber)lst.get(0);
            id = nextAutoNumber(tableName, autoNumber);
        }else{
            id = newAutoNumber(tableName);
        }
        return id;
    }
    
    /**
     * 指定テーブルのプライマリーIDを取得します
     * @param tableName テーブル名
     * @param autoNumber
     * @return 採番されたID
     */
    protected int nextAutoNumber(String tableName, AutoNumber autoNumber){
        int id = autoNumber.getNextNumber()+1;
        autoNumber.setNextNumber(id);
        Criteria crt = new Criteria(AutoNumber.class);
        crt.eq(AutoNumber.TABLE+"."+AutoNumber.PK_COLUM_tableName, tableName);
        this.update(crt, autoNumber);
        return id;
    }
    
    /**
     * AUTO_NUMBERテーブルにテーブルを登録後、プライマリーIDを取得します
     * @param tableName テーブル名
     * @return プライマリーID
     */
    protected int newAutoNumber(String tableName){
        int id = getCount(tableName);
        if( id < 1 ){
            id = 1;
        }else{
            id ++;
        }
        
        AutoNumber autoNumber = new AutoNumber();
        autoNumber.setTableName(tableName);
        autoNumber.setNextNumber(id);
        Criteria crt = new Criteria(AutoNumber.class);
        
        insert(crt, autoNumber);
        
        return id;
        
        
    }
    
    public int getCount(String tableName){
        String sql = "SELECT COUNT(*) AS DATA_NUM FROM " + tableName;
        Transaction trn = TransactionUtil.getTransaction();
        Records records = trn.select(sql);
        Record record = (Record)records.get(0);
        int dataNum = record.getInt("DATA_NUM");
        
        return dataNum;
    }
    
}
