/*
 * blancoDb Enterprise Edition
 * Copyright (C) 2005 Tosiki Iga
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 */
package blanco.db.collector;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;

import blanco.db.conf.BlancoDbDatabaseConnectionSettingDef;

/**
 * BlancoDbが扱うデータベース接続を保持します。 <br>
 * データベースの各種情報を取得します。
 * 
 * @since 2005.05.12
 * @author iga
 */
public class BlancoDbDatabaseConnection {
    /**
     * SQL Server 2000用のJDBCドライバ
     */
    public static final String DRIVERNAME_SQLSERVER_2000 = "SQLServer";

    /**
     * SQL Server 2005用のJDBCドライバ
     */
    public static final String DRIVERNAME_SQLSERVER_2005 = "Microsoft SQL Server 2005 JDBC Driver";

    public static final String DRIVERNAME_ORACLE = "Oracle JDBC driver";

    public static final String DRIVERNAME_POSTGRESQL = "PostgreSQL Native Driver";

    private Connection _conn = null;

    private String _driverName = null;

    private String _driverVersion = null;

    public String getDriverName() {
        return _driverName;
    }

    public String getDriverVersion() {
        return _driverVersion;
    }

    /**
     * データベース接続の確立を試みます。
     * 
     * @param connDef
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public void connect(final BlancoDbDatabaseConnectionSettingDef connDef)
            throws SQLException, ClassNotFoundException {
        System.out.println("データベース接続をオープンします.");
        try {
            System.out.println("  Driver:" + connDef.getJdbcDriver());
            Class.forName(connDef.getJdbcDriver());
        } catch (ClassNotFoundException ex) {
            System.out.println("JDBCドライバのロードに失敗しました: " + ex.toString());
            throw ex;
        }
        try {
            System.out.println("  URL:" + connDef.getJdbcUrl());
            System.out.println("  User:" + connDef.getJdbcUser());
            _conn = DriverManager.getConnection(connDef.getJdbcUrl(), connDef
                    .getJdbcUser(), connDef.getJdbcPassword());

            // 自動コミットをOFFに設定します。
            _conn.setAutoCommit(false);
        } catch (SQLException ex) {
            System.out.println("JDBC接続の確立に失敗しました: " + ex.toString());
            throw ex;
        }
    }

    public void close() {
        if (_conn != null) {
            try {
                System.out.println("データベース接続をクローズします. (rollbackしてcloseします)");
                try {
                    _conn.rollback();
                } finally {
                    _conn.close();
                }
            } catch (SQLException e) {
                System.out.println("JDBC接続の開放に失敗しました: " + e.toString());
                e.printStackTrace();
            }
            _conn = null;
        }
    }

    public Connection getConnection() {
        return _conn;
    }

    /**
     * データベースのバージョン情報などを取得します。
     */
    public void getDatabaseVersionInfo() {
        System.out.println("JDBCドライバの基礎情報を取得します。");
        try {
            final DatabaseMetaData databaseMetaData = _conn.getMetaData();

            _driverName = databaseMetaData.getDriverName();
            _driverVersion = databaseMetaData.getDriverVersion();
            System.out.println("  DriverName:" + _driverName);
            System.out.println("  DriverVersion:" + _driverVersion);

            try {
                System.out.println("  DatabaseMajorVersion:"
                        + databaseMetaData.getDatabaseMajorVersion());
                System.out.println("  DatabaseMinorVersion:"
                        + databaseMetaData.getDatabaseMinorVersion());
            } catch (java.lang.AbstractMethodError er) {
                // SQL Server 2000 JDBC Driverは このメソッドをサポートしません。
                // System.out.println(er.toString());
            } catch (SQLException ex) {
            }
            try {
                System.out.println("  JDBCMajorVersion:"
                        + databaseMetaData.getJDBCMajorVersion());
                System.out.println("  JDBCMinorVersion:"
                        + databaseMetaData.getJDBCMinorVersion());
            } catch (java.lang.AbstractMethodError er) {
                // SQL Server 2000 JDBC Driverは このメソッドをサポートしません。
                // System.out.println(er.toString());
            } catch (SQLException ex) {
                // Oracle 9i JDBC Driverは このメソッドをサポートしません。
            }

            if (DRIVERNAME_SQLSERVER_2000.equals(_driverName)) {
                // このドライバは知っています.
            } else if (DRIVERNAME_SQLSERVER_2005.equals(_driverName)) {
                // このドライバは知っています.
            } else if (DRIVERNAME_ORACLE.equals(_driverName)) {
                // このドライバは知っています.
            } else if (DRIVERNAME_POSTGRESQL.equals(_driverName)) {
                // このドライバは知っています.
            } else {
                System.out.println("未知のJDBCドライバです: " + _driverName);
            }

        } catch (SQLException e1) {
            e1.printStackTrace();
            return;
        }
    }
}