X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FDiff.pm;h=91b8c1a385bf0d67b2c54c87675ca8a6de5862b5;hb=11ad2df91bcc0674faa8fb5b6bab52c9e4a73762;hp=29c00fd4fd031bb4ce4c37f0e42fed242d7528e9;hpb=7467c458f256ef9d0d7028a0913412a0c854eab8;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Diff.pm b/lib/SQL/Translator/Diff.pm index 29c00fd..91b8c1a 100644 --- a/lib/SQL/Translator/Diff.pm +++ b/lib/SQL/Translator/Diff.pm @@ -13,7 +13,7 @@ use base 'Class::Accessor::Fast'; # Input/option accessors __PACKAGE__->mk_accessors(qw/ ignore_index_names ignore_constraint_names ignore_view_sql - ignore_proc_sql output_db source_schema source_db target_schema target_db + ignore_proc_sql output_db source_schema target_schema case_insensitive no_batch_alters ignore_missing_methods producer_options /); @@ -45,15 +45,14 @@ sub schema_diff { ## _db is the name of the producer/db it came out of/into ## results are formatted to the source preferences - my ($source_schema, $source_db, $target_schema, $target_db, $options) = @_; + my ($source_schema, $source_db, $target_schema, $output_db, $options) = @_; $options ||= {}; my $obj = SQL::Translator::Diff->new( { %$options, source_schema => $source_schema, - source_db => $source_db, target_schema => $target_schema, - target_db => $target_db + output_db => $output_db } ); $obj->compute_differences->produce_diff_sql; @@ -202,7 +201,7 @@ sub produce_diff_sql { $meth ? map { my $sql = $meth->( (ref $_ eq 'ARRAY' ? @$_ : $_), $self->producer_options ); - $sql ? ("$sql;") : (); + $sql ? ("$sql") : (); } @{ $flattened_diffs{$_} } : $self->ignore_missing_methods ? "-- $producer_class cant $_" @@ -229,36 +228,42 @@ sub produce_diff_sql { # TODO: sort out options %{ $self->producer_options } ); + $translator->producer_args->{no_transaction} = 1; my $schema = $translator->schema; $schema->add_table($_) for @tables; unshift @diffs, # Remove begin/commit here, since we wrap everything in one. - grep { $_ !~ /^(?:COMMIT|START(?: TRANSACTION)?|BEGIN(?: TRANSACTION)?);/ } $producer_class->can('produce')->($translator); + grep { $_ !~ /^(?:COMMIT|START(?: TRANSACTION)?|BEGIN(?: TRANSACTION)?)/ } $producer_class->can('produce')->($translator); } 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_options) } @tables_to_drop) : $self->ignore_missing_methods ? "-- $producer_class cant drop_table" : die "$producer_class cant drop_table"; } if (@diffs) { - unshift @diffs, "BEGIN;\n"; - push @diffs, "\nCOMMIT;\n"; + unshift @diffs, "BEGIN"; + push @diffs, "\nCOMMIT"; } else { - @diffs = ("-- No differences found\n\n"); + @diffs = ("-- No differences found"); } if ( @diffs ) { - if ( $self->target_db !~ /^(?:MySQL|SQLite)$/ ) { - unshift(@diffs, "-- Target database @{[$self->target_db]} is untested/unsupported!!!"); + if ( $self->output_db !~ /^(?:MySQL|SQLite|PostgreSQL)$/ ) { + unshift(@diffs, "-- Output database @{[$self->output_db]} is untested/unsupported!!!"); } - return join( "\n", "-- Convert schema '$src_name' to '$tar_name':\n", @diffs); + + my @return = + map { $_ ? ( $_ =~ /;$/xms ? $_ : "$_;\n\n" ) : "\n" } + ("-- Convert schema '$src_name' to '$tar_name':", @diffs); + + return wantarray ? @return : join('', @return); } return undef; @@ -386,10 +391,19 @@ sub diff_table_fields { sub diff_table_options { my ($self, $src_table, $tar_table) = @_; + my $cmp = sub { + my ($a_name, undef, $b_name, undef) = ( %$a, %$b ); + $a_name cmp $b_name; + }; + # Need to sort the options so we dont get supruious diffs. + my (@src_opts, @tar_opts); + @src_opts = sort $cmp $src_table->options; + @tar_opts = sort $cmp $tar_table->options; + # If there's a difference, just re-set all the options push @{ $self->table_diff_hash->{$tar_table}{table_options} }, $tar_table - unless $src_table->_compare_objects( scalar $src_table->options, scalar $tar_table->options ); + unless $src_table->_compare_objects( \@src_opts, \@tar_opts ); } 1;