/[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.4 by dpavlin, Tue Aug 12 18:45:04 2003 UTC revision 1.5 by dpavlin, Tue Aug 12 20:38:02 2003 UTC
# Line 107  sub debug { Line 107  sub debug {
107  $verbose = 1 if ($debug);  $verbose = 1 if ($debug);
108    
109  # init object for scheme in master database  # init object for scheme in master database
110  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";
111    
112  # which tables to compare?  # which tables to compare?
113    
# Line 124  foreach my $table (@tables) { Line 124  foreach my $table (@tables) {
124    
125          # diff schema          # diff schema
126    
127          my @cols_notnull;# colums compared by a=b          # all colums (for insert)
128          my @cols_null;  # colums compared by a=b or a is null and b is null          my @cols = @{$mscheme->cols($table)};
129    
130            # colums compared by a=b
131            my @cols_notnull = @{$mscheme->cols_notnull($table)};
132    
133            # colums compared by a=b or a is null and b is null
134            my @cols_null = @{$mscheme->cols_null($table)};
135    
136            # primary key columns
137            my @cols_pk = @{$mscheme->cols_pk($table)};
138    
139            # columns to compare (not in primary key)
140            my @cols_cmp = @{$mscheme->cols_notpk($table)};
141    
142          my @cols_skip;  # skipped columns          my @cols_skip;  # skipped columns
143          my @cols_test;  # all colums to test (without skipped)          my @cols_test;  # all colums to test (without skipped)
         my @cols;       # all colums (for insert)  
   
144    
145          foreach my $row ($mscheme->explain_table($table)) {          foreach my $row (@{$mscheme->pg_attribute($table)}) {
146                  # attname | format_type | attnotnull | atthasdef | attnum                  # attname | format_type | attnotnull | atthasdef | attnum
147    
                 push @cols,$row->{attname};  
   
148                  # FIXME: do something with attributes which shouldn't be compared                  # FIXME: do something with attributes which shouldn't be compared
149                  # (date, time, datetime, timestamp)                  # (date, time, datetime, timestamp)
150                  if ($row->{format_type} =~ /(date)|(time)/i) {                  if ($row->{format_type} =~ /(date)|(time)/i) {
151                          push @cols_skip,$row->{attname};                          push @cols_skip,$row->{attname};
                         next;  
                 }  
   
                 push @cols_test,$row->{attname};  
   
                 if ($row->{attnotnull}) {  
                         push @cols_notnull,$row->{attname};  
152                  } else {                  } else {
153                          push @cols_null,$row->{attname};                          push @cols_test,$row->{attname};
154                  }                  }
155    
156          }          }
157    
158          if ($debug) {          if ($debug) {
# Line 161  foreach my $table (@tables) { Line 164  foreach my $table (@tables) {
164    
165          # diff data          # diff data
166    
         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}}++;  
                 }  
                   
         }  
167          if (! @cols_pk) {          if (! @cols_pk) {
168                  print STDERR "can't find PK rows for table '$table' using all\n";                  print STDERR "can't find PK rows for table '$table' using all\n";
169                  @cols_pk = @cols;                  @cols_pk = @cols;
170          }          }
171    
         my @cols_cmp;   # columns to compare  
   
         foreach my $col (@cols_test) {  
                 push @cols_cmp,$col if (! $in_pk{$col});  
         }  
172    
173          if ($verbose) {          if ($verbose) {
174                  print "table '$table' using for key: (",join(", ",@cols_pk),") to compare cols: (",join(", ",@cols_cmp),")\n";                  print "table '$table' using for key: (",join(", ",@cols_pk),") to compare cols: (",join(", ",@cols_cmp),")\n";

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

  ViewVC Help
Powered by ViewVC 1.1.26