X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=script%2Fsqlt-diff;h=4e2944dc9c0120d5cd3909829e9ca96d9276dc64;hb=e0583e2c4b2a78bd79b0565b5473bab118bcd3cf;hp=3a5a6a586dbfd858421d41f1fbc3f1137c0c675f;hpb=11ad2df91bcc0674faa8fb5b6bab52c9e4a73762;p=dbsrgits%2FSQL-Translator.git diff --git a/script/sqlt-diff b/script/sqlt-diff index 3a5a6a5..4e2944d 100755 --- a/script/sqlt-diff +++ b/script/sqlt-diff @@ -15,8 +15,8 @@ # # 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., 59 Temple Place, Suite 330, Boston, MA -# 02111-1307 USA +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MAb +# 02110-1301 USA. # ------------------------------------------------------------------- =head1 NAME @@ -53,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 @@ -71,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 @@ -106,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'}; @@ -191,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; @@ -204,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;