#!/bin/ksh
###############################################################################
#  Script Name : repl_make_slavedb
#
#  Overview 
#     This script provides the simple interface to construct of slave db
#     Following jobs are executed step by step.
#    
#     STEP 0 : read the parameters
#     STEP 1 : add db info to $CUBRID_DATABASES/databases.txt
#     STEP 2 : restore the master db
#     STEP 3 : connect to the slave db
#     STEP 4 : rename the master db 
#     STEP 5 : Start the slave db server
#     STEP 6 : get the password of DBA 
#     STEP 7 : add the replication user
#     STEP 8 : change owner for the all classes
#     STEP 9 : drop user defined triggers
#     STEP 10: set the parameters
#
###############################################################################

###############################################################################
# function : print out usage info
###############################################################################
usage() {
  exec_name=`basename $0`
  echo "usage: $exec_name master_db_name slave_db_name -u userid -p passwd" 1>&2
  echo "       userid & passwd would be added for replication process "
  exit 1
}

###############################################################################
# function : print message
###############################################################################
print_mes_h() {
   case $1 in
    STEP1)
      echo "  STEP 1 : ¸¶½ºÅÍ DBÀÇ ¹é¾÷º»À» º¹±¸ÇÏ±â À§ÇÑ »çÀü ÀÛ¾÷À» ÁøÇàÇÕ´Ï´Ù."
      ;;
    STEP11)
      echo "       a. ±¸ÃàÇÒ ½½·¹ÀÌºê DBÀÇ º¼·ýÀÌ ÀúÀåµÉ µð·ºÅä¸® °æ·Î¸¦ ÀÔ·ÂÇÏ½Ã¿À."
      printf "           $CurDirÀÌ¸é ¿£ÅÍ Å°¸¦ ÀÔ·ÂÇÏ½Ã¿À. >> "
      ;;
    STEP12)
      echo "       b. ±¸ÃàÇÒ ½½·¹ÀÌºê DBÀÇ ·Î±× º¼·ýÀÌ ÀúÀåµÉ µð·ºÅä¸® °æ·Î¸¦ ÀÔ·ÂÇÏ½Ã¿À."
      printf "           $CurDirÀÌ¸é ¿£ÅÍ Å°¸¦ ÀÔ·ÂÇÏ½Ã¿À. >> "
      ;;
    STEP2)
      echo "  STEP 2 : ½½·¹ÀÌºê DB ¹é¾÷º»À» º¹±¸ÇÕ´Ï´Ù."
      echo "          - ¹é¾÷ ÆÄÀÏ°ú ¹é¾÷º¼·ý Á¤º¸ ÆÄÀÏÀÌ ¹Ýµå½Ã ÇöÀç µð·ºÅä¸®¿¡ Á¸ÀçÇØ¾ß ÇÕ´Ï´Ù."
      ;;
    PROG21)
      echo "          - ½½·¹ÀÌºê DB¸¦ º¹±¸ÇÏ°í ÀÖ½À´Ï´Ù. Àá½Ã¸¸ ±â´Ù·Á ÁÖ½Ã±â ¹Ù¶ø´Ï´Ù..."
      ;;
    PROG22)
      echo "          - ½½·¹ÀÌºê DB °¡ º¹±¸µÇ¾ú½À´Ï´Ù."
      ;;
    STEP3)
      echo "  STEP 3 : º¹±¸µÈ ÃÖÁ¾ ·Î±× ¹øÈ£¿Í ½½·¹ÀÌºê DB Á¤º¸¸¦ ¹èÆ÷ DB¿¡ ±â·ÏÇÕ´Ï´Ù."
      ;;
    STEP31)
      printf "       a. ¹èÆ÷ DB ÀÌ¸§À» ÀÔ·ÂÇÏ½Ã¿À. >> "
      ;;
    STEP311)
      echo "           - ¹èÆ÷ DB°¡ °°Àº È£½ºÆ®¿¡ ¾ø½À´Ï´Ù. "
      printf "           -  ¹èÆ÷ DB°¡ À§Ä¡ÇÑ È£½ºÆ®ÀÇ IP ÁÖ¼Ò¸¦ ÀÔ·ÂÇÏ½Ã¿À. >>  "
      ;;
    STEP32)
      printf "       b. ¹èÆ÷ DB¿¡ Á¢¼ÓÇÏ±â À§ÇÑ DBA °èÁ¤ÀÇ ¾ÏÈ£¸¦ ÀÔ·ÂÇÏ½Ã¿À. >> "
      ;;
    STEP4)
      echo "  STEP 4 : ½½·¹ÀÌºê DB¸¦ »ý¼ºÇÏ°í ±¸µ¿ÇÕ´Ï´Ù." 
      ;;
    STEP5)
      echo "  STEP 5 : ½½·¹ÀÌºê DB ±¸Ãà ÈÄ »çÈÄ Ã³¸® ´Ü°è"
      echo "          - ÀÌ ÀÛ¾÷À» À§ÇØ¼­´Â ¸¶½ºÅÍ DBÀÇ DBA °èÁ¤ÀÌ ÇÊ¿äÇÕ´Ï´Ù."
      ;;
    STEP51)
      printf "          - ¸¶½ºÅÍ DBÀÇ DBA °èÁ¤À» ÀÔ·ÂÇÏ½Ã¿À. >> "
      ;;
    WARN1)
      echo  "  WARNING: '$userid' ÀÌ¹Ì '$slave_db_name'¿¡ µî·ÏµÇ¾î ÀÖ½À´Ï´Ù."
      ;;
    REPL_ID_USE)
      printf  "   ÀÌ ID¸¦ º¹Á¦¿ëÀ¸·Î °è¼Ó »ç¿ëÇÏ½Ã°Ú½À´Ï±î? (y/n) >> "
      ;;
    REPL_CHANGE_PW)
      echo "   '$userid'ÀÇ ¾ÏÈ£´Â ÀÔ·ÂÇÏ½Å '$passwd'·Î º¯°æµË´Ï´Ù." 
      ;;
    INPUT_ID)
      printf "   »õ·Î¿î »ç¿ëÀÚ °èÁ¤À» ÀÔ·ÂÇÏ½Ã¿À. >> "
      ;;
    INPUT_PW)
      printf "   »õ·Î¿î ¾ÏÈ£¸¦ ÀÔ·ÂÇÏ½Ã¿À. >> "
      ;;
    STEP6)
      echo "  STEP 6 :  ÆÄ¶ó¹ÌÅÍ ¼³Á¤ ´Ü°è"
      ;;
    STEP7)
      echo "  STEP 7 : º¹Á¦ ±×·ì ¼³Á¤ ´Ü°è"
      echo "         - º¹Á¦ ´ë»ó Å¬·¡½º¸¦ ¼±Á¤ÇÕ´Ï´Ù. "
      ;;
  esac
}

