changing SQL::Translator::Diff to use producer_args instead of producer_options
Peter Rabbitson [Tue, 23 Feb 2010 10:41:28 +0000 (10:41 +0000)]
Use Carp instead of warn and fix noisy tests
Release 0.11004
Patch by Dan Horne (RT#49413)
Add primary key index type support to mysql grammar
Make PG-parser trace subject to debug (RT#52276)
Extend test a bit (the btree seems to be discarded atm)
Support commit; in loaded Pg DDL
Changes
r1657@Thesaurus (orig r1656):  acmoore | 2010-02-10 17:52:41 +0100
r1661@Thesaurus (orig r1660):  rabbit | 2010-02-14 10:22:53 +0100
r1662@Thesaurus (orig r1661):  rabbit | 2010-02-14 10:45:33 +0100
r1663@Thesaurus (orig r1662):  rabbit | 2010-02-14 10:54:24 +0100
r1664@Thesaurus (orig r1663):  rabbit | 2010-02-14 11:06:41 +0100
r1665@Thesaurus (orig r1664):  rabbit | 2010-02-14 11:13:51 +0100
r1666@Thesaurus (orig r1665):  rabbit | 2010-02-14 11:26:57 +0100
r1667@Thesaurus (orig r1666):  rabbit | 2010-02-14 11:29:13 +0100
r1668@Thesaurus (orig r1667):  rabbit | 2010-02-14 11:38:23 +0100

13 files changed:
AUTHORS
Changes
lib/SQL/Translator.pm
lib/SQL/Translator/Diff.pm
lib/SQL/Translator/Parser/DBI/Oracle.pm
lib/SQL/Translator/Parser/DBI/PostgreSQL.pm
lib/SQL/Translator/Parser/MySQL.pm
lib/SQL/Translator/Parser/PostgreSQL.pm
t/02mysql-parser.t
t/14postgres-parser.t
t/30sqlt-new-diff-mysql.t
t/30sqlt-new-diff-pgsql.t
t/data/mysql/create.sql

diff --git a/AUTHORS b/AUTHORS
index c592767..306c7cf 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -3,6 +3,7 @@ The following people have contributed to the SQLFairy project:
 -   Alexander Hartmaier <abraxxa@cpan.org>
 -   Allen Day <allenday@users.sourceforge.net>
 -   Anders Nor Berle <berle@cpan.org>
+-   Andrew Moore <amoore@cpan.org>
 -   Ben Faga <faga@cshl.edu>
 -   Chris Hilton <chilton@alterpoint.com>
 -   Chris Mungall <cjm@fruitfly.org>
diff --git a/Changes b/Changes
index e1a2946..79df63d 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,7 +1,16 @@
+* Fix Parser::DBI::Oracle reading too many tables (RT#49413)
+* Fix Parser::MySQL tripping up on PRIMARY KEY ... USING (currently value is ignored) (RT#50468)
+* Fix runaway debug trace (RT#52276)
+* Fix Parser::PostgreSQL choking on commit; statements in DDL (#RT52277)
+
+# ----------------------------------------------------------
+# 0.11004 2010-02-14
+# ----------------------------------------------------------
 * Fix PG producer numeric precision regression (RT#49301)
 * Add DB2 producer numeric/decimal precision output
 * Fix Oracle producer creating numeric precision statements that the test case expects (no whitespace)
 * Add Oracle producer creating drop view statements like PG producer does
+* Fix SQL::Translator::Diff to use producer_args instead of producer_options
 
 # ----------------------------------------------------------
 # 0.11003 2009-09-28
index 1fe18c0..bf94103 100644 (file)
@@ -24,7 +24,7 @@ use base 'Class::Base';
 
 require 5.005;
 
-$VERSION  = '0.11003';
+$VERSION  = '0.11004';
 $DEBUG    = 0 unless defined $DEBUG;
 $ERROR    = "";
 
index 91b8c1a..4c9ea77 100644 (file)
@@ -6,6 +6,7 @@ use strict;
 use warnings;
 
 use Data::Dumper;
+use Carp::Clan qw/^SQL::Translator/;
 use SQL::Translator::Schema::Constants;
 
 use base 'Class::Accessor::Fast';
@@ -14,7 +15,7 @@ use base 'Class::Accessor::Fast';
 __PACKAGE__->mk_accessors(qw/
   ignore_index_names ignore_constraint_names ignore_view_sql
   ignore_proc_sql output_db source_schema target_schema 
-  case_insensitive no_batch_alters ignore_missing_methods producer_options
+  case_insensitive no_batch_alters ignore_missing_methods producer_args
 /);
 
 my @diff_arrays = qw/
@@ -63,7 +64,11 @@ sub new {
   $values->{$_} ||= [] foreach @diff_arrays;
   $values->{table_diff_hash} = {};
 
-  $values->{producer_options} ||= {};
+  $values->{producer_args} ||= {};
+  if ($values->{producer_options}) {
+    carp 'producer_options is deprecated. Please use producer_args';
+    $values->{producer_args} = { %{$values->{producer_options}}, %{$values->{producer_args}} };
+  }
   $values->{output_db} ||= $values->{source_db};
   return $class->SUPER::new($values);
 }
@@ -101,7 +106,7 @@ sub compute_differences {
           $self->table_diff_hash->{$tar_table_name}{table_renamed_from} = [ [$src_table, $tar_table] ];
         } else {
           delete $tar_table->extra->{renamed_from};
-          warn qq#Renamed table can't find old table "$old_name" for renamed table\n#;
+          carp qq#Renamed table can't find old table "$old_name" for renamed table\n#;
         }
       } else {
         $src_table = $source_schema->get_table( $tar_table_name, $self->case_insensitive );
@@ -181,7 +186,7 @@ sub produce_diff_sql {
               $func_map{$_} => $self->table_diff_hash->{$table}{$_}
             } keys %func_map 
           }, 
-          $self->producer_options
+          $self->producer_args
         );
       }
     } else {
@@ -200,7 +205,7 @@ sub produce_diff_sql {
             my $meth = $producer_class->can($_);
             
             $meth ? map { 
-                    my $sql = $meth->( (ref $_ eq 'ARRAY' ? @$_ : $_), $self->producer_options );
+                    my $sql = $meth->( (ref $_ eq 'ARRAY' ? @$_ : $_), $self->producer_args );
                     $sql ?  ("$sql") : (); 
                   } @{ $flattened_diffs{$_} }
                   : $self->ignore_missing_methods
@@ -226,7 +231,7 @@ sub produce_diff_sql {
         add_drop_table => 0,
         no_comments => 1,
         # TODO: sort out options
-        %{ $self->producer_options }
+        %{ $self->producer_args }
       );
       $translator->producer_args->{no_transaction} = 1;
       my $schema = $translator->schema;
@@ -241,7 +246,7 @@ sub produce_diff_sql {
     if (my @tables_to_drop = @{ $self->{tables_to_drop} || []} ) {
       my $meth = $producer_class->can('drop_table');
       
-      push @diffs, $meth ? ( map { $meth->($_, $self->producer_options) } @tables_to_drop)
+      push @diffs, $meth ? ( map { $meth->($_, $self->producer_args) } @tables_to_drop)
                          : $self->ignore_missing_methods
                          ? "-- $producer_class cant drop_table"
                          : die "$producer_class cant drop_table";
@@ -343,7 +348,7 @@ sub diff_table_fields {
     if (my $old_name = $tar_table_field->extra->{renamed_from}) {
       my $src_table_field = $src_table->get_field( $old_name, $self->case_insensitive );
       unless ($src_table_field) {
-        warn qq#Renamed column can't find old column "@{[$src_table->name]}.$old_name" for renamed column\n#;
+        carp qq#Renamed column can't find old column "@{[$src_table->name]}.$old_name" for renamed column\n#;
         delete $tar_table_field->extra->{renamed_from};
       } else {
         push @{$self->table_diff_hash->{$tar_table}{fields_to_rename} }, [ $src_table_field, $tar_table_field ];
@@ -406,6 +411,13 @@ sub diff_table_options {
     unless $src_table->_compare_objects( \@src_opts, \@tar_opts );
 }
 
+# support producer_options as an alias for producer_args for legacy code.
+sub producer_options {
+  my $self = shift;
+
+  return $self->producer_args( @_ );
+}
+
 1;
 
 __END__
index d111387..c853a81 100644 (file)
@@ -48,10 +48,10 @@ sub parse {
 
     my $schema = $tr->schema;
 
-    my $sth = $dbh->table_info();
+    my $db_user = uc $tr->parser_args()->{db_user};
+    my $sth = $dbh->table_info(undef, $db_user, '%', 'TABLE');
 
     while(my $table_info = $sth->fetchrow_hashref('NAME_uc')) {
-        next unless ($table_info->{TABLE_TYPE} eq 'TABLE');
         next if ($table_info->{TABLE_NAME} =~ /\$/);
 
         # create the table
index 9606651..86c66d7 100644 (file)
@@ -184,7 +184,7 @@ ORDER BY 1;
         
         $fk_select->execute('public',$table_name) or die "Can't execute: $@";
         my $fkeys = $fk_select->fetchall_arrayref({});
-        print Dumper $fkeys;
+        $DEBUG and print Dumper $fkeys;
         for my $con (@$fkeys){
             my $con_name         = $con->{conname};
             my $fields           = $con->{fields};
index 38b062b..fdd27a2 100644 (file)
@@ -641,13 +641,14 @@ foreign_key_def_begin : /constraint/i /foreign key/i WORD
     /foreign key/i
     { $return = '' }
 
-primary_key_def : primary_key index_name(?) '(' name_with_opt_paren(s /,/) ')'
+primary_key_def : primary_key index_name(?) '(' name_with_opt_paren(s /,/) ')' index_type(?)
     { 
         $return       = { 
             supertype => 'constraint',
             name      => $item{'index_name(?)'}[0],
             type      => 'primary_key',
             fields    => $item[4],
+            options   => $item[6][0],
         };
     }
 
index 071a0a1..a80021e 100644 (file)
@@ -152,8 +152,11 @@ statement : create
   | select
   | copy
   | readin_symbol
+  | commit
   | <error>
 
+commit : /commit/i ';'
+
 connect : /^\s*\\\connect.*\n/
 
 set : /set/i /[^;]*/ ';'
index 4c2ae2a..2e1fa45 100644 (file)
@@ -234,7 +234,7 @@ BEGIN {
               tax                       decimal(8,2),
               shipping_charge           decimal(8,2),
               price_paid                decimal(8,2),
-              PRIMARY KEY (order_id),
+              PRIMARY KEY (order_id) USING BTREE,
               KEY (status),
               KEY (billing_address_id),
               KEY (shipping_address_id),
index 1683a8b..3d29196 100644 (file)
@@ -91,6 +91,8 @@ my $sql = q[
     alter table only t_test1 drop constraint foo cascade;
 
     alter table t_test1 owner to foo;
+
+    commit;
 ];
 
 $| = 1;
index edeaa21..a3ed806 100644 (file)
@@ -39,7 +39,7 @@ my @out = SQL::Translator::Diff::schema_diff(
     $target_schema, 'MySQL',
     { 
         no_batch_alters  => 1, 
-        producer_options => { quote_table_names => 0 } 
+        producer_args => { quote_table_names => 0 } 
     } 
 );
 
@@ -106,7 +106,7 @@ COMMIT;
 $out = SQL::Translator::Diff::schema_diff($source_schema, 'MySQL', $target_schema, 'MySQL',
     { ignore_index_names => 1,
       ignore_constraint_names => 1,
-      producer_options => { quote_table_names => 0 },
+      producer_args => { quote_table_names => 0 },
     });
 
 eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
@@ -178,7 +178,7 @@ eq_or_diff($out, <<'## END OF DIFF', "No differences found");
   my $field = $target_schema->get_table('employee')->get_field('employee_id');
   $field->data_type('integer');
   $field->size(0);
-  $out = SQL::Translator::Diff::schema_diff($schema, 'MySQL', $target_schema, 'MySQL', { producer_options => { quote_table_names => 0 } } );
+  $out = SQL::Translator::Diff::schema_diff($schema, 'MySQL', $target_schema, 'MySQL', { producer_args => { quote_table_names => 0 } } );
   eq_or_diff($out, <<'## END OF DIFF', "No differences found");
 -- Convert schema 'create.sql' to 'create2.yml':;
 
@@ -316,7 +316,7 @@ COMMIT;
 
   # Test quoting works too.
   $out = SQL::Translator::Diff::schema_diff($s1, 'MySQL', $s2, 'MySQL', 
-    { producer_options => { quote_table_names => '`' } }
+    { producer_args => { quote_table_names => '`' } }
   );
   eq_or_diff($out, <<'## END OF DIFF', "Quoting can be turned on");
 -- Convert schema 'Schema 3' to 'Schema 4':;
index 0481a60..3a2c957 100644 (file)
@@ -40,7 +40,7 @@ my $out = SQL::Translator::Diff::schema_diff(
     $target_schema,
    'PostgreSQL',
    {
-     producer_options => {
+     producer_args => {
          quote_table_names => 0,
      }
    }
@@ -98,7 +98,7 @@ $out = SQL::Translator::Diff::schema_diff(
     $source_schema, 'PostgreSQL', $target_schema, 'PostgreSQL',
     { ignore_index_names => 1,
       ignore_constraint_names => 1,
-      producer_options => {
+      producer_args => {
          quote_table_names => 0,
          quote_field_names => 0,
       }
index e8c955e..642d9a2 100644 (file)
@@ -15,7 +15,7 @@ create table employee (
        employee_id integer,
   job_title varchar(255),
        CONSTRAINT FK5302D47D93FE702E FOREIGN KEY (employee_id) REFERENCES person (person_id),
-       PRIMARY KEY  (position, employee_id)
+       PRIMARY KEY  (position, employee_id) USING BTREE
 ) ENGINE=InnoDB;
 
 create table deleted (