X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=script%2Fsqlt-diff;h=4e2944dc9c0120d5cd3909829e9ca96d9276dc64;hb=e0583e2c4b2a78bd79b0565b5473bab118bcd3cf;hp=7c9b3753c9aa30c8f6fa1ecac5017fecc85d2218;hpb=935800450f88b0500c4fa7c3b174cd22b5f9eb56;p=dbsrgits%2FSQL-Translator.git diff --git a/script/sqlt-diff b/script/sqlt-diff index 7c9b375..4e2944d 100755 --- a/script/sqlt-diff +++ b/script/sqlt-diff @@ -1,6 +1,24 @@ #!/usr/bin/env perl # vim: set ft=perl: +# ------------------------------------------------------------------- +# Copyright (C) 2002-2009 The SQLFairy Authors +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; version 2. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MAb +# 02110-1301 USA. +# ------------------------------------------------------------------- + =head1 NAME sqlt-diff - find the differences b/w two schemas @@ -35,12 +53,14 @@ Options: --ignore-proc-sql Ignore procedure SQL differences --no-batch-alters Do not clump multile alters to the same table into a single ALTER TABLE statement where possible. + --quote= Use to quote all table and field + names in statements =head1 DESCRIPTION sqlt-diff is a utility for creating a file of SQL commands necessary to -transform the first schema provided to the second. While not yet -exhaustive in its ability to mutate the entire schema, it will report the +transform the first schema provided to the second. While not yet +exhaustive in its ability to mutate the entire schema, it will report the following =over @@ -53,24 +73,24 @@ indices). =item * Missing/altered fields -Any fields missing or altered between the two schemas will be reported +Any fields missing or altered between the two schemas will be reported as: - ALTER TABLE - [DROP ] + ALTER TABLE + [DROP ] [CHANGE ()] ; =item * Missing/altered indices Any indices missing or of a different type or on different fields will be indicated. Indices that should be dropped will be reported as such: - + DROP INDEX ON ; -An index of a different type or on different fields will be reported as a +An index of a different type or on different fields will be reported as a new index as such: - CREATE [] INDEX [] ON + CREATE [] INDEX [] ON ( [,] ) ; =back @@ -88,83 +108,54 @@ use strict; use warnings; use Pod::Usage; use Data::Dumper; +use Getopt::Long; use SQL::Translator; use SQL::Translator::Diff; use SQL::Translator::Schema::Constants; use vars qw( $VERSION ); -$VERSION = '1.59'; +$VERSION = '1.59_01'; + +my ( @input, $list, $help, $debug, $trace, $caseopt, $ignore_index_names, + $ignore_constraint_names, $output_db, $mysql_parser_version, + $ignore_view_sql, $ignore_proc_sql, $no_batch_alters, $quote +); + +GetOptions( + 'l|list' => \$list, + 'h|help' => \$help, + 'd|debug' => \$debug, + 't|trace' => \$trace, + 'c|case-insensitive' => \$caseopt, + 'ignore-index-names' => \$ignore_index_names, + 'ignore-constraint-names' => \$ignore_constraint_names, + 'mysql_parser_version:s' => \$mysql_parser_version, + 'output-db:s' => \$output_db, + 'ignore-view-sql' => \$ignore_view_sql, + 'ignore-proc-sql' => \$ignore_proc_sql, + 'quote:s' => \$quote, + 'no-batch-alters' => \$no_batch_alters, +) or pod2usage(2); -my ( @input, $list, $help, $debug, $trace, $caseopt, $ignore_index_names, - $ignore_constraint_names, $output_db, $mysql_parser_version, - $ignore_view_sql, $ignore_proc_sql, $no_batch_alters ); for my $arg ( @ARGV ) { - if ( $arg =~ m/^-?-l(ist)?$/ ) { - $list = 1; - } - elsif ( $arg =~ m/^-?-h(elp)?$/ ) { - $help = 1; - } - elsif ( $arg =~ m/^-?-d(ebug)?$/ ) { - $debug = 1; - } - elsif ( $arg =~ m/^-?-t(race)?$/ ) { - $trace = 1; - } - elsif ( $arg =~ m/^-?-c(ase-insensitive)?$/ ) { - $caseopt = 1; - } - elsif ( $arg =~ m/^--ignore-index-names$/ ) { - $ignore_index_names = 1; - } - elsif ( $arg =~ m/^--ignore-constraint-names$/ ) { - $ignore_constraint_names = 1; - } - elsif ( $arg =~ m/^--mysql-parser-version=(.+)$/ ) { - $mysql_parser_version = $1; - } - elsif ( $arg =~ m/^--output-db=(.+)$/ ) { - $output_db = $1; - } - elsif ( $arg =~ m/^--ignore-view-sql$/ ) { - $ignore_view_sql = 1; - } - elsif ( $arg =~ m/^--ignore-proc-sql$/ ) { - $ignore_proc_sql = 1; - } - elsif ( $arg =~ m/^([^=]+)=(.+)$/ ) { + if ( $arg =~ m/^([^=]+)=(.+)$/ ) { push @input, { file => $1, parser => $2 }; } - elsif ( $arg =~ m/^--no-batch-alters$/ ) { - $no_batch_alters = 1; - } - else { - pod2usage( msg => "Unknown argument '$arg'" ); - } } -print STDERR <<'EOM'; -This code is experimental, currently the new code only supports MySQL or -SQLite diffing. To add support for other databases, please patch the relevant -SQL::Translator::Producer:: module. If you need compatibility with the old -sqlt-diff, please use sqlt-diff-old, and look into helping us make this one -work for you -EOM - -pod2usage(1) if $help || !@ARGV; -pod2usage('Please specify only two schemas to diff') if scalar @input > 2; - my $tr = SQL::Translator->new; my @parsers = $tr->list_parsers; my %valid_parsers = map { $_, 1 } @parsers; + if ( $list ) { print "\nParsers:\n", map { "\t$_\n" } sort @parsers; print "\n"; exit(0); } -pod2usage( msg => 'Too many file args' ) if @input > 2; +pod2usage(1) if $help || !@input; +pod2usage(msg => 'Please specify two schemas to diff') if scalar @input != 2; my ( $source_schema, $source_db, $target_schema, $target_db ) = map { my $file = $_->{'file'}; @@ -173,7 +164,9 @@ my ( $source_schema, $source_db, $target_schema, $target_db ) = map { die "Unable to read file '$file'\n" unless -r $file; die "'$parser' is an invalid parser\n" unless $valid_parsers{ $parser }; - my $t = SQL::Translator->new(parser_args => {mysql_parser_version => $mysql_parser_version}); + my $t = SQL::Translator->new(parser_args => { + mysql_parser_version => $mysql_parser_version + }); $t->debug( $debug ); $t->trace( $trace ); $t->parser( $parser ) or die $tr->error; @@ -186,17 +179,26 @@ my ( $source_schema, $source_db, $target_schema, $target_db ) = map { ($schema, $parser); } @input; -my $result = SQL::Translator::Diff::schema_diff($source_schema, $source_db, - $target_schema, $target_db, - { caseopt => $caseopt, - ignore_index_names => $ignore_index_names, - ignore_constraint_names => $ignore_constraint_names, - ignore_view_sql => $ignore_view_sql, - ignore_proc_sql => $ignore_proc_sql, - output_db => $output_db, - no_batch_alters => $no_batch_alters, - debug => $debug, - trace => $trace }); +my $result = SQL::Translator::Diff::schema_diff( + $source_schema, $source_db, + $target_schema, $target_db, + { + caseopt => $caseopt || 0, + ignore_index_names => $ignore_index_names || 0, + ignore_constraint_names => $ignore_constraint_names || 0, + ignore_view_sql => $ignore_view_sql || 0, + ignore_proc_sql => $ignore_proc_sql || 0, + output_db => $output_db, + no_batch_alters => $no_batch_alters || 0, + debug => $debug || 0, + trace => $trace || 0, + producer_args => { + quote_table_names => $quote || '', + quote_field_names => $quote || '', + }, + } +); + if($result) { print $result;