Moved POD around, added all options for all parsers and non-graphical
[dbsrgits/SQL-Translator.git] / bin / sqlt-diagram
1 #!/usr/bin/perl
2
3 # $Id: sqlt-diagram,v 1.1 2003-08-26 02:29:12 kycl4rk Exp $
4
5 =head1 NAME 
6
7 sqlt-diagram.pl - Automatically create a diagram from a database schema
8
9 =head1 SYNOPSIS
10
11   ./sqlt-diagram.pl -d|--db=db_parser [options] schema.sql
12
13   Options:
14
15     -o|--output        Output file name (default STDOUT)
16     -i|--image         Output image type ("png" or "jpeg," default "png")
17     -t|--title         Title to give schema
18     -c|--cols          Number of columns
19     -n|--no-lines      Don't draw lines
20     -f|--font-size     Font size ("small," "medium," "large," or "huge,"
21                        default "medium")
22     --color            Add colors
23     --show-fk-only     Only show fields that act as primary 
24                        or foreign keys
25
26     --natural-join     Perform natural joins
27     --natural-join-pk  Perform natural joins from primary keys only
28     -s|--skip          Fields to skip in natural joins
29     --debug            Print debugging information
30
31 =head1 DESCRIPTION
32
33 This script will create a picture of your schema.  Only the database
34 driver argument (for SQL::Translator) is required.  If no output file
35 name is given, then image will be printed to STDOUT, so you should
36 redirect the output into a file.
37
38 The default action is to assume the presence of foreign key
39 relationships defined via "REFERNCES" or "FOREIGN KEY" constraints on
40 the tables.  If you are parsing the schema of a file that does not
41 have these, you will find the natural join options helpful.  With
42 natural joins, like-named fields will be considered foreign keys.
43 This can prove too permissive, however, as you probably don't want a
44 field called "name" to be considered a foreign key, so you could
45 include it in the "skip" option, and all fields called "name" will be
46 excluded from natural joins.  A more efficient method, however, might
47 be to simply deduce the foriegn keys from primary keys to other fields
48 named the same in other tables.  Use the "natural-join-pk" option
49 to acheive this.
50
51 =cut
52
53 use strict;
54 use Data::Dumper;
55 use Getopt::Long;
56 use Pod::Usage;
57 use SQL::Translator;
58
59 my $VERSION = (qw$Revision: 1.1 $)[-1];
60
61 #
62 # Get arguments.
63 #
64 my ( 
65     $out_file, $image_type, $db_driver, $title, $no_columns, 
66     $no_lines, $font_size, $add_color, $debug, $show_fk_only,
67     $natural_join, $join_pk_only, $skip_fields, $help
68 );
69
70 GetOptions(
71     'd|db=s'          => \$db_driver,
72     'o|output:s'      => \$out_file,
73     'i|image:s'       => \$image_type,
74     't|title:s'       => \$title,
75     'c|columns:i'     => \$no_columns,
76     'n|no-lines'      => \$no_lines,
77     'f|font-size:s'   => \$font_size,
78     'color'           => \$add_color,
79     'show-fk-only'    => \$show_fk_only,
80     'natural-join'    => \$natural_join,
81     'natural-join-pk' => \$join_pk_only,
82     's|skip:s'        => \$skip_fields,
83     'debug'           => \$debug,
84     'h|help'          => \$help,
85 ) or die pod2usage;
86 my @files = @ARGV; # the create script(s) for the original db
87
88 pod2usage(1) if $help;
89 pod2usage( -message => "No db driver specified" ) unless $db_driver;
90 pod2usage( -message => 'No input file'          ) unless @files;
91
92 my $translator       =  SQL::Translator->new( 
93     from             => $db_driver,
94     to               => 'Diagram',
95     debug            => $debug || 0,
96     producer_args    => {
97         out_file     => $out_file,
98         image_type   => $image_type,
99         title        => $title,
100         no_columns   => $no_columns,
101         no_lines     => $no_lines,
102         font_size    => $font_size,
103         add_color    => $add_color,
104         show_fk_only => $show_fk_only,
105         natural_join => $natural_join,
106         join_pk_only => $join_pk_only,
107         skip_fields  => $skip_fields,
108     },
109 ) or die SQL::Translator->error;
110
111 for my $file (@files) {
112     my $output = $translator->translate( $file ) or die
113                  "Error: " . $translator->error;
114     if ( $out_file ) {
115         print "Image written to '$out_file'.  Done.\n";
116     }
117     else {
118         print $output;
119     }
120 }
121
122 =pod
123
124 =head1 AUTHOR
125
126 Ken Y. Clark E<lt>kclark@cpan.orgE<gt>
127
128 =cut