print_mes_e() {
   case $1 in
    STEP1)
      echo "  STEP 1 : Preprocess to restore the master database..."
      ;;
    STEP11)
      echo "       a. Please provide the directory path of data volume. "
      printf "           Just enter if the target directory is $CurDir >> "
      ;;
    STEP12)
      echo "       b. Please provide the directory path of log volume. "
      printf "           Just enter if the target directory is $CurDir >> "
      ;;
    STEP2)
      echo "  STEP 2 : Restore the master database backup to make the slave database..."
      echo "          - Backup files and volume information file should be"
      echo "            in the current directory."
      ;;
    PROG21)
      echo "          - Now, restoring the master database backup, please wait a moment..."
      ;;
    PROG22)
      echo "          - Slave database is created."
      ;;
    STEP3)
      echo "  STEP 3 :  Insert the necessary information into the distributor database..."
      ;;
    STEP31)
      printf "       a. Provide the name of the distributor database. >> "
      ;;
    STEP311)
      echo "           - The target distributor database does not exists in the host."
      printf "           -  Please provide the IP address of the distributor database. >> "
      ;;
    STEP32)
      printf "       b. Provide the password of the DBA of distributor database. >> "
      ;;
    STEP4)
      echo "  STEP 4 : Start the slave database ..."
      ;;
    STEP5)
      echo "  STEP 5 : Post process after starting up the slave database..."
      echo "          - the DBA password of the master database is needed.."
      ;;
    STEP51)
      printf "          - Provide the DBA password of the master database. >> "
      ;;
    WARN1)
      echo  "  WARNING: '$userid' is already exists in '$slave_db_name'."
      ;;
    REPL_ID_USE)
      printf  "   Do you want to use this ID for the replication? (y/n) >> "
      ;;
    REPL_CHANGE_PW)
      echo "   The password of '$userid' would be set as '$passwd'."
      ;;
    INPUT_ID)
      printf "   Please provide the new user id. >> "
      ;;
    INPUT_PW)
      printf "   Please provide the new passwor.d >> "
      ;;
    STEP6)
      echo "  STEP 6 : Set the replication parameters..."
      ;;
    STEP7)
      echo "  STEP 7 : Set the replication group ..."
      ;;
  esac
}

print_mes() {
  if [ "$kor_yn" = "yes" ]
  then
    print_mes_h $1 $2
  else
    print_mes_e $1 $2
  fi
}

match_string ()
{
  MATCH=0
  NOMATCH=90
  PARAMS=2
  BAD_PARAMS=91

  [ $# -eq $PARAMS ] || return $BAD_PARAMS

  _PARAM1=`eval echo "$1" | tr a-z A-Z`
  _PARAM2=`eval echo "$2" | tr a-z A-Z`
  case "$_PARAM1" in
  "$_PARAM2") return $MATCH;;
  *   ) return $NOMATCH;;
  esac

}

