#!/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] database"

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

NLSECHO="$EMPRESSPATH/common/nls/nlsecho"
UE_E0_CANNOTDISACC=10023
UE_E0_DBNOTFOUND=10049
UE_E0_DBNOTFOUND=10049
UE_E0_DBNOTFOUND=10049
UE_E0_DBSERVERNOTRUN=10357
UE_E0_ISNOTADB=10073
UE_E0_ISNOTADB=10073
UE_E0_ISNOTALOCALDB=10354
UE_E0_NORECLOG=10017
UI_E0_ABORTORCONT=10020
UI_E0_ABORTORCONT=10020
UI_E0_ABOUTARCHIVE=10028
UI_E0_ACCESSOK=10019
UI_E0_ARCHABORT=10026
UI_E0_ARCHABORT=10026
UI_E0_ARCHABORT=10026
UI_E0_ARCHDB=10029
UI_E0_ARCHIVELAB=10070
UI_E0_CHECKPERM=10024
UI_E0_DISABLEACC=10022
UI_E0_DONE=10030
UI_E0_ENABLEACC=10025
UI_E0_ENABLEACC=10025
UI_E0_ENSURE=10027
UI_E0_ENTERFILENAME=10018
UI_E0_LOOKREMTAB=10021
UI_E0_OKAY=10032
UI_E0_RMTTABLE_MISSING=10259
UI_E0_TRUNRECLOG=10031

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
		;;
	 *)
		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

if test -d "$PHYDB"
then
	:
else
	$NLSECHO  "*** '%s' not found *** " $UE_E0_DBNOTFOUND $LOGDB
	exit 8
fi

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

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

LOG1=`grep MSDBRECOVERYLOG1 "$TABZERO"`
LOG1=`echo $LOG1 | sed -e "s/MSDBRECOVERYLOG1=//"`
LOG2=`grep MSDBRECOVERYLOG2 "$TABZERO"`
LOG2=`echo $LOG2 | sed -e "s/MSDBRECOVERYLOG2=//"`
case "$LOG1$LOG2" in
 "")
        $NLSECHO  "*** User Error *** no Recovery Logs Specified" \
		$UE_E0_NORECLOG
	exit 8
	;;
esac

LABEL=
case $FORCE in
 false)
	while :
	do
		LABEL="file"
		case $ARCH in
		 /dev/*)
			LABEL="device"
			;;
		esac
		$NLSECHO  "Archiving %s will be '%s'" $UI_E0_ARCHIVELAB \
				$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

	$NLSECHO  "Please ensure that no users are accessing database '%s'" \
			$UI_E0_ACCESSOK $LOGDB
	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  "Looking for remote tables" $UI_E0_LOOKREMTAB
REMOTELIST=`$EMPRESSPATH/bin/empcmd "$LOGDB" \
	'select tab_location  from sys_tables dump where tab_location != NULL'`

$NLSECHO  "Disabling access to database '%s'" $UI_E0_DISABLEACC $LOGDB
if mv "$TABZERO" "$XTABZERO"
then	:
else
	$NLSECHO  "*** User Error *** Cannot Disable Access to database '%s'" \				$UE_E0_CANNOTDISACC $LOGDB
        $NLSECHO  "Please check permissions" $UI_E0_CHECKPERM
	exit 8
fi

trap '
        $NLSECHO  "Enabling access to database " $UI_E0_ENABLEACC
	mv "$XTABZERO" "$TABZERO"
' 0
trap '
	rm -f "$DBPERMS"
        $NLSECHO  "*** Archive Aborted ***" $UI_E0_ARCHABORT
	exit 5
' 2

PERMS=`ls -ld "$PHYDB"`
UPERMS=`expr "$PERMS" : 'd\(...\)'`
GPERMS=`expr "$PERMS" : 'd...\(...\)'`
OPERMS=`expr "$PERMS" : 'd......\(...\)'`

PERMS=`echo "chmod u=$UPERMS,g=$GPERMS,o=$OPERMS" | sed -e 's/-//g'`
echo "$PERMS" "$PHYDB" > "$DBPERMS"

case "$FORCE$LABEL" in
 falsedevice)
	$NLSECHO  "About to archive database '%s' onto %s '%s'" \
		$UI_E0_ABOUTARCHIVE $LOGDB $LABEL $ARCH
	$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


for I in $REMOTELIST
do
	if test -r $I
	then 
		:
	else
		$NLSECHO "Cannot access remote table directory '%s'" \
			$UI_E0_RMTTABLE_MISSING $I
        	$NLSECHO  "*** Archive Aborted ***" $UI_E0_ARCHABORT
		rm -f "$DBPERMS"
		exit 5
	fi
done

$NLSECHO  "Archiving database '%s'..." $UI_E0_ARCHDB $LOGDB

$EMPRESSPATH/common/sys_bin/do_arch $ARCH $PHYDB $REMOTELIST
STATUS=$?

rm -f "$DBPERMS"

case "$STATUS" in
 0)
	;;
 *)
        $NLSECHO  "*** Archive Aborted ***" $UI_E0_ARCHABORT
	exit 5
	;;
esac

$NLSECHO  "Done" $UI_E0_DONE
trap 2

$NLSECHO  "Truncating recovery logs" $UI_E0_TRUNRECLOG

mv "$XTABZERO" "$TABZERO"

trap 0

MSDEBUG="$MSDEBUG noshmem noserver"
export MSDEBUG

$RDBMSPATH/exec/emputil -RECLOGINIT -t $PHYDB
$NLSECHO "Enabling access to database " $UI_E0_ENABLEACC
