#!/bin/sh
:	'(c) Copyright	Empress Software Inc.	1983, 2003'

if test "$EMPRESSPATH" = "" 
then
	echo "EMPRESSPATH not set"
	exit 1

elif test ! -d $EMPRESSPATH
then
	echo "invalid EMPRESSPATH"
	exit 1
else
	RDBMSPATH=$EMPRESSPATH/rdbms
	export RDBMSPATH
fi

PROGNAME=`$EMPRESSPATH/common/sys_bin/basename $0`
USAGE="*** Usage ***  $PROGNAME  [-a file/device] [-f] [-v] database"

. $RDBMSPATH/util_bin/banner
. $EMPRESSPATH/config/options

NLSECHO="$EMPRESSPATH/common/nls/nlsecho"
UE_E0_ARCHNOTCONTDB=10038
UE_E0_DBNOTFOUND=10049
UE_E0_DBSERVERNOTRUN=10357
UE_E0_ISNOTADB=10073
UE_E0_ISNOTALOCALDB=10354
UE_E0_NORECLOG=10017
UI_E0_ABORTORCONT=10020
UI_E0_ABOUTADVRECLOG=10044
UI_E0_ABOUTREMDB=10039
UI_E0_ABOUTRESTORE=10072
UI_E0_ADVRECLOG=10045
UI_E0_CHECKARCH=10037
UI_E0_DBRECOVER=10071
UI_E0_DONE=10030
UI_E0_ENSURE=10027
UI_E0_ENTERFILENAME=10018
UI_E0_LOOKREMTAB=10021
UI_E0_OKAY=10032
UI_E0_RECABORT=10046
UI_E0_RECCOMPL=10047
UI_E0_RECFRLOG=10042
UI_E0_RECLOGTOUSE=10043
UI_E0_REMDB=10040
UI_E0_RESTOREDB=10041

ARCH="/dev/rmt0"
FORCE=false
while :
do
	case "$1" in
	 -a | -A)
		case $# in
		 1)
			echo "$USAGE"
			exit 1
			;;
		esac
		shift
		ARCH=$1
		;;
	 -f | -F)
		FORCE=true
		;;
	 -v | -V)
		MSQLECHO=batch
		export MSQLECHO
		;;
	 *)
		break
		;;
	esac
	shift
done

case $# in
 1)
	LOGDB="$1"
	;;
 *)
	echo "$USAGE"
	exit 1
	;;
esac

DBLOC=`$EMPRESSPATH/bin/empadm "$LOGDB" dblocation`

case "$DBLOC" in
    *" NO_DB")
	$NLSECHO  "*** '%s' not found *** " $UE_E0_DBNOTFOUND $LOGDB
	exit 8
	;;
    *" NO_SV")
	$NLSECHO "Server for database '%s' not running; cannot access database" $UE_E0_DBSERVERNOTRUN $LOGDB
	exit 8
	;;
    *" OK")
	PHYDB=`echo "$DBLOC" | sed -e "s/ OK//"`
	;;
    *)
	$NLSECHO  "*** '%s' not found *** " $UE_E0_DBNOTFOUND $LOGDB
	exit 8
	;;
esac

case $PHYDB in
  *:*)
	$NLSECHO  "*** '%s' is not a local database ***" $UE_E0_ISNOTALOCALDB \
		$LOGDB
	exit 8
esac

if test -f "$PHYDB"
then
	$NLSECHO  "*** '%s' is not a database ***" $UE_E0_ISNOTADB $LOGDB
	exit 8
fi

TABZERO="$PHYDB/tabzero"
XTABZERO="$PHYDB/_tabzero"
DBPERMS="$PHYDB/_dbperms"