###############################################################################
# function :  for processing error cases, clear all the temporary files
###############################################################################
print_error_h() {
  case $1 in
    no_msg)
      ;;
    err_check_env)
      printf " << ERROR >> È¯°æ º¯¼ö ¼³Á¤À» È®ÀÎÇÏ½Ã±â ¹Ù¶ø´Ï´Ù."
      echo "$2"
      ;;
    err_db_exists)
      echo " << ERROR >> $2 ÀÌ ÀÌ¹Ì $3/databases.txt ¿¡ ÀÖ½À´Ï´Ù."
      ;;
    err_directory_error)
      echo " << ERROR >> ÀÔ·ÂÇÏ½Å µð·ºÅä¸®°¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù."
      ;;
    err_file_error)
      echo " << ERROR >> $2 ÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù."
      ;;
    err_write_auth)
      echo " << ERROR >> µð·ºÅä¸®¿¡ ¾²±â ±ÇÇÑÀÌ ¾ø½À´Ï´Ù - $2"
      ;;
    err_restore)
      echo " << ERROR >> ½½·¹ÀÌºê DB º¹±¸ Áß ´ÙÀ½°ú °°Àº ¿À·ù°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù."
      echo $2
      ;;
    err_cant_find_port)
      echo " << ERROR >> ÇöÀç ÀÌ È£½ºÆ®¿¡¼­ ¼öÇàµÇ´Â ¸¶½ºÅÍÀÇ Æ÷Æ® ¹øÈ£¸¦ Ã£À» ¼ö ¾ø½À´Ï´Ù."
      echo "       $rootdir/conf/cubrid.conf ÆÄÀÏÀÇ cubrid_port_id¸¦ È®ÀÎÇÏ½Ã±â ¹Ù¶ø´Ï´Ù."
      ;;
    err_passwd)
      echo " << ERROR >> ¾ÏÈ£°¡ ¸ÂÁö ¾Ê½À´Ï´Ù. "
      ;;
    err_connect_dist)
      echo " << ERROR >> ¹èÆ÷ DB¿¡ Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù."
      ;;
    err_no_distdb_name)
      echo " << ERROR >> ¹èÆ÷ DB¸íÀÌ ÀÔ·ÂµÇÁö ¾Ê¾Ò½À´Ï´Ù."
      ;;
    err_ip_addr)
      echo " << ERROR >> IP ÁÖ¼Ò°¡ ÀÔ·ÂµÇÁö ¾Ê¾Ò½À´Ï´Ù."
      ;;
    err_master_info)
      echo " << ERROR >> '$distdb_name' DBÀÇ MASTER_INFO Å×ÀÌºí¿¡ ÇÊ¿äÇÑ Á¤º¸°¡ ¾ø½À´Ï´Ù."
      echo "              ¹èÆ÷ DB »óÅÂ¸¦ Á¡°ËÇÏ½Ã±â ¹Ù¶ø´Ï´Ù."
      ;;
    err_update_dist)
      echo " << ERROR >> ¹èÆ÷ DB¿¡ ÇÊ¿äÇÑ Á¤º¸¸¦ °»½ÅÇÏÁö ¸øÇß½À´Ï´Ù."
      echo "              ÀÔ·Â°ªÀ» È®ÀÎÇÏ½Ã±â ¹Ù¶ø´Ï´Ù."
      ;;
    err_add_user)
      echo " << ERROR >> ¾ÏÈ£ º¯°æÀÌ ½ÇÆÐÇß½À´Ï´Ù."
      ;;
  esac
}

print_error_e() {
  case $1 in
    no_msg)
      ;;
    err_check_env)
      printf " << ERROR >> Check the environment variable."
      echo "$2"
      ;;
    err_db_exists)
      echo " << ERROR >> $2 is already exists in $3/databases.txt." 
      ;;
    err_directory_error)
      echo " << ERROR >> Directory does not exists."
      ;;
    err_file_error)
      echo " << ERROR >> $2 does not exists."
      ;;
    err_write_auth)
      echo " << ERROR >> Write permission error for $2."
      ;;
    err_restore)
      echo " << ERROR >> During restoring the slave databases.. "
      echo $2
      ;;
    err_cant_find_port)
      echo " << ERROR >> Can't find the TCP port number for the master process."
      echo "             Please check 'cubrid_port_id' of $rootdir/conf/cubrid.conf"
      ;;
    err_passwd)
      echo " << ERROR>> Invalid Password.."
      ;;
    err_connect_dist)
      echo " << ERROR >> Can't connect to the distributor database."
      ;;
    err_no_distdb_name)
      echo " << ERROR >> Invalid distributor database name."
      ;;
    err_ip_addr)
      echo " << ERROR >> IP address should be provided."
      ;;
    err_master_info)
      echo " << ERROR >> No information in MASTER_INFO table of '$distdb_name'" 
      ;;
    err_update_dist)
      echo " << ERROR >> Can't update distributor database."
      echo "             Please check input values.. "
      ;;
    err_add_user)
      echo " << ERROR >> Can't add the target user. "
      ;;
  esac
}

