--- bin/PrepareSnapshot 2003/08/05 09:20:08 1.2 +++ bin/PrepareSnapshot 2003/10/30 23:01:07 1.10 @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/perl -w # PrepareSnapshot # Vadim Mikheev, (c) 2000, PostgreSQL Inc. @@ -6,52 +6,107 @@ & eval 'exec perl -S $0 $argv:q' if 0; -use lib "/usr/share/postgresql/contrib"; +BEGIN { + my $basedir = $0; $basedir =~ s#/[^/]+$##; + unshift(@INC, "$basedir/../share"); +} +use strict; use IO::File; use Getopt::Long; use RServ; $| = 1; -$result = GetOptions("debug!", "verbose!", "help", "snapshot=s", - "host=s", "user=s", "password=s"); +my ($debug,$verbose) = (0,0); +my ($help,$masterhost,$masterport,$masteruser,$masterpassword, + $slavehost,$slaveport,$slaveuser,$slavepassword); +my $snapshot; + +my $result = GetOptions( + "debug!" => \$debug, "verbose!" => \$verbose, "help" => \$help, + "masterhost=s" => \$masterhost, "masterport=i" => \$masterport, + "masteruser=s" => \$masteruser, "masterpassword=s" => \$masterpassword, + "snapshot=s" => \$snapshot, + ); + +if (defined($help) || (scalar(@ARGV) < 2)) { + print "Usage: $0 [options] masterdb slavedb +Options: + --masterhost=hostname --masterport=port + --masteruser=username --masterpassword=string + --snapshot=snapshot +"; + exit ((scalar(@ARGV) < 2)? 1:0); +} -my $debug = $opt_debug || 0; -my $verbose = $opt_verbose || 0; -my $snapshot = $opt_snapshot || "__Snapshot"; - -if (defined($opt_help) || (scalar(@ARGV) < 1)) { - print "Usage: $0 --snapshot=file --host=name --user=name --password=string masterdb\n"; - exit ((scalar(@ARGV) < 1)? 1:0); +$RServ::quiet = !$verbose; +if ($debug) { + $RServ::quiet = 0; + no warnings 'vars'; + $RServ::debug = $debug; } my $master = $ARGV[0] || "master"; -my $server = 0; +my $slave = $ARGV[1] || "slave"; my $minfo = "dbname=$master"; -$minfo = "$minfo host=$opt_host" if (defined($opt_host)); -$minfo = "$minfo user=$opt_user" if (defined($opt_user)); -$minfo = "$minfo password=$opt_password" if (defined($opt_password)); - -my $conn = Pg::connectdb($minfo); +$minfo = "$minfo host=$masterhost" if (defined($masterhost)); +$minfo = "$minfo port=$masterport" if (defined($masterport)); +$minfo = "$minfo user=$masteruser" if (defined($masteruser)); +$minfo = "$minfo password=$masterpassword" if (defined($masterpassword)); + +my $sinfo = "dbname=$slave"; +$sinfo = "$sinfo host=$slavehost" if (defined($slavehost)); +$sinfo = "$sinfo port=$slaveport" if (defined($slaveport)); +$sinfo = "$sinfo user=$slaveuser" if (defined($slaveuser)); +$sinfo = "$sinfo password=$slavepassword" if (defined($slavepassword)); + +my $mconn = Pg::connectdb($minfo); +if ($mconn->status != Pg::PGRES_CONNECTION_OK) { + print STDERR "Failed opening $minfo\n"; + exit 1; +} +my $sconn = Pg::connectdb($sinfo); +if ($sconn->status != Pg::PGRES_CONNECTION_OK) { + print STDERR "Failed opening $minfo\n"; + exit 1; +} -my $outf = new IO::File; -$outf = STDOUT; +my $outf; +if (defined($snapshot)) { + $outf = new IO::File; + $outf->open("> $snapshot"); +} else { + $outf = *STDOUT; +} -$RServ::quiet = !$verbose; +$slavehost = 'localhost' if (! $slavehost); +my $slaveId = GetServerId($mconn, $slave, $slavehost); +if (! defined($slaveId)) { + print STDERR "Can't find SlaveId for db '$slave' on host $slavehost. Is this database slave?\n"; + exit 1; +} +die "Unknown SlaveId $slaveId for host $slavehost" if ($slaveId < 0); -$res = PrepareSnapshot ($conn, $outf, $server); +$masterhost = 'localhost' if (! $masterhost); +my $masterId = GetServerId($mconn, $master, $masterhost); +if (! defined($masterId)) { + print STDERR "Can't find masterId for db '$master' on host $masterhost. Is this database master?\n"; + exit 1; +} +die "Unknown masterId $masterId for host $masterhost" if ($masterId < 0); +my $res = PrepareSnapshot ($mconn, $sconn, $outf, $masterId, $slaveId); if ($res == 0) { - printf STDERR "Sync-ed\n"; - exit(0); + printf STDERR "Sync-ed\n"; + exit(0); } if ($res > 0) { - printf STDERR "Snapshot dumped to STDOUT\n"; - exit(0); + printf STDERR "Snapshot dumped.\n"; + exit(0); } printf STDERR "ERROR\n";