Changed copyright.
[dbsrgits/SQL-Translator.git] / bin / sqlt-graph
1 #!/usr/bin/perl
2
3 # -------------------------------------------------------------------
4 # $Id: sqlt-graph,v 1.2 2004-02-06 17:45:53 kycl4rk Exp $
5 # -------------------------------------------------------------------
6 # Copyright (C) 2002-4 SQLFairy Authors
7 #
8 # This program is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU General Public License as
10 # published by the Free Software Foundation; version 2.
11 #
12 # This program is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 # General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20 # 02111-1307  USA
21 # -------------------------------------------------------------------
22
23 =head1 NAME 
24
25 sqlt-graph - Automatically create a graph from a database schema
26
27 =head1 SYNOPSIS
28
29   ./sqlt-graph -d|--db|-f|--from=db_parser [options] schema.sql
30
31   Options:
32
33     -l|--layout        Layout schema for GraphViz
34                        ("dot," "neato," "twopi"; default "dot")
35     -n|--node-shape    Shape of the nodes ("record," "plaintext," 
36                        "ellipse," "circle," "egg," "triangle," "box," 
37                        "diamond," "trapezium," "parallelogram," "house," 
38                        "hexagon," "octagon," default "record")
39     -o|--output        Output file name (default STDOUT)
40     -t|--output-type   Output file type ("canon", "text," "ps," "hpgl,"
41                        "pcl," "mif," "pic," "gd," "gd2," "gif," "jpeg,"
42                        "png," "wbmp," "cmap," "ismap," "imap," "vrml,"
43                        "vtx," "mp," "fig," "svg," "plain," default "png")
44     -c|--color         Add colors
45     --no-fields        Don't show field names
46     --height           Image height (in inches, default "11",
47                        set to "0" to undefine)
48     --width            Image width (in inches, default "8.5", 
49                        set to "0" to undefine)
50     --natural-join     Perform natural joins
51     --natural-join-pk  Perform natural joins from primary keys only
52     -s|--skip          Fields to skip in natural joins
53     --debug            Print debugging information
54
55 =head1 DESCRIPTION
56
57 This script will create a graph of your schema.  Only the database
58 driver argument (for SQL::Translator) is required.  If no output file
59 name is given, then image will be printed to STDOUT, so you should
60 redirect the output into a file.
61
62 The default action is to assume the presence of foreign key
63 relationships defined via "REFERNCES" or "FOREIGN KEY" constraints on
64 the tables.  If you are parsing the schema of a file that does not
65 have these, you will find the natural join options helpful.  With
66 natural joins, like-named fields will be considered foreign keys.
67 This can prove too permissive, however, as you probably don't want a
68 field called "name" to be considered a foreign key, so you could
69 include it in the "skip" option, and all fields called "name" will be
70 excluded from natural joins.  A more efficient method, however, might
71 be to simply deduce the foriegn keys from primary keys to other fields
72 named the same in other tables.  Use the "natural-join-pk" option
73 to acheive this.
74
75 If the schema defines foreign keys, then the graph produced will be
76 directed showing the direction of the relationship.  If the foreign
77 keys are intuited via natural joins, the graph will be undirected.
78
79 =cut
80
81 # -------------------------------------------------------------------
82
83 use strict;
84 use Data::Dumper;
85 use Getopt::Long;
86 use GraphViz;
87 use Pod::Usage;
88 use SQL::Translator;
89
90 use vars '$VERSION';
91 $VERSION = sprintf "%d.%02d", q$Revision: 1.2 $ =~ /(\d+)\.(\d+)/;
92
93 #
94 # Get arguments.
95 #
96 my ( 
97     $layout, $node_shape, $out_file, $output_type, $db_driver, $add_color, 
98     $natural_join, $join_pk_only, $skip_fields, $debug, $help, $height, 
99     $width, $no_fields
100 );
101
102 GetOptions(
103     'd|db|f|from=s'    => \$db_driver,
104     'o|output:s'       => \$out_file,
105     'l|layout:s'       => \$layout,
106     'n|node-shape:s'   => \$node_shape,
107     't|output-type:s'  => \$output_type,
108     'height:i'         => \$height,
109     'width:i'          => \$width,
110     'c|color'          => \$add_color,
111     'no-fields'        => \$no_fields,
112     'natural-join'     => \$natural_join,
113     'natural-join-pk'  => \$join_pk_only,
114     's|skip:s'         => \$skip_fields,
115     'debug'            => \$debug,
116     'h|help'           => \$help,
117 ) or die pod2usage;
118 my @files = @ARGV; # the create script(s) for the original db
119
120 pod2usage(1) if $help;
121 pod2usage( -message => "No db driver specified" ) unless $db_driver;
122 pod2usage( -message => 'No input file'          ) unless @files;
123
124 my $translator          =  SQL::Translator->new( 
125     from                => $db_driver,
126     to                  => 'GraphViz',
127     debug               => $debug || 0,
128     producer_args       => {
129         out_file        => $out_file,
130         layout          => $layout,
131         node_shape      => $node_shape,
132         output_type     => $output_type,
133         add_color       => $add_color,
134         natural_join    => $natural_join,
135         natural_join_pk => $join_pk_only,
136         skip_fields     => $skip_fields,
137         height          => $height || 0,
138         width           => $width  || 0,
139         show_fields     => $no_fields ? 0 : 1,
140     },
141 ) or die SQL::Translator->error;
142
143 for my $file (@files) {
144     my $output = $translator->translate( $file ) or die
145                  "Error: " . $translator->error;
146     if ( $out_file ) {
147         print "Image written to '$out_file'.  Done.\n";
148     }
149     else {
150         print $output;
151     }
152 }
153
154 # -------------------------------------------------------------------
155
156 =pod
157
158 =head1 AUTHOR
159
160 Ken Y. Clark E<lt>kclark@cpan.orgE<gt>.
161
162 =head1 SEE ALSO
163
164 perl, SQL::Translator.
165
166 =cut