--- bin/SlaveInit 2000/12/21 14:27:11 1.1 +++ bin/SlaveInit 2003/08/15 23:00:12 1.6 @@ -1,4 +1,4 @@ -# -*- perl -*- +#!/usr/bin/perl -w # SlaveInit # Vadim Mikheev, (c) 2000, PostgreSQL Inc. @@ -6,29 +6,51 @@ & eval 'exec perl -S $0 $argv:q' if 0; +use strict; use Pg; use Getopt::Long; +use Sys::Hostname; $| = 1; -$result = GetOptions("debug!", "verbose!", "quiet!", "help", - "host=s", "user=s", "password=s"); - -my $debug = $opt_debug || 0; -my $verbose = $opt_verbose || 0; -my $quiet = $opt_quiet || 0; - -if (defined($opt_help) || (scalar(@ARGV) < 1)) { - print "Usage: $0 --host=name --user=name --password=string slavedb\n"; - exit ((scalar(@ARGV) < 1)? 1:0); +my ($debug,$verbose,$quiet) = (0,0,0); +my ($help,$masterhost,$masterport,$masteruser,$masterpassword, + $slavehost,$slaveport,$slaveuser,$slavepassword); + +my $result = GetOptions( + "debug!" => \$debug, "verbose!" => \$verbose, + "quiet!" => \$quiet, "help" => \$help, + "masterhost=s" => \$masterhost, "masterport=i" => \$masterport, + "masteruser=s" => \$masteruser, "masterpassword=s" => \$masterpassword, + "slavehost=s" => \$slavehost, "slaveport=i" => \$slaveport, + "slaveuser=s" => \$slaveuser, "slavepassword=s" => \$slavepassword, + ); + +if (defined($help) || (scalar(@ARGV) < 2)) { + print "Usage: $0 [options] masterdb slavedb +Options: + --masterhost=hostname --masterport=port + --masteruser=username --masterpassword=string + --slavehost=hostname --slaveport=port + --slaveuser=username --slavepassword=string +"; + exit ((scalar(@ARGV) < 2)? 1:0); } -my $slave = $ARGV[0] || "slave"; +my $master = $ARGV[0] || "master"; +my $slave = $ARGV[1] || "slave"; my $sinfo = "dbname=$slave"; -$sinfo = "$sinfo host=$opt_host" if (defined($opt_host)); -$sinfo = "$sinfo user=$opt_user" if (defined($opt_user)); -$sinfo = "$sinfo password=$opt_password" if (defined($opt_password)); +$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 $minfo = "dbname=$master"; +$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)); sub RollbackAndQuit { my $conn = shift @_; @@ -38,6 +60,8 @@ exit (-1); } +# First, lets add the needed information in the slave database + print("Connecting to $sinfo\n") if ($debug || $verbose); my $conn = Pg::connectdb($sinfo); if ($conn->status != PGRES_CONNECTION_OK) { @@ -45,21 +69,46 @@ exit 1; } -my $result = $conn->exec("BEGIN"); +$result = $conn->exec("BEGIN"); RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK); $result = $conn->exec("set transaction isolation level serializable"); RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK); $result = $conn->exec("create table _RSERV_SLAVE_TABLES_" . - " (tname name, cname name, reloid oid, key int4)"); + " (tname name not null, cname name not null, reloid oid not null, key int4 not null)"); RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK); $result = $conn->exec("create table _RSERV_SLAVE_SYNC_" . - " (syncid int4, synctime timestamp)"); + " (syncid int4 not null, synctime timestamp)"); RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK); + +# next, let's tell the master that the slave is set up. + +print("Connecting to $minfo\n") if ($debug || $verbose); +my $mconn = Pg::connectdb($minfo); +if ($mconn->status != PGRES_CONNECTION_OK) { + print STDERR "Failed opening $minfo\n"; + RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK); +# exit 1; +} + +my $host = defined($slavehost) ? $slavehost : hostname; + +$result = $mconn->exec("INSERT INTO _RSERV_SERVERS_ (host,dbase) VALUES ('$host','$slave')"); +if ($result->resultStatus ne PGRES_COMMAND_OK) { + print STDERR $mconn->errorMessage; + RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK); +# exit (-1); +} + + +# then commit the slave transaction + $result = $conn->exec("COMMIT"); RollbackAndQuit($conn) if ($result->resultStatus ne PGRES_COMMAND_OK); + + exit (0);