Release commit for 1.62
[dbsrgits/SQL-Translator.git] / script / sqlt-diff
index 3a5a6a5..75c8a84 100755 (executable)
@@ -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=<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
@@ -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 <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
@@ -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.62';
+
+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;