Rolled in Darren's new list_[producers|parsers], lots of cosmetic changes,
[dbsrgits/SQL-Translator.git] / bin / sql_translator.pl
1 #!/usr/bin/perl -w
2
3 # -------------------------------------------------------------------
4 # $Id: sql_translator.pl,v 1.5 2002-11-22 03:03:40 kycl4rk Exp $
5 # -------------------------------------------------------------------
6 # Copyright (C) 2002 Ken Y. Clark <kycl4rk@users.sourceforge.net>,
7 #                    darren chamberlain <darren@cpan.org>
8 #
9 # This program is free software; you can redistribute it and/or
10 # modify it under the terms of the GNU General Public License as
11 # published by the Free Software Foundation; version 2.
12 #
13 # This program is distributed in the hope that it will be useful, but
14 # WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 # General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
21 # 02111-1307  USA
22 # -------------------------------------------------------------------
23
24 use strict;
25 use Getopt::Long;
26 use Pod::Usage;
27 use SQL::Translator;
28
29 use Data::Dumper;
30
31 use vars qw( $VERSION );
32 $VERSION = sprintf "%d.%02d", q$Revision: 1.5 $ =~ /(\d+)\.(\d+)/;
33
34 my $from;        # the original database
35 my $to;          # the destination database 
36 my $help;        # show POD and bail
37 my $stdin;       # whether to read STDIN for create script
38 my $no_comments; # whether to put comments in out file
39 my $xlate;       # user overrides for field translation
40 my $debug;       # whether to print debug info
41 my $trace;       # whether to print parser trace
42 my $list;        # list all parsers and producers
43
44 #
45 # Get options, explain how to use the script if necessary.
46 #
47 GetOptions(
48     'f|from|parser:s' => \$from,
49     't|to|producer:s' => \$to,
50     'h|help'          => \$help,
51     'l|list'          => \$list,
52     'd|debug'         => \$debug,
53     'trace'           => \$trace,
54     'no-comments'     => \$no_comments,
55     'xlate=s'         => \$xlate,
56 ) or pod2usage(2);
57
58 my @files = @ARGV; # the create script(s) for the original db
59
60 pod2usage(1) if $help;
61
62 if ( $xlate ) {
63     my @fields = split /,/, $xlate;
64     $xlate     = {}; 
65     for my $field ( @fields ) {
66         my ( $from, $to ) = split(/\//, $field);
67         $xlate->{$from} = $to;
68     }
69 }
70
71 #
72 # If everything is OK, translate file(s).
73 #
74 my $translator  =  SQL::Translator->new( 
75     xlate       => $xlate || {},
76     debug       => $debug,
77     trace       => $trace,
78     no_comments => $no_comments,
79 );
80
81 if ( $list ) {
82     my @parsers   = $translator->list_parsers;
83     my @producers = $translator->list_producers;
84
85     for ( @parsers, @producers ) {
86         if ( $_ =~ m/.+::(\w+)\.pm/ ) {
87             $_ = $1;
88         }
89     }
90     
91     print "\nParsers:\n",   map { "\t$_\n" } sort @parsers;
92     print "\nProducers:\n", map { "\t$_\n" } sort @producers;
93     print "\n";
94     exit(0);
95 }
96
97 pod2usage(2) unless $from && $to && @files;
98
99 $translator->parser($from);
100 $translator->producer($to);
101
102 for my $file (@files) {
103     my $output = $translator->translate( $file ) or die
104         "Error: " . $translator->error;
105     print $output;
106 }
107
108 # ----------------------------------------------------
109 # It is not all books that are as dull as their readers.
110 # Henry David Thoreau
111 # ----------------------------------------------------
112
113 =head1 NAME
114
115 sql_translator.pl - convert an SQL database schema
116
117 =head1 SYNOPSIS
118
119 For help:
120
121   ./sql_translator.pl -h|--help
122
123 For a list of all parsers and producers: 
124
125   ./sql_translator.pl -l|--list
126
127 To translate a schema:
128
129   ./sql_translator.pl 
130         -f|--from|--parser MySQL 
131         -t|--to|--producer Oracle 
132         [options] 
133         file
134
135   Options:
136
137     -d|--debug                Print debug info
138     --trace                   Print parser trace info
139     --no-comments             Don't include comments in SQL output
140     --xlate=foo/bar,baz/blech Overrides for field translation
141
142 =head1 DESCRIPTION
143
144 This script is part of the SQL Fairy project
145 (http://sqlfairy.sourceforge.net/).  It will try to convert any
146 database syntax for which it has a grammar into some other format it
147 knows about.
148
149 =head1 AUTHOR
150
151 Ken Y. Clark E<lt>kclark@cpan.orgE<gt>
152
153 =head1 SEE ALSO
154
155 SQL::Translator.
156
157 =cut