error_exit() {

  if [ "$kor_yn" = "yes" ]
  then
    print_error_h $2 $3 $4
  else
    print_error_e $2 $3 $4
  fi

  if [ $1 -eq 0 ]
  then
    exit 1
  fi

  if [ $1 -eq 1 ]
  then
     mv $rootdir_db/.slavedb.databases.txt $rootdir_db/databases.txt 
     exit 1
  fi

  if [ $1 -eq 2 ]
  then
    $rootdir/bin/cubrid deletedb $master_db_name > /dev/null
    exit 1
  fi

  if [ $1 -gt 2 ]
  then
    $rootdir/bin/cubrid server stop $slave_db_name > /dev/null
    $rootdir/bin/cubrid deletedb $slave_db_name > /dev/null

    exit 1
  fi
}

debug_msg() {
  if [ $debug = 'y' ]
  then
    case $2 in
      sql)
        echo "############## DEBUG INFO #################"
        echo "$1 SQL : $3"
        echo "###########################################"
        ;;
      *)
        echo "############## DEBUG INFO #################"
        echo "$1 : $2"
        echo "###########################################"
        ;;
    esac
  fi
}

CurDir=`eval pwd`

###############################################################################
# STEP 0 : read the parameters 
###############################################################################
master_db_name=$1
slave_db_name=$2
debug='n'

while [ $# -ne 0 ]
do
  case $3 in 
     -u) 
        shift
        userid=$3
        ;;
     -p)
        shift
        passwd=$3
        ;;
     -debug)
        debug='y'
        ;;
     *)
        ;;
  esac
  shift
done

#check inputs
if [ -z "$master_db_name" ]
then
  usage
fi
if [ -z "$slave_db_name" ]
then
  usage
fi
if [ -z "$userid" ]
then
  usage
fi

###############################################################################
# trying to get root
###############################################################################
RootDir="CUBRID"

for i in $RootDir
do
  seevar="echo \$$i"
  rootdir=`eval $seevar`
  if [ -n "$rootdir" ]
  then
    break;
  fi
done

if [ -z "$rootdir" ]
then
  error_exit 0 err_check_env "- CUBRID" 
fi

RootDir="CUBRID_DATABASES"

for i in $RootDir
do
  seevar="echo \$$i"
  rootdir_db=`eval $seevar`
  if [ -n "$rootdir_db" ]
  then
    break;
  fi
done

if [ -z "$rootdir_db" ]
then
  error_exit 0 err_check_env "- CUBRID_DATABASES" 
fi

lang="$CUBRID_LANG"
if [ -z "$lang" ]
then
  lang="en_US"
fi

kor_yn="no"
if [ ! -z "$lang" ] && [ "$lang" = "ko_KR.euckr" ]
then
  kor_yn="yes"
fi


