--- pgdiff 2003/08/13 13:27:32 1.6 +++ pgdiff 2003/10/29 18:00:39 1.12 @@ -43,7 +43,7 @@ --slavehost=hostname --slaveport=port --slaveuser=username --slavepassword=string --slavefile=filename - --tables[s]=table[,table...] + --table[s]=table[,table...] "; # exit ((scalar(@ARGV) < 2)? 1:0); exit; @@ -63,8 +63,20 @@ print "Master connection is $minfo\n" if ($debug); print "Slave connection is $sinfo\n" if ($debug); -my $mdbh = DBI->connect("DBI:Pg:$minfo", $masteruser, $masterpassword, { PrintError => 1 }); -my $sdbh = DBI->connect("DBI:Pg:$sinfo", $slaveuser, $slavepassword, { PrintError => 1 }); +my $mdbh = DBI->connect("DBI:Pg:$minfo", $masteruser, $masterpassword, { PrintError => 0 } ); +if (! $mdbh) { + print "Can't connect to master database $master"; + print "on $masterhost" if ($masterhost); + print "\n"; + exit 1; +} +my $sdbh = DBI->connect("DBI:Pg:$sinfo", $slaveuser, $slavepassword, { PrintError => 0 }); +if (! $sdbh) { + print "Can't connect to slave database $slave"; + print "on $slavehost" if ($slavehost); + print "\n"; + exit 1; +} my ($diff_shema,$diff_data) = (0,0); @@ -107,7 +119,8 @@ $verbose = 1 if ($debug); # init object for scheme in master database -my $mscheme = new Pg::Scheme( 'dbh' => $mdbh, 'DEBUG' => 0 ) || die "can't query schema"; +my $mscheme = new Pg::Scheme( 'dbh' => $mdbh, 'DEBUG' => 0 ) || die "can't query master schema"; +my $sscheme = new Pg::Scheme( 'dbh' => $sdbh, 'DEBUG' => 0 ) || die "can't query slave schema"; # which tables to compare? @@ -115,6 +128,16 @@ debug "Comparing tables: ".join(", ",@tables)."\n"; +# start transaction +print "begin work;\n"; + +# disable active triggers on slave database +my @triggers = $sscheme->get_activetriggers(); + +foreach my $tr (@triggers) { + print "update pg_trigger set tgenabled = false where tgname='$tr';\n"; +} + my $cols; my $diff_total = 0; @@ -122,7 +145,22 @@ my $sth; +print "-- schema...\n"; # diff schema + foreach my $row (@{$mscheme->pg_attribute($table)}) { +# print Dumper($row); + } + +print "-- constraints...\n"; + # diff constraints + foreach my $tr (@{$mscheme->triggers($table)}) { +# print Dumper($tr); + } +print "-- triggers...\n"; + # diff triggers + foreach my $tr (@{$mscheme->triggers($table)}) { +# print Dumper($tr); + } # all colums (for insert) my @cols = @{$mscheme->cols($table)}; @@ -143,7 +181,7 @@ my @cols_test; # all colums to test (without skipped) foreach my $row (@{$mscheme->pg_attribute($table)}) { - # attname | format_type | attnotnull | atthasdef | attnum + # attname format_type attnotnull atthasdef attnum default references # FIXME: do something with attributes which shouldn't be compared # (date, time, datetime, timestamp) @@ -207,11 +245,11 @@ debug_sql($msql); - my $msth = $mdbh->prepare($msql) || die; - $msth->execute() || die; + my $msth = $mdbh->prepare($msql) || die $mdbh->errstr; + $msth->execute() || die $msth->errstr; - my $ssth = $sdbh->prepare($ssql) || die; - $ssth->execute() || die; + my $ssth = $sdbh->prepare($ssql) || die $sdbh->errstr; + $ssth->execute() || die $ssth->errstr; my $diff_row = 0; @@ -369,7 +407,7 @@ if ($verbose) { if ($diff_total == 0) { - print STDERR "databases are same"; + print STDERR "databases are same\n"; } elsif ($diff_total > 0) { print STDERR "$diff_total differences in all tables\n"; } else { @@ -377,5 +415,12 @@ } } +# enable triggers again on slave +foreach my $tr (@triggers) { + print "update pg_trigger set tgenabled = true where tgname='$tr';\n"; +} +# end transaction +print "commit;\n"; + $mdbh->disconnect(); $sdbh->disconnect();