Changed copyright.
[dbsrgits/SQL-Translator.git] / bin / sqlt-graph
CommitLineData
354b1807 1#!/usr/bin/perl
2
3# -------------------------------------------------------------------
cb9f6535 4# $Id: sqlt-graph,v 1.2 2004-02-06 17:45:53 kycl4rk Exp $
354b1807 5# -------------------------------------------------------------------
cb9f6535 6# Copyright (C) 2002-4 SQLFairy Authors
354b1807 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
25sqlt-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
57This script will create a graph of your schema. Only the database
58driver argument (for SQL::Translator) is required. If no output file
59name is given, then image will be printed to STDOUT, so you should
60redirect the output into a file.
61
62The default action is to assume the presence of foreign key
63relationships defined via "REFERNCES" or "FOREIGN KEY" constraints on
64the tables. If you are parsing the schema of a file that does not
65have these, you will find the natural join options helpful. With
66natural joins, like-named fields will be considered foreign keys.
67This can prove too permissive, however, as you probably don't want a
68field called "name" to be considered a foreign key, so you could
69include it in the "skip" option, and all fields called "name" will be
70excluded from natural joins. A more efficient method, however, might
71be to simply deduce the foriegn keys from primary keys to other fields
72named the same in other tables. Use the "natural-join-pk" option
73to acheive this.
74
75If the schema defines foreign keys, then the graph produced will be
76directed showing the direction of the relationship. If the foreign
77keys are intuited via natural joins, the graph will be undirected.
78
79=cut
80
81# -------------------------------------------------------------------
82
83use strict;
84use Data::Dumper;
85use Getopt::Long;
86use GraphViz;
87use Pod::Usage;
88use SQL::Translator;
89
90use vars '$VERSION';
cb9f6535 91$VERSION = sprintf "%d.%02d", q$Revision: 1.2 $ =~ /(\d+)\.(\d+)/;
354b1807 92
93#
94# Get arguments.
95#
96my (
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
102GetOptions(
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;
118my @files = @ARGV; # the create script(s) for the original db
119
120pod2usage(1) if $help;
121pod2usage( -message => "No db driver specified" ) unless $db_driver;
122pod2usage( -message => 'No input file' ) unless @files;
123
124my $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
143for 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
160Ken Y. Clark E<lt>kclark@cpan.orgE<gt>.
161
162=head1 SEE ALSO
163
164perl, SQL::Translator.
165
166=cut