LABEL=
case $FORCE in
 false)
	while :
	do
		LABEL="file"
		case $ARCH in
		 /dev/*)
			LABEL="device"
			;;
		esac
		
		$NLSECHO  "Database '%s' will be recovered from %s '%s'" $UI_E0_DBRECOVER $LOGDB $LABEL $ARCH

                $NLSECHO -n  "Okay (y/n)? " $UI_E0_OKAY
		read ANSWER

		case $ANSWER in 
		 y*|Y*)
			break
			;;
		 n*|N*)
                        $NLSECHO  "Enter file/device name for archiving" $UI_E0_ENTERFILENAME
			read ARCH
			;;
		esac
	done
	;;
esac

$NLSECHO  "Checking archive for database '%s'" $UI_E0_CHECKARCH $LOGDB

case "$FORCE$LABEL" in
 falsedevice)
	$NLSECHO  "Please ensure that %s '%s' is ready" $UI_E0_ENSURE $LABEL $ARCH
	while :
	do
                $NLSECHO -n  "Enter a to abort, c to continue: " $UI_E0_ABORTORCONT
		read ANSWER
		case "$ANSWER" in
		 a*|A*)
			exit 0
			;;
		 c*|C*)
			break
			;;
		esac
	done
	;;
esac

$EMPRESSPATH/common/sys_bin/un_arch $ARCH $DBPERMS

if test ! -s $DBPERMS
then
	$NLSECHO  "*** Archive does not contain Database '%s' ***" $UE_E0_ARCHNOTCONTDB $LOGDB
	exit 1
fi

rm "$DBPERMS"

if test -d "$PHYDB"
then
	$NLSECHO  "Looking for remote tables" $UI_E0_LOOKREMTAB

	$RDBMSPATH/exec/empadm "$LOGDB" shmcreate > /dev/null 2>&1

	REMOTELIST=`$EMPRESSPATH/bin/empcmd "$LOGDB" \
		'select tab_location  from sys_tables dump where tab_location != NULL'`

	case $FORCE in
	 false)
		$NLSECHO  "About to remove the old database" $UI_E0_ABOUTREMDB
		while :
		do
			$NLSECHO -n  "Enter a to abort, c to continue: " $UI_E0_ABORTORCONT
			read ANSWER
			case "$ANSWER" in
			 a*|A*)
				exit 0
				;;
			 c*|C*)
				break
				;;
			esac
		done
		;;
	esac

	$NLSECHO  "Removing the old database ..." $UI_E0_REMDB

	$RDBMSPATH/exec/empadm "$LOGDB" shmrmall > /dev/null 2>&1

	(cd "$PHYDB"; rm -fr *)
	for RD in $REMOTELIST
	do
		(cd "$RD"; rm -fr *)
	done

fi

case "$FORCE$LABEL" in
 falsedevice)
	$NLSECHO  "About to restore database '%s' from %s '%s'" $UI_E0_ABOUTRESTORE $LOGDB $LABEL $ARCH
	while :
	do
                $NLSECHO -n  "Enter a to abort, c to continue: " $UI_E0_ABORTORCONT
		read ANSWER
		case "$ANSWER" in
		 a*|A*)
			exit 0
			;;
		 c*|C*)
			break
			;;
		esac
	done
	;;
esac

$NLSECHO  "Restoring database '%s' ..." $UI_E0_RESTOREDB $LOGDB

$EMPRESSPATH/common/sys_bin/un_arch $ARCH

$NLSECHO  "Done" $UI_E0_DONE

VERSION=`grep 'MSDBVERSION=' "$XTABZERO" | sed 's/.*=//'`

case "$VERSION" in
   "2*" | "4*" | "6" | "6.0" | "")	OLDBACKUP=true ;;
   *)					OLDBACKUP=false ;;
esac

$NLSECHO  "Now recovering from log files" $UI_E0_RECFRLOG
sh "$DBPERMS" "$LOGDB"
rm -f "$DBPERMS"

LOG1=`grep MSDBRECOVERYLOG1 "$XTABZERO"`
LOG1=`echo $LOG1 | sed -e "s/MSDBRECOVERYLOG1=//"`
LOG1=`echo $LOG1.* | sed -e "s/.* //"`
LOG2=`grep MSDBRECOVERYLOG2 "$XTABZERO"`
LOG2=`echo $LOG2 | sed -e "s/MSDBRECOVERYLOG2=//"`
LOG2=`echo $LOG2.* | sed -e "s/.* //"`

RLOG1=" "
RLOG2=" "
BOTH_LOGS_USED=""

case "$LOG1" in
	"")	;;
	*)
		if test -f "$LOG1" && test -f "$LOG2"
		then
			BOTH_LOGS_USED="on"
			RLOG1=`echo "$LOG1" | sed -e "s/.*\///" -e "s/\.[0-9]*//"`EMPrl1$$
			mv "$LOG1" "$RLOG1"
			RLOG2=`echo "$LOG2" | sed -e "s/.*\///" -e "s/\.[0-9]*//"`EMPrl2$$
			mv "$LOG2" "$RLOG2"
			mv "$XTABZERO" "$TABZERO"
			$EMPRESSPATH/bin/emprlini "$PHYDB"
			mv "$TABZERO" "$XTABZERO"
			
		else 
			if test -f "$LOG1"
			then
				RLOG1=`echo "$LOG1" | sed -e "s/.*\///" -e "s/\.[0-9]*//"`EMPrl1$$
				mv "$LOG1" "$RLOG1"
				mv "$XTABZERO" "$TABZERO"
				$EMPRESSPATH/bin/emprlini "$PHYDB"
				mv "$TABZERO" "$XTABZERO"
			fi
		fi
		;;
