Fix a couple of tests and add forgotten dependency
[dbsrgits/SQL-Translator.git] / script / sqlt-diagram
diff --git a/script/sqlt-diagram b/script/sqlt-diagram
new file mode 100755 (executable)
index 0000000..7e38a04
--- /dev/null
@@ -0,0 +1,151 @@
+#!/usr/bin/env perl
+
+# -------------------------------------------------------------------
+# Copyright (C) 2002-2009 SQLFairy Authors
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; version 2.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+# 02111-1307  USA
+# -------------------------------------------------------------------
+
+=head1 NAME 
+
+sqlt-diagram - Automatically create a diagram from a database schema
+
+=head1 SYNOPSIS
+
+  ./sqlt-diagram -d|-f|--from|--db=db_parser [options] schema.sql
+
+  Options:
+
+    -o|--output        Output file name (default STDOUT)
+    -i|--image         Output image type ("png" or "jpeg," default "png")
+    -t|--title         Title to give schema
+    -c|--cols          Number of columns
+    -n|--no-lines      Don't draw lines
+    --font-size        Font size ("small," "medium," "large," or "huge,"
+                       default "medium")
+    --gutter           Gutter size between tables
+    --color            Add colors
+    --show-fk-only     Only show fields that act as primary 
+                       or foreign keys
+
+    --natural-join     Perform natural joins
+    --natural-join-pk  Perform natural joins from primary keys only
+    -s|--skip          Fields to skip in natural joins
+    --debug            Print debugging information
+
+=head1 DESCRIPTION
+
+This script will create a picture of your schema.  Only the database
+driver argument (for SQL::Translator) is required.  If no output file
+name is given, then image will be printed to STDOUT, so you should
+redirect the output into a file.
+
+The default action is to assume the presence of foreign key
+relationships defined via "REFERENCES" or "FOREIGN KEY" constraints on
+the tables.  If you are parsing the schema of a file that does not
+have these, you will find the natural join options helpful.  With
+natural joins, like-named fields will be considered foreign keys.
+This can prove too permissive, however, as you probably don't want a
+field called "name" to be considered a foreign key, so you could
+include it in the "skip" option, and all fields called "name" will be
+excluded from natural joins.  A more efficient method, however, might
+be to simply deduce the foriegn keys from primary keys to other fields
+named the same in other tables.  Use the "natural-join-pk" option
+to achieve this.
+
+=cut
+
+use strict;
+use warnings;
+use Data::Dumper;
+use Getopt::Long;
+use Pod::Usage;
+use SQL::Translator;
+
+use vars '$VERSION';
+$VERSION = '1.59';
+
+#
+# Get arguments.
+#
+my ( 
+    $out_file, $image_type, $db_driver, $title, $no_columns, 
+    $no_lines, $font_size, $add_color, $debug, $show_fk_only,
+    $gutter, $natural_join, $join_pk_only, $skip_fields, $help
+);
+
+GetOptions(
+    'd|db|f|from=s'   => \$db_driver,
+    'o|output:s'      => \$out_file,
+    'i|image:s'       => \$image_type,
+    't|title:s'       => \$title,
+    'c|columns:i'     => \$no_columns,
+    'n|no-lines'      => \$no_lines,
+    'font-size:s'   => \$font_size,
+    'gutter:i'        => \$gutter,
+    'color'           => \$add_color,
+    'show-fk-only'    => \$show_fk_only,
+    'natural-join'    => \$natural_join,
+    'natural-join-pk' => \$join_pk_only,
+    's|skip:s'        => \$skip_fields,
+    'debug'           => \$debug,
+    'h|help'          => \$help,
+) or die pod2usage;
+my @files = @ARGV; # the create script(s) for the original db
+
+pod2usage(1) if $help;
+pod2usage( -message => "No db driver specified" ) unless $db_driver;
+pod2usage( -message => 'No input file'          ) unless @files;
+
+my $translator       =  SQL::Translator->new( 
+    from             => $db_driver,
+    to               => 'Diagram',
+    debug            => $debug || 0,
+    producer_args    => {
+        out_file     => $out_file,
+        image_type   => $image_type,
+        gutter       => $gutter || 0,
+        title        => $title,
+        no_columns   => $no_columns,
+        no_lines     => $no_lines,
+        font_size    => $font_size,
+        add_color    => $add_color,
+        show_fk_only => $show_fk_only,
+        natural_join => $natural_join,
+        join_pk_only => $join_pk_only,
+        skip_fields  => $skip_fields,
+    },
+) or die SQL::Translator->error;
+
+for my $file (@files) {
+    my $output = $translator->translate( $file ) or die
+                 "Error: " . $translator->error;
+    if ( $out_file ) {
+        print "Image written to '$out_file'.  Done.\n";
+    }
+    else {
+        print $output;
+    }
+}
+
+# -------------------------------------------------------------------
+
+=pod
+
+=head1 AUTHOR
+
+Ken Youens-Clark E<lt>kclark@cpan.orgE<gt>.
+
+=cut