/[pgdiff]/pgdiff
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /pgdiff

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.5 by dpavlin, Tue Aug 12 20:38:02 2003 UTC revision 1.10 by dpavlin, Sun Oct 26 19:22:36 2003 UTC
# Line 43  Options: Line 43  Options:
43          --slavehost=hostname --slaveport=port          --slavehost=hostname --slaveport=port
44          --slaveuser=username --slavepassword=string          --slaveuser=username --slavepassword=string
45          --slavefile=filename          --slavefile=filename
46          --tables[s]=table[,table...]          --table[s]=table[,table...]
47  ";  ";
48  #    exit ((scalar(@ARGV) < 2)? 1:0);  #    exit ((scalar(@ARGV) < 2)? 1:0);
49      exit;      exit;
# Line 63  $sinfo = "$sinfo port=$slaveport" if (de Line 63  $sinfo = "$sinfo port=$slaveport" if (de
63  print "Master connection is $minfo\n" if ($debug);  print "Master connection is $minfo\n" if ($debug);
64  print "Slave connection is $sinfo\n" if ($debug);  print "Slave connection is $sinfo\n" if ($debug);
65    
66  my $mdbh = DBI->connect("DBI:Pg:$minfo", $masteruser, $masterpassword, { PrintError => 1 });  my $mdbh = DBI->connect("DBI:Pg:$minfo", $masteruser, $masterpassword, { PrintError => 0 } );
67  my $sdbh = DBI->connect("DBI:Pg:$sinfo", $slaveuser, $slavepassword, { PrintError => 1 });  if (! $mdbh) {
68            print "Can't connect to master database $master";
69            print "on $masterhost" if ($masterhost);
70            print "\n";
71            exit 1;
72    }
73    my $sdbh = DBI->connect("DBI:Pg:$sinfo", $slaveuser, $slavepassword, { PrintError => 0 });
74    if (! $sdbh) {
75            print "Can't connect to slave database $slave";
76            print "on $slavehost" if ($slavehost);
77            print "\n";
78            exit 1;
79    }
80    
81  my ($diff_shema,$diff_data) = (0,0);  my ($diff_shema,$diff_data) = (0,0);
82    
# Line 107  sub debug { Line 119  sub debug {
119  $verbose = 1 if ($debug);  $verbose = 1 if ($debug);
120    
121  # init object for scheme in master database  # init object for scheme in master database
122  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";
123    my $sscheme = new Pg::Scheme( 'dbh' => $sdbh, 'DEBUG' => 0 ) || die "can't query slave schema";
124    
125  # which tables to compare?  # which tables to compare?
126    
# Line 115  my @tables = $mscheme->list_tables($tabl Line 128  my @tables = $mscheme->list_tables($tabl
128    
129  debug "Comparing tables: ".join(", ",@tables)."\n";  debug "Comparing tables: ".join(", ",@tables)."\n";
130    
131    # start transaction
132    print "begin work;\n";
133    
134    # disable active triggers on slave database
135    my @triggers = $sscheme->get_triggers();
136    
137    foreach my $tr (@triggers) {
138            print "update pg_trigger set tgenabled = false where tgname='$tr';\n";
139    }
140    
141  my $cols;  my $cols;
142  my $diff_total = 0;  my $diff_total = 0;
143    
# Line 207  foreach my $table (@tables) { Line 230  foreach my $table (@tables) {
230    
231          debug_sql($msql);          debug_sql($msql);
232    
233          my $msth = $mdbh->prepare($msql) || die;          my $msth = $mdbh->prepare($msql) || die $mdbh->errstr;
234          $msth->execute() || die;          $msth->execute() || die $msth->errstr;
235    
236          my $ssth = $sdbh->prepare($ssql) || die;          my $ssth = $sdbh->prepare($ssql) || die $sdbh->errstr;
237          $ssth->execute() || die;          $ssth->execute() || die $ssth->errstr;
238    
239          my $diff_row = 0;          my $diff_row = 0;
240    
# Line 266  foreach my $table (@tables) { Line 289  foreach my $table (@tables) {
289    
290                  # insert into slave database                  # insert into slave database
291                  sub sql_insert {                  sub sql_insert {
292                            my $dbh = shift @_ || die "need dbh";
293                          my $table = shift @_ || die "need table as argument";                          my $table = shift @_ || die "need table as argument";
294                          my $row = shift @_ || die "need row data";                          my $row = shift @_ || die "need row data";
295                          my @cols = @_;                          my @cols = @_;
# Line 273  foreach my $table (@tables) { Line 297  foreach my $table (@tables) {
297                          my $sql = "insert into $table (".join(",",@cols).") values (";                          my $sql = "insert into $table (".join(",",@cols).") values (";
298                          my $comma = "";                          my $comma = "";
299                          foreach my $col (@cols) {                          foreach my $col (@cols) {
300                                  $sql .= $comma.$mdbh->quote($row->{$col});                                  $sql .= $comma.$dbh->quote($row->{$col});
301                                  $comma = ",";                                  $comma = ",";
302                          }                          }
303                          $sql.=")";                          $sql.=")";
# Line 283  foreach my $table (@tables) { Line 307  foreach my $table (@tables) {
307    
308                  # delete from slave database                  # delete from slave database
309                  sub sql_delete {                  sub sql_delete {
310                            my $dbh = shift @_ || die "need dbh";
311                          my $table = shift @_ || die "need table as argument";                          my $table = shift @_ || die "need table as argument";
312                          my $row = shift @_ || die "need row as argument";                          my $row = shift @_ || die "need row as argument";
313                          my @cols_pk = @_;                          my @cols_pk = @_;
314    
315                          my $where = sql_where(@cols_pk);                          my $where = sql_where(@cols_pk);
316    
317                          my $sql = "delete from $table ";                          my $sql = "delete from $table";
318                          foreach my $col (@cols_pk) {                          foreach my $col (@cols_pk) {
319                                  my $val = $sdbh->quote($row->{$col}) || die "can't find value in row for col $col";                                  my $val = $dbh->quote($row->{$col}) || die "can't find value in row for col $col";
320                                  $where =~ s/\?/$val/;                                  $where =~ s/\?/$val/;
321                          }                          }
322                          $sql .= $where;                          $sql .= $where;
# Line 301  foreach my $table (@tables) { Line 326  foreach my $table (@tables) {
326    
327                  # update row in slave database                  # update row in slave database
328                  sub sql_update {                  sub sql_update {
329                            my $dbh = shift @_ || die "need dbh";
330                          my $table = shift @_ || die "need table as argument";                          my $table = shift @_ || die "need table as argument";
331                          my $col = shift @_ || die "need col to update";                          my $col = shift @_ || die "need col to update";
332                          my $val = shift @_ || die "need new val";                          my $row = shift @_ || die "need row";
333                          my @cols_pk = @_ || die "need pk idenitifier";                          my @cols_pk = @_;
334    
335                          my $sql = "udate $table set $col=".$mdbh->quote($val);                          my $sql = "update $table set $col=".$dbh->quote($row->{$col});
336                            my $where = sql_where(@cols_pk);
337                            foreach my $col (@cols_pk) {
338                                    my $val = $dbh->quote($row->{$col}) || die "can't find value in row for col $col";
339                                    $where =~ s/\?/$val/;
340                            }
341                            $sql .= $where;
342                          debug_sql($sql);                          debug_sql($sql);
343                          return $sql;                          return $sql;
344                  }                  }
# Line 326  foreach my $table (@tables) { Line 358  foreach my $table (@tables) {
358                                  $diff_row++;                                  $diff_row++;
359                                  $pk_same = 0;                                  $pk_same = 0;
360                                  print STDERR "EXTRA row in table '$table' pk: [".join(",",@cols_pk)."] value (".join(",",pk_val($srow,@cols_pk)).")\n" if ($verbose);                                  print STDERR "EXTRA row in table '$table' pk: [".join(",",@cols_pk)."] value (".join(",",pk_val($srow,@cols_pk)).")\n" if ($verbose);
361                                  print sql_delete($table,$srow,@cols_pk),";\n";                                  print sql_delete($sdbh,$table,$srow,@cols_pk),";\n";
362                                  $have_srow = FETCH_ROW;                                  $have_srow = FETCH_ROW;
363                                  last;                                  last;
364                          } elsif ( ($have_mrow == HAVE_ROW && $have_srow == NO_ROW) ||                          } elsif ( ($have_mrow == HAVE_ROW && $have_srow == NO_ROW) ||
# Line 334  foreach my $table (@tables) { Line 366  foreach my $table (@tables) {
366                                  $diff_row++;                                  $diff_row++;
367                                  $pk_same = 0;                                  $pk_same = 0;
368                                  print STDERR "MISSING row in table '$table' pk: [".join(",",@cols_pk)."] value (".join(",",pk_val($mrow,@cols_pk)).")\n" if ($verbose);                                  print STDERR "MISSING row in table '$table' pk: [".join(",",@cols_pk)."] value (".join(",",pk_val($mrow,@cols_pk)).")\n" if ($verbose);
369                                  print sql_insert($table,$mrow,@cols),";\n";                                  print sql_insert($mdbh,$table,$mrow,@cols),";\n";
370                                  $have_mrow = FETCH_ROW;                                  $have_mrow = FETCH_ROW;
371                                  last;                                  last;
372                          }                          }
# Line 346  foreach my $table (@tables) { Line 378  foreach my $table (@tables) {
378                                  if ($mrow->{$col} ne $srow->{$col}) {                                  if ($mrow->{$col} ne $srow->{$col}) {
379                                          $diff_row++;                                          $diff_row++;
380                                          print STDERR "DIFF in table '$table' row ($col): [".join(",",@cols_pk)."] '$mrow->{$col}' != '$srow->{$col}'\n" if ($verbose);                                          print STDERR "DIFF in table '$table' row ($col): [".join(",",@cols_pk)."] '$mrow->{$col}' != '$srow->{$col}'\n" if ($verbose);
381                                          print sql_update($table,$col,$mrow->{$col},@cols_pk),";\n";                                          print sql_update($mdbh,$table,$col,$mrow,@cols_pk),";\n";
382                                  }                                  }
383                          }                          }
384                          $have_mrow = FETCH_ROW;                          $have_mrow = FETCH_ROW;
# Line 368  if ($verbose) { Line 400  if ($verbose) {
400          }          }
401  }  }
402    
403    # enable triggers again on slave
404    foreach my $tr (@triggers) {
405            print "update pg_trigger set tgenabled = true where tgname='$tr';\n";
406    }
407    # end transaction
408    print "commit;\n";
409    
410  $mdbh->disconnect();  $mdbh->disconnect();
411  $sdbh->disconnect();  $sdbh->disconnect();

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.10

  ViewVC Help
Powered by ViewVC 1.1.26