Downgrade global version - highest version in 9002 on cpan is 1.58 - thus go with...
[dbsrgits/SQL-Translator.git] / bin / sqlt-diagram
1 #!/usr/bin/perl
2
3 # -------------------------------------------------------------------
4 # Copyright (C) 2002-2009 SQLFairy Authors
5 #
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License as
8 # published by the Free Software Foundation; version 2.
9 #
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 # 02111-1307  USA
19 # -------------------------------------------------------------------
20
21 =head1 NAME 
22
23 sqlt-diagram - Automatically create a diagram from a database schema
24
25 =head1 SYNOPSIS
26
27   ./sqlt-diagram -d|-f|--from|--db=db_parser [options] schema.sql
28
29   Options:
30
31     -o|--output        Output file name (default STDOUT)
32     -i|--image         Output image type ("png" or "jpeg," default "png")
33     -t|--title         Title to give schema
34     -c|--cols          Number of columns
35     -n|--no-lines      Don't draw lines
36     --font-size        Font size ("small," "medium," "large," or "huge,"
37                        default "medium")
38     --gutter           Gutter size between tables
39     --color            Add colors
40     --show-fk-only     Only show fields that act as primary 
41                        or foreign keys
42
43     --natural-join     Perform natural joins
44     --natural-join-pk  Perform natural joins from primary keys only
45     -s|--skip          Fields to skip in natural joins
46     --debug            Print debugging information
47
48 =head1 DESCRIPTION
49
50 This script will create a picture of your schema.  Only the database
51 driver argument (for SQL::Translator) is required.  If no output file
52 name is given, then image will be printed to STDOUT, so you should
53 redirect the output into a file.
54
55 The default action is to assume the presence of foreign key
56 relationships defined via "REFERENCES" or "FOREIGN KEY" constraints on
57 the tables.  If you are parsing the schema of a file that does not
58 have these, you will find the natural join options helpful.  With
59 natural joins, like-named fields will be considered foreign keys.
60 This can prove too permissive, however, as you probably don't want a
61 field called "name" to be considered a foreign key, so you could
62 include it in the "skip" option, and all fields called "name" will be
63 excluded from natural joins.  A more efficient method, however, might
64 be to simply deduce the foriegn keys from primary keys to other fields
65 named the same in other tables.  Use the "natural-join-pk" option
66 to achieve this.
67
68 =cut
69
70 use strict;
71 use Data::Dumper;
72 use Getopt::Long;
73 use Pod::Usage;
74 use SQL::Translator;
75
76 use vars '$VERSION';
77 $VERSION = '1.59';
78
79 #
80 # Get arguments.
81 #
82 my ( 
83     $out_file, $image_type, $db_driver, $title, $no_columns, 
84     $no_lines, $font_size, $add_color, $debug, $show_fk_only,
85     $gutter, $natural_join, $join_pk_only, $skip_fields, $help
86 );
87
88 GetOptions(
89     'd|db|f|from=s'   => \$db_driver,
90     'o|output:s'      => \$out_file,
91     'i|image:s'       => \$image_type,
92     't|title:s'       => \$title,
93     'c|columns:i'     => \$no_columns,
94     'n|no-lines'      => \$no_lines,
95     'font-size:s'   => \$font_size,
96     'gutter:i'        => \$gutter,
97     'color'           => \$add_color,
98     'show-fk-only'    => \$show_fk_only,
99     'natural-join'    => \$natural_join,
100     'natural-join-pk' => \$join_pk_only,
101     's|skip:s'        => \$skip_fields,
102     'debug'           => \$debug,
103     'h|help'          => \$help,
104 ) or die pod2usage;
105 my @files = @ARGV; # the create script(s) for the original db
106
107 pod2usage(1) if $help;
108 pod2usage( -message => "No db driver specified" ) unless $db_driver;
109 pod2usage( -message => 'No input file'          ) unless @files;
110
111 my $translator       =  SQL::Translator->new( 
112     from             => $db_driver,
113     to               => 'Diagram',
114     debug            => $debug || 0,
115     producer_args    => {
116         out_file     => $out_file,
117         image_type   => $image_type,
118         gutter       => $gutter || 0,
119         title        => $title,
120         no_columns   => $no_columns,
121         no_lines     => $no_lines,
122         font_size    => $font_size,
123         add_color    => $add_color,
124         show_fk_only => $show_fk_only,
125         natural_join => $natural_join,
126         join_pk_only => $join_pk_only,
127         skip_fields  => $skip_fields,
128     },
129 ) or die SQL::Translator->error;
130
131 for my $file (@files) {
132     my $output = $translator->translate( $file ) or die
133                  "Error: " . $translator->error;
134     if ( $out_file ) {
135         print "Image written to '$out_file'.  Done.\n";
136     }
137     else {
138         print $output;
139     }
140 }
141
142 # -------------------------------------------------------------------
143
144 =pod
145
146 =head1 AUTHOR
147
148 Ken Y. Clark E<lt>kclark@cpan.orgE<gt>.
149
150 =cut