--- pgdiff 2003/08/12 18:45:04 1.4 +++ pgdiff 2003/08/12 20:38:02 1.5 @@ -107,7 +107,7 @@ $verbose = 1 if ($debug); # init object for scheme in master database -my $mscheme = new Pg::Scheme( 'dbh' => $mdbh ) || die "can't query schema"; +my $mscheme = new Pg::Scheme( 'dbh' => $mdbh, 'DEBUG' => 0 ) || die "can't query schema"; # which tables to compare? @@ -124,32 +124,35 @@ # diff schema - my @cols_notnull;# colums compared by a=b - my @cols_null; # colums compared by a=b or a is null and b is null + # all colums (for insert) + my @cols = @{$mscheme->cols($table)}; + + # colums compared by a=b + my @cols_notnull = @{$mscheme->cols_notnull($table)}; + + # colums compared by a=b or a is null and b is null + my @cols_null = @{$mscheme->cols_null($table)}; + + # primary key columns + my @cols_pk = @{$mscheme->cols_pk($table)}; + + # columns to compare (not in primary key) + my @cols_cmp = @{$mscheme->cols_notpk($table)}; + my @cols_skip; # skipped columns my @cols_test; # all colums to test (without skipped) - my @cols; # all colums (for insert) - - foreach my $row ($mscheme->explain_table($table)) { + foreach my $row (@{$mscheme->pg_attribute($table)}) { # attname | format_type | attnotnull | atthasdef | attnum - push @cols,$row->{attname}; - # FIXME: do something with attributes which shouldn't be compared # (date, time, datetime, timestamp) if ($row->{format_type} =~ /(date)|(time)/i) { push @cols_skip,$row->{attname}; - next; - } - - push @cols_test,$row->{attname}; - - if ($row->{attnotnull}) { - push @cols_notnull,$row->{attname}; } else { - push @cols_null,$row->{attname}; + push @cols_test,$row->{attname}; } + } if ($debug) { @@ -161,55 +164,11 @@ # diff data - my @cols_pk; # columns which are primary key - my %in_pk; - - $sql=" -SELECT - i.indexrelid as indexrelid, i.indrelid as indrelid, - count(a.attname) as cols_in_pk -FROM - pg_catalog.pg_class c, - pg_catalog.pg_index i, - pg_catalog.pg_attribute a -WHERE - c.oid = i.indrelid - and i.indisunique - and c.relname = '$table' - and a.attrelid = i.indexrelid -GROUP BY - i.indexrelid, i.indrelid, c.relname, i.indisprimary, i.indisunique -ORDER BY - cols_in_pk ASC, i.indisprimary DESC, i.indisunique DESC, c.relname DESC -"; - debug_sql($sql); - $sth = $mdbh->prepare($sql); - $sth->execute() || die; - my $row = $sth->fetchrow_hashref(); - if ($row) { - $sql=" - select a1.attname as attname from pg_attribute a1, pg_attribute a2 where a1.attrelid = ".$row->{indexrelid}." and a2.attrelid=".$row->{indrelid}." and a1.attname = a2.attname and a2.attnotnull"; - - debug_sql($sql); - my $sth2 = $mdbh->prepare($sql); - $sth2->execute() || die; - @cols_pk = (); - while (my $row2 = $sth2->fetchrow_hashref()) { - push @cols_pk,$row2->{attname}; - $in_pk{$row2->{attname}}++; - } - - } if (! @cols_pk) { print STDERR "can't find PK rows for table '$table' using all\n"; @cols_pk = @cols; } - my @cols_cmp; # columns to compare - - foreach my $col (@cols_test) { - push @cols_cmp,$col if (! $in_pk{$col}); - } if ($verbose) { print "table '$table' using for key: (",join(", ",@cols_pk),") to compare cols: (",join(", ",@cols_cmp),")\n";