if [ "$kor_yn" = "yes" ]
then
echo "#########################################################################"
echo "#                                                                       #"
echo "#                CUBRID º¹Á¦ È¯°æ ±¸¼º : ½½·¹ÀÌºê DB   ±¸¼º             #"
echo "#                                                                       #"
echo "#   º¹Á¦ È¯°æÀ» ±¸¼ºÇÏ´Â ÀÛ¾÷Àº ´ÙÀ½°ú °°Àº ¼ø¼­·Î ÁøÇàµÇ¾î¾ß ÇÕ´Ï´Ù.   #"
echo "#        1. º¹Á¦¿¡ÀÌÀüÆ® ±¸¼º (make_distdb ½ºÅ©¸³Æ® ±¸µ¿)               #"
echo "#        2. ¸¶½ºÅÍ DB ÀüÃ¼ ¹é¾÷ (cubrid backup À¯Æ¿¸®Æ¼±¸µ¿)            #"
echo "#        3. ¸¶½ºÅÍ DB ¹é¾÷º» º¹»ç (¸¶½ºÅÍ DB È£½ºÆ®->½½·¹ÀÌºê DB È£½ºÆ®)#"
echo "#        4. ½½·¹ÀÌºê DB ±¸Ãà (make_slavedb ½ºÅ©¸³Æ® ±¸µ¿)               #"
echo "#        5. º¹Á¦¼­¹ö ±¸µ¿ (repl_server À¯Æ¿¸®Æ¼ ±¸µ¿)                   #"
echo "#        6. º¹Á¦¿¡ÀÌÀüÆ® ±¸µ¿ (repl_agent À¯Æ¿¸®Æ¼ ±¸µ¿)                #"
echo "#                                                                       #"
echo "#     NOTE1: ½½·¹ÀÌºê DB ±¸¼º Àü¿¡ ¹Ýµå½Ã make_distdb ½ºÅ©¸³Æ®¸¦        #"
echo "#            ÀÌ¿ëÇÏ¿© ¹èÆ÷DB¸¦ »ý¼ºÇØ¾ß ÇÕ´Ï´Ù.                         #"
echo "#     NOTE2: ¸¶½ºÅÍ DB¿¡ ´ëÇÏ¿© ÀüÃ¼ ¹é¾÷À» ¼öÇàÇØ¾ß ÇÕ´Ï´Ù.            #"
echo "#            ¹é¾÷¹Þ´Â ½ÃÁ¡Àº ½½·¹ÀÌºê DB ±¸Ãà½ÃÁ¡ ÀÌÀüÀÌ¸é ¾ðÁ¦µç       #"
echo "#            »ó°ü¾øÀ¸³ª, ¿Â¶óÀÎ¹é¾÷À» ÇÏ´Â °æ¿ì °¡±ÞÀû ½½·¹ÀÌºê DB¸¦    #"
echo "#            ±¸ÃàÇÏ±â ¹Ù·Î Àü¿¡ ¼öÇàÇÏ½Ã¸é ÃÊ±â º¹Á¦¿¡  ¼Ò¿äµÇ´Â        #"
echo "#            ½Ã°£À» Àý¾àÇÒ ¼ö ÀÖ½À´Ï´Ù.                                 #"
echo "#            ÇÊ¿äÇÑ ¹é¾÷ ÆÄÀÏÀº ´ÙÀ½°ú °°½À´Ï´Ù.                        #"
echo "#               -  master_db_name.bk_vinf                               #"
echo "#               -  master_db_name.bk0v???                               #"
echo "#     NOTE3: ÇöÀç ÀÌ ½ºÅ©¸³Æ®´Â ¹Ýµå½Ã °¡Á®¿Â ¹é¾÷ ÆÄÀÏÀÌ ÀÖ´Â          #"
echo "#            µð·ºÅä¸®¿¡¼­ ¼öÇàµÇ¾î¾ß ÇÕ´Ï´Ù.                            #"
echo "#                                                                       #"
echo "#   Ctr-C µîÀ¸·Î ºñÁ¤»óÀûÀ¸·Î ½ºÅ©¸³Æ®¸¦ Áß´ÜÇÏ´Â °æ¿ì¿¡´Â              #"
echo "#   cubrid server stop/cubrid delete µîÀÇ À¯Æ¿¸®Æ¼¸¦ ÀÌ¿ëÇÏ¿©           #"
echo "# ½½·¹ÀÌºê DB¸¦ »èÁ¦ÇÑ  ÈÄ ´Ù½Ã ¼öÇàÇÏ½Ê½Ã¿À.                           #"
echo "#########################################################################"
else
echo "#########################################################################"
echo "#                                                                       #"
echo "#                    Constructing the slave database                    #"
echo "#                                                                       #"
echo "#   To configure the replication environment,                           #"
echo "#        1. Configure the replication agent (using make_distdb script)  #"
echo "#        2. Back up the master database (using cubrid backup)           #"
echo "#        3. Copy the backup files to the slave site                     #"
echo "#        4. Construct the slave database (using make_slavedb script)    #"
echo "#        5. Start the repl_server at the master site                    #"
echo "#        6. Start the repl_agent at the slave site                      #"
echo "#                                                                       #"
echo "#   NOTE1: Please create and configure the distributor database         #"
echo "#          using make_distdb script before executing this script.       #"
echo "#   NOTE2: Please back up the master database before constructing       #"
echo "#          the slave databases. If you back up the master database just #"
echo "#          before constructing the slave database, you can save the     #"
echo "#          time to synchronize the master database and slave database.  #"
echo "#          Following files should be copied to the slave site..         #"
echo "#                          -  master_db_name.bk_vinf                    #"
echo "#                          -  master_db_name.bk0v???                    #"
echo "#   NOTE3: It's necessary to execute this script at the directory       #"
echo "#          in which the backup files locate.                            #"
echo "#                                                                       #"
echo "#   When you stop this script using Ctrl-C, please retry again after    #"
echo "#   deleting the distributor database using cubrid server stop and      #"
echo "#   then cubrid delete.                                                 #"
echo "#########################################################################"
fi

###############################################################################
# STEP 1 : add db info to $CUBRID_DATABASES/databases.txt
###############################################################################
print_mes STEP1   # prepare to restore the master database
#check the databases.txt 
if [ ! -f $rootdir_db/databases.txt ]
then
  touch $rootdir_db/databases.txt
fi

exec 5< $rootdir_db/databases.txt

while read -u5 db_name etc
do
 if [ "$db_name" = "$master_db_name" ]
 then
   error_exit 0 err_db_exists $master_db_name $rootdir_db  
 fi
done

exec 5<&-

exec 5< $rootdir_db/databases.txt

while read -u5 db_name etc
do
 if [ "$db_name" = "$slave_db_name" ]
 then
   error_exit 0 err_db_exists $slave_db_name $rootdir_db
 fi
done

exec 5<&-

#Now, append a row to the $CUBRID_DATABASES/databases.txt

print_mes STEP11       # read the directory path of the slave data volume
read db_vol_path
if [ -z "$db_vol_path" ]
then
db_vol_path=$CurDir
echo "                 $db_vol_path" # notify default dir
fi

if [ ! -d $db_vol_path ]
then
  error_exit 0 err_directory_error 
fi

print_mes STEP12      # read the directory path of the slave log volume
read log_vol_path
if [ -z "$log_vol_path" ]
then
log_vol_path=$CurDir
echo "                 $log_vol_path" # notify default dir
fi

