using System;
using System.Collections.Generic;
using System.Text;
using FirebirdSql.Data.FirebirdClient;
using Microsoft.Win32;
using System.Data;

using System.Diagnostics;



namespace IControls_FireManager
{

    //DATABASE �۾� ���
    public enum QUERYMode
    {
        select, insert, update, delete, InsertAndUpdate
    }

    //TB_COMM�� COMM_LOOP �ʵ� ���
    public enum COMMLOOP
    {
        FrontLoop = 1, BackLoop = 2, IO = 3, KEYPAD = 4, EmergencyBroadcast = 5
    }

    
    public class DacBase
    {

        //String strConnection = string.Format("Server={0};User={1};Password={2};Database={3};Charset={4};ServerType={5}",
        //                    "127.0.0.1",        // IP ex)192.168.63.22 
        //                    "sysdba",        // ����� 
        //                    "masterkey",    // ��ȣ 
        //                    "D:\\Ÿ���۾���\\������Ʈ�ѽ�\\DB\\FPER.FDB",    // ������ġ.. ex) C:\TEST\TEST.FDB 
        //                    "KSC_5601",    // KSC_5601 ���� ���ڼ��� ���� 
        //                    "0");    // 0�̸� Classic/Super Server, 1�̸� Embedded Server�� �����ϽŴ���... 

        // FireBird ������
        public FbConnection connection = null;
        public _DB_Connect  DBSetting = null; 

        public bool DBSet(_DB_Connect cDB)
        {
            DBSetting = new _DB_Connect();

            DBSetting.sDATABASE_NAME  = cDB.sDATABASE_NAME;
            DBSetting.sPASSWORD  = cDB.sPASSWORD;
            DBSetting.sUSER_ID  = cDB.sUSER_ID;
            DBSetting.sSERVER_NAME = cDB.sSERVER_NAME;

            return true;
        }

        public bool Connect()
        {
            bool ret = false;
            string strConnection;

            try
            {

                if (DBSetting != null)   // DBSetting ������ �� ���..
                {
                    strConnection = string.Format("Server={0};User={1};Password={2};Database={3};Charset={4};ServerType={5}",
                                    DBSetting.sSERVER_NAME,        // IP ex)192.168.63.22 
                                    DBSetting.sUSER_ID,        // ����� 
                                    DBSetting.sPASSWORD,    // ��ȣ 
                                    DBSetting.sDATABASE_NAME,    // ������ġ.. ex) C:\TEST\TEST.FDB 
                                    "KSC_5601",    // KSC_5601 ���� ���ڼ��� ���� 
                                    "0");    // 0�̸� Classic/Super Server, 1�̸� Embedded Server�� �����ϽŴ���... 

                }
                else
                {
                    //������Ʈ������ DB�������� �о����
                    RegistryKey rk = Registry.LocalMachine.OpenSubKey("SOFTWARE\\I_FireManager", false);

                    String SERVER_NAME = "";
                    String DATABASE_NAME = "";
                    String DATABASE_USER_ID = "";
                    String DATABASE_PASSWORD = "";

                    if (rk != null)
                    {
                        DATABASE_NAME = rk.GetValue("DATABASE_NAME").ToString();
                        SERVER_NAME = DATABASE_NAME.Substring(0, DATABASE_NAME.IndexOf(":"));
                        DATABASE_NAME = DATABASE_NAME.Substring(DATABASE_NAME.IndexOf(":") + 1);
                        DATABASE_USER_ID = rk.GetValue("DATABASE_USER_ID").ToString();
                        DATABASE_PASSWORD = rk.GetValue("DATABASE_PASSWORD").ToString();
                    }


                    strConnection = string.Format("Server={0};User={1};Password={2};Database={3};Charset={4};ServerType={5}",
                                        SERVER_NAME,        // IP ex)192.168.63.22 
                                        DATABASE_USER_ID,        // ����� 
                                        DATABASE_PASSWORD,    // ��ȣ 
                                        DATABASE_NAME,    // ������ġ.. ex) C:\TEST\TEST.FDB 
                                        "KSC_5601",    // KSC_5601 ���� ���ڼ��� ���� 
                                        "0");    // 0�̸� Classic/Super Server, 1�̸� Embedded Server�� �����ϽŴ���... 

                }

                connection = new FbConnection(strConnection);
                
                //connection.Database.
                connection.Open();

                ret = (this.connection.State == ConnectionState.Open);
            }
            catch (Exception ex)
            {

                Util.UErrorMessage(ex, 0, 0);
                throw new Exception(string.Format("[{0}]\r\n{1}", ex.Message, ex.StackTrace));
            }
            return ret;


        }

      public void DisConnect() {
        try {
          if (connection != null)
            connection.Close();
        }
        catch (Exception ex) {
          Util.UErrorMessage(ex, 0, 0);
        }
        //Util.UDebugMessage("-DB DisConnect ", 0, 0);

        //Debug.WriteLine(">>>>>> Close >>>>> " + Convert.ToString(iOpenCount));

      }


      public DataSet Select(String sqlSyntax) {
        DataSet data = null;
        if (this.Connect()) {

          try {
            Util.UDebugMessage(string.Format("+DB Select {0}", sqlSyntax), 0, 0);

            FbCommand command = new FbCommand(sqlSyntax, connection);
            command.CommandType = CommandType.Text;
            command.CommandTimeout = 2147483647;

            data = new DataSet();

            FbDataAdapter adapter = new FbDataAdapter(command);

            adapter.Fill(data);


            adapter.Dispose();
            command.Dispose();

          }
          catch (Exception ex) {
            Util.UErrorMessage(ex, 0, 0);
            throw ex;
          }
          finally {
            Util.UDebugMessage(string.Format("-DB Select"), 0, 0);
            this.DisConnect();
          }
        }

        return data;
      }

      public void ExecuteNonQuery(String sqlSyntax) {
        if (this.Connect()) {
          FbTransaction transaction = connection.BeginTransaction();
          try {
            Util.UDebugMessage(string.Format("+DB Excute {0}", sqlSyntax), 0, 0);

            FbCommand command = new FbCommand(sqlSyntax, connection, transaction);
            command.CommandType = CommandType.Text;
            command.CommandTimeout = 2147483647;

            command.ExecuteNonQuery();
            transaction.Commit();
            command.Dispose();

          }
          catch (Exception ex) {
            Util.UErrorMessage(ex, 0, 0);
            transaction.Rollback();
            throw ex;
          }
          finally {

            this.DisConnect();

            Util.UDebugMessage(string.Format("-DB Excute "), 0, 0);
          }
        }
      }


    }
}