Changed "no_columns" arg to "num_columns" (I used to use "no_" for both
[dbsrgits/SQL-Translator.git] / script / sqlt-diagram
CommitLineData
969049ba 1#!/usr/bin/env perl
dd9550a4 2
daf4f623 3# -------------------------------------------------------------------
478f608d 4# Copyright (C) 2002-2009 SQLFairy Authors
daf4f623 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# -------------------------------------------------------------------
dd9550a4 20
21=head1 NAME
22
fd72ea41 23sqlt-diagram - Automatically create a diagram from a database schema
dd9550a4 24
25=head1 SYNOPSIS
26
fd72ea41 27 ./sqlt-diagram -d|-f|--from|--db=db_parser [options] schema.sql
dd9550a4 28
29 Options:
30
2621b0fc 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
80e716f5 36 --font-size Font size ("small," "medium," "large," or "huge,"
2621b0fc 37 default "medium")
bb44ccb5 38 --gutter Gutter size between tables
2621b0fc 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
dd9550a4 47
48=head1 DESCRIPTION
49
50This script will create a picture of your schema. Only the database
aa0a19b9 51driver argument (for SQL::Translator) is required. If no output file
52name is given, then image will be printed to STDOUT, so you should
53redirect the output into a file.
dd9550a4 54
14655604 55The default action is to assume the presence of foreign key
fd72ea41 56relationships defined via "REFERENCES" or "FOREIGN KEY" constraints on
14655604 57the tables. If you are parsing the schema of a file that does not
58have these, you will find the natural join options helpful. With
59natural joins, like-named fields will be considered foreign keys.
60This can prove too permissive, however, as you probably don't want a
61field called "name" to be considered a foreign key, so you could
62include it in the "skip" option, and all fields called "name" will be
63excluded from natural joins. A more efficient method, however, might
64be to simply deduce the foriegn keys from primary keys to other fields
2621b0fc 65named the same in other tables. Use the "natural-join-pk" option
daf4f623 66to achieve this.
14655604 67
dd9550a4 68=cut
69
70use strict;
969049ba 71use warnings;
2621b0fc 72use Data::Dumper;
dd9550a4 73use Getopt::Long;
dd9550a4 74use Pod::Usage;
75use SQL::Translator;
76
da06ac74 77use vars '$VERSION';
11ad2df9 78$VERSION = '1.59';
da06ac74 79
aa0a19b9 80#
81# Get arguments.
82#
14655604 83my (
84 $out_file, $image_type, $db_driver, $title, $no_columns,
2621b0fc 85 $no_lines, $font_size, $add_color, $debug, $show_fk_only,
bb44ccb5 86 $gutter, $natural_join, $join_pk_only, $skip_fields, $help
14655604 87);
88
dd9550a4 89GetOptions(
fd72ea41 90 'd|db|f|from=s' => \$db_driver,
2621b0fc 91 'o|output:s' => \$out_file,
92 'i|image:s' => \$image_type,
93 't|title:s' => \$title,
94 'c|columns:i' => \$no_columns,
95 'n|no-lines' => \$no_lines,
f03a04b9 96 'font-size:s' => \$font_size,
bb44ccb5 97 'gutter:i' => \$gutter,
2621b0fc 98 'color' => \$add_color,
99 'show-fk-only' => \$show_fk_only,
100 'natural-join' => \$natural_join,
101 'natural-join-pk' => \$join_pk_only,
102 's|skip:s' => \$skip_fields,
103 'debug' => \$debug,
a9208a9a 104 'h|help' => \$help,
dd9550a4 105) or die pod2usage;
a9208a9a 106my @files = @ARGV; # the create script(s) for the original db
dd9550a4 107
a9208a9a 108pod2usage(1) if $help;
dd9550a4 109pod2usage( -message => "No db driver specified" ) unless $db_driver;
a9208a9a 110pod2usage( -message => 'No input file' ) unless @files;
111
112my $translator = SQL::Translator->new(
113 from => $db_driver,
114 to => 'Diagram',
115 debug => $debug || 0,
116 producer_args => {
117 out_file => $out_file,
118 image_type => $image_type,
bb44ccb5 119 gutter => $gutter || 0,
a9208a9a 120 title => $title,
121 no_columns => $no_columns,
122 no_lines => $no_lines,
123 font_size => $font_size,
124 add_color => $add_color,
125 show_fk_only => $show_fk_only,
126 natural_join => $natural_join,
127 join_pk_only => $join_pk_only,
128 skip_fields => $skip_fields,
129 },
130) or die SQL::Translator->error;
131
132for my $file (@files) {
133 my $output = $translator->translate( $file ) or die
134 "Error: " . $translator->error;
135 if ( $out_file ) {
136 print "Image written to '$out_file'. Done.\n";
14655604 137 }
138 else {
a9208a9a 139 print $output;
14655604 140 }
dd9550a4 141}
142
daf4f623 143# -------------------------------------------------------------------
144
dd9550a4 145=pod
146
147=head1 AUTHOR
148
969049ba 149Ken Youens-Clark E<lt>kclark@cpan.orgE<gt>.
dd9550a4 150
151=cut