#!/usr/bin/perl

# ------------------------------------------------------------------------
# hotrest -- restore from hotarch
#            G. Patterson, Nov 2001

# Set the common parameters (contained in common.pl)
use File::Basename;
$MyPath = dirname($0);
require "$MyPath\\common.pl";
use Time::Local;

# ------------------------------------------------------------------------

sub LogMsg{
	my @t = localtime(time);
	printf LOG "%04d-%02d-%02d %02d:%02d %s\n",
		$t[5]+1900,$t[4]+1,$t[3],$t[2],$t[1],$_[0];
}

# ------------------------------------------------------------------------

sub problem{
# Err Houston? ... Houston ... We have a problem ...
	LogMsg "ERROR: $_[0]";
	die "$_[0]\n";
}

# ------------------------------------------------------------------------

sub check_database_down{
# database must be DOWN!
	# my $sqltmp = "$tmpdir\\check_database_down.sql";
	open SQL,">$sqltmp" || die "cannot open $sqltmp\n";
	print SQL "connect $userid/$passwd\@$orasid\nexit\n";
	my @t = `svrmgrl \@$sqltmp`;
	unlink $sqltmp;
	problem "Cannot $MyName a running database. Shut It Down First!"
		unless grep (/ORA-01034:/,@t);
}

# ------------------------------------------------------------------------

sub get_oraparm{
# retrieve parameter values from arcdir\\0header
	open (HDR,"$arcdir\\0header") || die "Cannot open $arcdir\\0header\n";
	while (<HDR>){
		s/\s+$//;
		s/^\s+//;
		if (/\w+ started at /){
			$start_str = $';
			@start = split(' ',$start_str);
			@start = reverse (split( /-/,$start[0]),
					split(/:/,$start[1]));
			$start[4]--;
			$start[5] -= 1900;
		}
		elsif (/(\w+) FILES:$/){
			$get_data = lc($1) . "_files";
		}
		elsif (/^$/){
			undef($get_data);
		}
		elsif (/^(.+): /){
			$oraparm{$1} = $';
		}
		elsif ($get_data){
			push(@$get_data,$_);
		}
		else{
			print "$_";
			problem "problem with 0header";
		}
	}
}

# ------------------------------------------------------------------------

# Main ... start here:
$MyName = basename $0,"\.pl";
die "usage: $MyName sys_passwd db_name\n" unless (@ARGV == 2);
$userid = "sys";
$passwd = $ARGV[0];
$orasid = $ARGV[1];
@start = localtime(time);
$start_str = sprintf "%04d-%02d-%02d %02d:%02d:%02d",$start[5]+1900,
		$start[4]+1,$start[3],$start[2],$start[1],$start[0];
$logfile = sprintf "%s\\%s_%s_%02d%02d%02d.log",$logdir,$orasid,$MyName,
		$start[5]%100,$start[4]+1,$start[3];
open(LOG,">>$logfile") || die "error opening $logfile\n";
check_database_down();
$arcdir = "$arcdir\\$orasid";
get_oraparm();
problem "$oraparm{ORACLE_SID} does not match $orasid"
	unless (uc($oraparm{ORACLE_SID}) eq uc($orasid));
LogMsg "commencing hotrest";
print "overwriting control files\n";
unlink "$arcdir\\$MyName.tmp.zip";
foreach $x (@ctrl_files){
	$p = dirname( $x);
	chdir $p || die "cannot chdir to $p";
	$b = basename( $x);
	system "$zipadd $arcdir\\$MyName.tmp $b";
	$cmd = "copy $arcdir\\" . uc($orasid) . "_CTRL.FILE $x";
	system "$cmd";
}
print "overwriting datafiles -- it is too late to change your mind\n";
foreach $x (@data_files){
	($n,$blks,$junk) = split(' ', $x);
	$p = dirname( $n);
	chdir $p || die "cannot chdir to $p";
	$b = basename( $n);
	LogMsg "unzipping $b ...";
	system "$unzip $arcdir\\$b";
	$size = ( -s $n);
	problem "datafile size" unless ( $size == $blks * $oraparm{BLOCK_SIZE})
}
print "moving existing logs to $arcdir\\$MyName.tmp\n";
$p = dirname( $log_files[0]);
chdir $p || die "cannot chdir to $p";
$cmd = "$zipmv $arcdir\\$MyName.tmp " . uc($orasid) . '*';
system "$cmd";
print "restoring log files\n";
system "$unzip $arcdir\\archivelog";
print "$MyName complete -- media recovery required\n";
LogMsg "$MyName completed normal";