if [ ! -d $log_vol_path ]
then
  error_exit 0 err_directory_error 
fi

if [ ! -f $rootdir_db/databases.txt ]
then
  touch $rootdir_db/databases.txt
fi

host=`eval hostname`
cp $rootdir_db/databases.txt $rootdir_db/.slavedb.databases.txt
echo "$master_db_name $db_vol_path $host $log_vol_path" >> $rootdir_db/databases.txt


###############################################################################
# STEP 2 : restore the master db 
###############################################################################
# Check if exists the backup volume info
print_mes STEP2    # restore the master database to make the slave slave

file="$master_db_name"_bkvinf
if [ ! -f "$file" ]
then
  error_exit 1 err_file_error $file    # no file error
fi

mv $file $file.ori        # save original _bkvinf

touch $log_vol_path/$file # make temporary _bkvinf to the log_vol_path
if [ ! -f $log_vol_path/$file ]
then
  mv $file.ori $file      # restore original _bkvinf
  error_exit 1 err_write_auth $log_vol_path   # write authorization failure
fi

exec 5< $file.ori
while read -u5 dum1 dum2 vol_path
do
  cur_bkfile=$CurDir/${vol_path##*/}
  if [ ! -f $cur_bkfile ]
  then
    rm $log_vol_path/$file  # remove temporary _bkvinf in the log_vol_path
    mv $file.ori $file      # restore original _bkvinf
    error_exit 1 err_file_error $cur_bkfile 
  fi
  # replace bk_vol path as log_vol_path
  echo "$dum1 $dum2 $cur_bkfile" >> $log_vol_path/$file
done

exec 5<&-

# restore the master db
print_mes PROG21    # restoring the slave database.. wait a moment
$rootdir/bin/cubrid restoredb -p -r $master_db_name -u 2> .slave.tmp 1> .slave.tmp2
result=`eval cat .slave.tmp | grep ERROR`

if [ -n "$result" ]
then
  rm $log_vol_path/$file  # remove temporary _bkvinf in the log_vol_path
  mv $file.ori $file      # restore original _bkvinf
  err_msg=`eval cat .slave.tmp`
  error_exit 1 err_restore $err_msg 
fi

rm $log_vol_path/$file  # remove temporary _bkvinf in the log_vol_path
mv $file.ori $file      # restore original _bkvinf

result=`cat .slave.tmp2 | grep Last_lsa > .slave.tmp`

# get the last lsa applied
pageid=`eval cat .slave.tmp | cut -f 2 -d ':' | cut -f 1 -d '|'`
offset=`eval cat .slave.tmp | cut -f 2 -d ':' | cut -f 2 -d '|'`

if [ -z "$pageid" ] || [ -z "$offset" ]
then
  error_exit 1 err_restore 
fi

print_mes PROG22   # restoring the slave db is finished

###############################################################################
# STEP 3 : ¹èÆ÷ DB¿¡ ÇÊ¿äÇÑ Á¤º¸ ±â·Ï
###############################################################################
print_mes STEP3    # insert the necessary data into the distributor db
host=`eval hostname`
eval cat $rootdir/conf/cubrid.conf | grep cubrid_port_id > .slave.tmp
portnum=""
while read line
do
  cubrid_port_id=`eval echo "$line" | cut -c1-14`
  if [ "$cubrid_port_id" = "cubrid_port_id" ]
  then
    portnum=`eval echo "$line" | cut -c16-26`
  fi
done < .slave.tmp

if [ -z "$portnum" ]
then
  error_exit 2 err_cant_find_port $rootdir
fi

count=1

while [ $count -lt 3 ]
do
  print_mes STEP31    # enter the name of the distributor database
  read distdb_name 
  if [ -z "$distdb_name" ]
  then
    error_exit -1 err_no_distdb_name
  else
    break;
  fi
  count=$(($count+1))
done

if [ $count -eq 3 ]
then
  error_exit 2 no_msg
fi

exec 5< $rootdir_db/databases.txt

while read -u5 db_name etc
do
 if [ "$db_name" = "$distdb_name" ]
 then
  result=$db_name
  break
 fi
done

exec 5<&-

if [ -z "$result" ] 
then
  print_mes STEP311   # enter the ip address of the distributor database
  read distip

  if [ -z "$distip" ]
  then
    error_exit 2 err_ip_addr
  fi
  echo "$distdb_name na $distip na" >> $rootdir_db/databases.txt
fi


count=1
while [ $count -lt  3  ]
do
  print_mes STEP32   # enter the password of the distributor db
  read distpw
  $rootdir/bin/csql $distdb_name -u DBA -p "$distpw" -c "commit" 2> .slave.tmp 
  result=`eval cat .slave.tmp | egrep "Incorrect or missing password"`

  if [ -n "$result" ]
  then
    count=$(($count+1))
    error_exit -1 err_passwd
  else 
    result=`eval cat .slave.tmp | grep "Failed to connect"`
    if [ -n "$result" ]
    then
      error_exit 2 err_connect_dist  # can't connect to dist db
    fi
    break;
  fi
done

if [ $count -eq 3 ]
then
  error_exit 2 err_connect_dist # can't connect to dist db
fi

sql="select * from master_info where dbname = '$master_db_name'"
debug_msg $LINENO sql "$sql"
$rootdir/bin/csql $distdb_name -u DBA -p "$distpw" -c "$sql" > .slave.tmp

result=`eval cat .slave.tmp | egrep "no results"`

if [ -n "$result" ]
then
  error_exit 2 err_master_info
fi

sql="delete from slave_info;
     insert into slave_info(dbid, dbname, master_ip, portnum, userid, 
            passwd, trails)
     values (
       select decode(max(dbid), 1, max(dbid)+1) from db_info,
       '$slave_db_name', '$host', $portnum, '$userid', '$passwd', NULL);
     delete from trail_info;
     insert into trail_info(master_dbid, slave_dbid, final_pageid,
            final_offset, all_repl, repl_count, status, error_msg, 
            stop_time, perf_poll_interval, log_apply_interval, 
            for_recovery, index_replication, restart_interval)
     values (
       select dbid from master_info 
          where dbname = '$master_db_name', 
       select dbid from slave_info 
          where dbname = '$slave_db_name', 
       $pageid, $offset, 'y', 0, 'f', NULL, NULL, 10, 0, 'n', 'n', 100); 
     update slave_info set trails = 
        set(select trail_info from trail_info 
           where slave_dbid = (select dbid from slave_info 
                                   where dbname = '$slave_db_name') 
        ) where dbname = '$slave_db_name'"

debug_msg $LINENO sql "$sql"
$rootdir/bin/csql $distdb_name -u DBA -p "$distpw" -c "$sql"  2> .dist.tmp

result=`eval cat .dist.tmp | grep ERROR`

if [ -n "$result" ]
then
  error_exit 2 err_update_dist
fi


###############################################################################
# STEP 4 : Rename the master db & Start the slave server
###############################################################################
print_mes STEP4       # start the slave database
# rename 
result=`eval $rootdir/bin/cubrid renamedb $master_db_name $slave_db_name`


#start the slave db server
`eval $rootdir/bin/cubrid server start $slave_db_name > /dev/null `

#make history file
sql="select e_value from env_info where e_name='trail_log'"
debug_msg $LINENO sql "$sql"
$rootdir/bin/csql $distdb_name -u DBA -p "$distpw" -c "$sql"  > .dist.tmp

exec 5< .dist.tmp

dist_log_path=""
count=1
while read -u5 e_value
do
  if [ $count -gt 5 ]
  then
     if [ -n "$e_value" ]
     then
       dist_log_path=$e_value
       break;
     fi
  fi
  (( count=count+1 ))
done

if [ -z "$dist_log_path" ]
then
  error_exit 3 no_mes    # exit without any message
fi

$rootdir/bin/cubrid unloaddb -C -s $slave_db_name 1> /dev/null 2> /dev/null
if [ -f "$distdb_name"_schema ]
then
  user_shcema=""
  while read line
  do
    is_add=`echo "$line" | grep "^call change_owner"`
    if [ -n "$is_add" ]
    then
      user_schema=$user_schema"$line
"
    fi
    is_add=`echo "$line" | grep "^GRANT "`
    if [ -n "$is_add" ]
    then
      user_schema=$user_schema"$line
"
    fi
  done < "$distdb_name"_schema

  debug_msg $LINENO "$user_schema"

  echo "$user_schema" > "$dist_log_path"/"$distdb_name".hist
  rm "$slave_db_name"_schema > /dev/null
fi

if [ -f "distdb_name"_trigger ]
then
  cat "$slave_db_name"_trigger >> "$dist_log_path"/"$distdb_name".hist 
  rm "$slave_db_name"_trigger > /dev/null
fi


###############################################################################
# STEP 5 : »çÈÄ Ã³¸® ÁøÇà 
###############################################################################
print_mes STEP5      # post process after strating the slave db
#check the DBA password
count=0
while [ $count -lt  3  ]
do
  print_mes STEP51
  read dba_pass
  $rootdir/bin/csql $slave_db_name -u DBA -p "$dba_pass" -c "commit" 2> .slave.tmp
  result=`eval cat .slave.tmp | grep Incorrect`
  if [ -n "$result" ]
  then
    error_exit -1 err_passwd
    count=$(($count+1))
  else
    break;
  fi
done

if [ $count -eq 3 ]
then
  error_exit 3 no_mes    # exit without any message
fi

# add replication user
count=1
while [ $count -lt 3 ]
do 
  sql="select name from db_user where name = upper('$userid')"
  debug_msg $LINENO sql "$sql"
  $rootdir/bin/csql $slave_db_name -u DBA -p "$dba_pass" -c "$sql" 1> .slave.tmp
  result=`eval cat .slave.tmp | egrep "no results"`

  if [ -n "$result" ]
  then
    result=`eval echo add`
    break;
  else
    print_mes WARN1              # already existing user id
  fi

  print_mes REPL_ID_USE          # want to use this id for replication ?
  read useyn

  if [ "$useyn" =  "y" ]
  then
    print_mes REPL_CHANGE_PW    # change password ... 
    result=`eval echo change`
    break;
  else
    print_mes INPUT_ID
    read userid
    print_mes INPUT_PW
    read passwd
    useyn=n
  fi
  count=$(($count+1))
done

if [ "$result" = "add" ]
then
  sql="call add_user ('$userid', '$passwd') on class db_user to repl_user;
       call find_user('dba') on class db_user to dba;
       call add_member (repl_user) on dba;
       commit;"
  debug_msg $LINENO sql "$sql"
  $rootdir/bin/csql $slave_db_name -u DBA -p "$dba_pass" -c "$sql" 1> .slave.tmp
  result=`eval cat .slave.tmp | grep ERROR`
  if [ -n "$result" ]
  then
    error_exit 3 err_add_user
    final
    error_exit 3
  fi
else 
  if [ "$result" = "change" ]
  then
    sql="SELECT name 
         FROM  (SELECT u.name
                FROM db_user u, TABLE(groups) AS t(g)
                WHERE t.g.name = 'DBA'
                UNION
                SELECT u.name 
                FROM db_user u
                WHERE u.name = 'DBA') AS dba_t(name)
         WHERE dba_t.name = upper('$userid');"
    debug_msg $LINENO sql "$sql"
    $rootdir/bin/csql $slave_db_name -u DBA -p "$dba_pass" -c "$sql" 1> .slave.tmp
    result=`eval cat .slave.tmp | egrep "no results"`
    if [ -n "$result" ]
    then
      sql="call find_user (upper('$userid')) on class db_user to repl_user; 
           call set_password('$passwd') on repl_user;
           call find_user('dba') on class db_user to dba;
           call add_member (repl_user) on dba;
           commit;"
    else
      sql="call find_user (upper('$userid')) on class db_user to repl_user; 
           call set_password('$passwd') on repl_user;
           commit;"
    fi
    debug_msg $LINENO sql "$sql"
    $rootdir/bin/csql $slave_db_name -u DBA -p "$dba_pass" -c "$sql" 1> .slave.tmp
    result=`eval cat .slave.tmp | grep ERROR`
    if [ -n "$result" ]
    then
      error_exit 3 err_add_user
    fi
  else
    error_exit 3 err_add_user
  fi
fi

# change owner for the all classes
sql="select class_name from db_class where is_system_class = 'NO' difference select partition_class_name from db_partition"
debug_msg $LINENO sql "$sql"
$rootdir/bin/csql $slave_db_name -u DBA -p "$dba_pass" -c "$sql" > .class.tmp

exec 5< .class.tmp

count=1
while read -u5 class_name
do
  if [ $count -gt 5 ]
  then
     if [ -n "$class_name" ]
     then
       sql="call change_owner($class_name, '$userid') on class db_authorizations"
       debug_msg $LINENO sql "$sql"
       $rootdir/bin/csql $slave_db_name -u DBA -p "$dba_pass" -c "$sql" > /dev/null
     fi
  fi
  (( count=count+1 ))
done

# drop user defined triggers
sql="select trigger_name from db_trig where trigger_name <> 'glo_delete_contents'"
debug_msg $LINENO sql "$sql"
$rootdir/bin/csql $slave_db_name -u DBA -p "$dba_pass" -c "$sql" > .slave.tmp

exec 5< .slave.tmp

count=1
while read -u5 trigger_name
do
  if [ $count -gt 5 ]
  then
     if [ -n "$trigger_name" ]
     then
       trigger_name=`eval expr $trigger_name`
       sql="drop trigger $trigger_name"
       debug_msg $LINENO sql "$sql"
       $rootdir/bin/csql $slave_db_name -u DBA -p "$dba_pass" -c "$sql" 
     fi
  fi
  (( count=count+1 ))
done

if [ "$kor_yn" = "yes" ]
then
  CUBRID_LANG=ko_KR
  export CUBRID_LANG
else
  CUBRID_LANG=en_US
  export CUBRID_LANG
fi
print_mes STEP6
$rootdir/bin/repl_change_param $master_db_name $slave_db_name $distdb_name

print_mes STEP7    # set the replication group 
exec 5< .class.tmp

$rootdir/bin/csql $distdb_name -u DBA -p "$distpw" -c "delete from class_info" > .slave.tmp
count=1
while read -u5 class_name
do
  if [ $count -gt 5 ]
  then
     if [ -n "$class_name" ]
     then
       sql="insert into class_info values (select dbid from master_info where dbname = '$master_db_name',  $class_name)"
       debug_msg $LINENO sql "$sql"
       $rootdir/bin/csql $distdb_name -u DBA -p "$distpw" -c "$sql" > .slave.tmp
     fi
  fi
  (( count=count+1 ))
done

$rootdir/bin/repl_make_group "$master_db_name" "$distdb_name" -p "$distpw"
