--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=<character> Use <character> 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
=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 <table_name>
- [DROP <field_name>]
+ ALTER TABLE <table_name>
+ [DROP <field_name>]
[CHANGE <field_name> <datatype> (<size>)] ;
=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 <index_name> ON <table_name> ;
-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_type>] INDEX [<index_name>] ON <table_name>
+ CREATE [<index_type>] INDEX [<index_name>] ON <table_name>
( <field_name>[,<field_name>] ) ;
=back
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.60';
+$VERSION = '1.59';
+
+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
+print STDERR <<'EOM' unless $ENV{SQLT_NEWDIFF_NOWARN};
+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'};
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;
($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;