esac

case "$BOTH_LOGS_USED" in
	"")
	case "$LOG2" in
		"")	;;
		*)
			if test -f "$LOG2"
			then
				RLOG2=`echo "$LOG2" | sed -e "s/.*\///" -e "s/\.[0-9]*//"`EMPrl2$$
				mv "$LOG2" "$RLOG2"
				mv "$XTABZERO" "$TABZERO"
				$EMPRESSPATH/bin/emprlini "$PHYDB"
				mv "$TABZERO" "$XTABZERO"
			fi
			;;
	esac
	;;
	*) ;;
esac

case "$RLOG1" in
 ' ')
	case "$RLOG2" in
	 ' ')
                $NLSECHO  "*** User Error *** no Recovery Logs Specified" $UE_E0_NORECLOG
		exit 8
		;;
	 *)
		LOG="$RLOG2"
		;;
	esac
	;;
 *)
	case "$RLOG2" in
	 ' ')
		LOG="$RLOG1"
		;;
	 *)
		if cmp "$RLOG1" "$RLOG2" > /dev/null 2>&1
		then
			LOG="$RLOG1"
		else
			while :
			do
				$NLSECHO  "Which recovery log do you wish to use (1 or 2) ?" $UI_E0_RECLOGTOUSE
				echo "  1 = '$LOG1'"
				echo "  2 = '$LOG2'"
				read ANSWER
				case "$ANSWER" in
				 1)
					LOG="$RLOG1"
					break
					;;
				 2)
					LOG="$RLOG2"
					break
					;;
				esac
			done
		fi
		;;
	esac
	;;
esac

# This used to be done later, and simulated in msdbdfname, but
# because it is an obsolescent feature, it has been simplified
# and moved.  This means that a client _could_ start up during
# the recovery and cause problems.

mv "$XTABZERO" "$TABZERO"

$RDBMSPATH/exec/empadm "$LOGDB" shmcreate > /dev/null 2>&1

case $FORCE in
 false)
        $NLSECHO  "About to advance the recovery log" $UI_E0_ABOUTADVRECLOG
	while :
	do
                $NLSECHO -n  "Enter a to abort, c to continue: " $UI_E0_ABORTORCONT
		read ANSWER
		case "$ANSWER" in
		 a*|A*)
			exit 0
			;;
		 c*|C*)
			break
			;;
		esac
	done
	;;
esac
$NLSECHO  "Advancing the recovery log" $UI_E0_ADVRECLOG

trap '
        $NLSECHO  "*** Recovery Aborted ***" $UI_E0_RECABORT
	exit 5
' 2

TMPF=`$EMPRESSPATH/common/sys_bin/tmpdir`/"emprec$$"

if $OLDBACKUP
then
	$RDBMSPATH/exec/emputil -EDLOG "$LOG" $TMPF
fi

# Clear the locks - must occur AFTER tabzero is restored

$EMPRESSPATH/bin/empclrlk -RECOVERY "$LOGDB"

if $OLDBACKUP
then
	$RDBMSPATH/exec/empsql -RECOVERY "$LOGDB" < $TMPF
else
	$RDBMSPATH/exec/emputil -RECOVER "$LOG" "$LOGDB"
fi

rm -f $TMPF

if test "$OLDBACKUP" = false -a "$RLOG1" != ' ' -a -f "$RLOG1"
then
	mv "$RLOG1" "$LOG1"
fi

if test "$OLDBACKUP" = false -a "$RLOG2" != ' ' -a -f "$RLOG2"
then
	mv "$RLOG2" "$LOG2"
fi

trap '' 2
$NLSECHO  "Recovery completed" $UI_E0_RECCOMPL
