Update the Free Software Foundation's address (RT#100531)
[dbsrgits/SQL-Translator.git] / script / sqlt-graph
CommitLineData
d5132e19 1#!/usr/bin/env perl
354b1807 2
44659089 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
36585096 17# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18# 02110-1301 USA.
44659089 19# -------------------------------------------------------------------
20
aee4b66e 21=head1 NAME
354b1807 22
23sqlt-graph - Automatically create a graph from a database schema
24
25=head1 SYNOPSIS
26
27 ./sqlt-graph -d|--db|-f|--from=db_parser [options] schema.sql
28
29 Options:
30
31 -l|--layout Layout schema for GraphViz
32 ("dot," "neato," "twopi"; default "dot")
aee4b66e 33 -n|--node-shape Shape of the nodes ("record," "plaintext,"
34 "ellipse," "circle," "egg," "triangle," "box,"
35 "diamond," "trapezium," "parallelogram," "house,"
354b1807 36 "hexagon," "octagon," default "record")
37 -o|--output Output file name (default STDOUT)
38 -t|--output-type Output file type ("canon", "text," "ps," "hpgl,"
39 "pcl," "mif," "pic," "gd," "gd2," "gif," "jpeg,"
40 "png," "wbmp," "cmap," "ismap," "imap," "vrml,"
41 "vtx," "mp," "fig," "svg," "plain," default "png")
42 -c|--color Add colors
d5132e19 43 --cluster Cluster tables
354b1807 44 --no-fields Don't show field names
45 --height Image height (in inches, default "11",
46 set to "0" to undefine)
aee4b66e 47 --width Image width (in inches, default "8.5",
354b1807 48 set to "0" to undefine)
027cebc7 49 --fontsize custom font size for node and edge labels
aee4b66e 50 --fontname name of custom font (or full path to font file) for
027cebc7 51 node, edge, and graph labels
52 --nodeattr attribute name and value (in key=val syntax) for
aee4b66e 53 nodes; this option may be repeated to specify
027cebc7 54 multiple node attributes
55 --edgeattr same as --nodeattr, but for edge attributes
56 --graphattr same as --nodeattr, but for graph attributes
354b1807 57 --natural-join Perform natural joins
58 --natural-join-pk Perform natural joins from primary keys only
88c73648 59 --show-datatypes Show datatype of each field
60 --show-sizes Show column sizes for VARCHAR and CHAR fields
7b908fb7 61 --show-constraints Show list of constraints for each field
354b1807 62 -s|--skip Fields to skip in natural joins
aee4b66e 63 --skip-tables Comma-separated list of table names to exclude
818e0d98 64 --skip-tables-like Comma-separated list of regexen to exclude tables
354b1807 65 --debug Print debugging information
f2b76cf3 66 --trace Print parser trace info
354b1807 67
68=head1 DESCRIPTION
69
70This script will create a graph of your schema. Only the database
71driver argument (for SQL::Translator) is required. If no output file
72name is given, then image will be printed to STDOUT, so you should
73redirect the output into a file.
74
75The default action is to assume the presence of foreign key
76relationships defined via "REFERNCES" or "FOREIGN KEY" constraints on
77the tables. If you are parsing the schema of a file that does not
78have these, you will find the natural join options helpful. With
79natural joins, like-named fields will be considered foreign keys.
80This can prove too permissive, however, as you probably don't want a
81field called "name" to be considered a foreign key, so you could
82include it in the "skip" option, and all fields called "name" will be
83excluded from natural joins. A more efficient method, however, might
266c228a 84be to simply deduce the foreign keys from primary keys to other fields
354b1807 85named the same in other tables. Use the "natural-join-pk" option
266c228a 86to achieve this.
354b1807 87
88If the schema defines foreign keys, then the graph produced will be
89directed showing the direction of the relationship. If the foreign
90keys are intuited via natural joins, the graph will be undirected.
91
aee4b66e 92Clustering of tables allows you to group and box tables according to
93function or domain or whatever criteria you choose. The syntax for
3b210832 94clustering tables is:
d5132e19 95
96 cluster1=table1,table2;cluster2=table3,table4
97
354b1807 98=cut
99
100# -------------------------------------------------------------------
101
102use strict;
d5132e19 103use warnings;
354b1807 104use Data::Dumper;
105use Getopt::Long;
106use GraphViz;
107use Pod::Usage;
108use SQL::Translator;
109
da06ac74 110use vars '$VERSION';
11ad2df9 111$VERSION = '1.59';
da06ac74 112
354b1807 113#
114# Get arguments.
115#
aee4b66e 116my (
117 $layout, $node_shape, $out_file, $output_type, $db_driver, $add_color,
d491c962 118 $natural_join, $join_pk_only, $skip_fields, $show_datatypes,
f382d57f 119 $show_sizes, $show_constraints, $debug, $help, $height, $width,
d5132e19 120 $no_fields, $fontsize, $fontname, $skip_tables, $skip_tables_like,
f2b76cf3 121 $cluster, $trace
354b1807 122);
123
027cebc7 124# multi-valued options:
125my %edgeattrs = ();
126my %nodeattrs = ();
127my %graphattrs = ();
128
354b1807 129GetOptions(
26b2ec84 130 'd|db|f|from=s' => \$db_driver,
818e0d98 131 'o|output:s' => \$out_file,
132 'l|layout:s' => \$layout,
133 'n|node-shape:s' => \$node_shape,
134 't|output-type:s' => \$output_type,
135 'height:f' => \$height,
136 'width:f' => \$width,
26b2ec84 137 'fontsize=i' => \$fontsize,
138 'fontname=s' => \$fontname,
139 'nodeattr=s' => \%nodeattrs,
140 'edgeattr=s' => \%edgeattrs,
141 'graphattr=s' => \%graphattrs,
818e0d98 142 'c|color' => \$add_color,
d5132e19 143 'cluster:s' => \$cluster,
818e0d98 144 'no-fields' => \$no_fields,
145 'natural-join' => \$natural_join,
146 'natural-join-pk' => \$join_pk_only,
147 's|skip:s' => \$skip_fields,
148 'skip-tables:s' => \$skip_tables,
149 'skip-tables-like:s' => \$skip_tables_like,
150 'show-datatypes' => \$show_datatypes,
151 'show-sizes' => \$show_sizes,
152 'show-constraints' => \$show_constraints,
153 'debug' => \$debug,
f2b76cf3 154 'trace' => \$trace,
818e0d98 155 'h|help' => \$help,
354b1807 156) or die pod2usage;
157my @files = @ARGV; # the create script(s) for the original db
158
159pod2usage(1) if $help;
160pod2usage( -message => "No db driver specified" ) unless $db_driver;
161pod2usage( -message => 'No input file' ) unless @files;
162
aee4b66e 163my $translator = SQL::Translator->new(
7b908fb7 164 from => $db_driver,
165 to => 'GraphViz',
166 debug => $debug || 0,
f2b76cf3 167 trace => $trace || 0,
7b908fb7 168 producer_args => {
169 out_file => $out_file,
170 layout => $layout,
171 node_shape => $node_shape,
172 output_type => $output_type,
173 add_color => $add_color,
174 natural_join => $natural_join,
175 natural_join_pk => $join_pk_only,
176 skip_fields => $skip_fields,
fddd7578 177 skip_tables => $skip_tables,
818e0d98 178 skip_tables_like => $skip_tables_like,
7b908fb7 179 show_datatypes => $show_datatypes,
180 show_sizes => $show_sizes,
181 show_constraints => $show_constraints,
d5132e19 182 cluster => $cluster,
7b908fb7 183 height => $height || 0,
184 width => $width || 0,
027cebc7 185 fontsize => $fontsize,
186 fontname => $fontname,
187 nodeattrs => \%nodeattrs,
188 edgeattrs => \%edgeattrs,
189 graphattrs => \%graphattrs,
7b908fb7 190 show_fields => $no_fields ? 0 : 1,
354b1807 191 },
192) or die SQL::Translator->error;
193
194for my $file (@files) {
195 my $output = $translator->translate( $file ) or die
196 "Error: " . $translator->error;
197 if ( $out_file ) {
198 print "Image written to '$out_file'. Done.\n";
199 }
200 else {
201 print $output;
202 }
203}
204
205# -------------------------------------------------------------------
206
207=pod
208
209=head1 AUTHOR
210
d5132e19 211Ken Youens-Clark E<lt>kclark@cpan.orgE<gt>.
354b1807 212
213=head1 SEE ALSO
214
215perl, SQL::Translator.
216
217=cut