+++ /dev/null
-#!/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-graph - Automatically create a graph from a database schema
-
-=head1 SYNOPSIS
-
- ./sqlt-graph -d|--db|-f|--from=db_parser [options] schema.sql
-
- Options:
-
- -l|--layout Layout schema for GraphViz
- ("dot," "neato," "twopi"; default "dot")
- -n|--node-shape Shape of the nodes ("record," "plaintext,"
- "ellipse," "circle," "egg," "triangle," "box,"
- "diamond," "trapezium," "parallelogram," "house,"
- "hexagon," "octagon," default "record")
- -o|--output Output file name (default STDOUT)
- -t|--output-type Output file type ("canon", "text," "ps," "hpgl,"
- "pcl," "mif," "pic," "gd," "gd2," "gif," "jpeg,"
- "png," "wbmp," "cmap," "ismap," "imap," "vrml,"
- "vtx," "mp," "fig," "svg," "plain," default "png")
- -c|--color Add colors
- --cluster Cluster tables
- --no-fields Don't show field names
- --height Image height (in inches, default "11",
- set to "0" to undefine)
- --width Image width (in inches, default "8.5",
- set to "0" to undefine)
- --fontsize custom font size for node and edge labels
- --fontname name of custom font (or full path to font file) for
- node, edge, and graph labels
- --nodeattr attribute name and value (in key=val syntax) for
- nodes; this option may be repeated to specify
- multiple node attributes
- --edgeattr same as --nodeattr, but for edge attributes
- --graphattr same as --nodeattr, but for graph attributes
- --natural-join Perform natural joins
- --natural-join-pk Perform natural joins from primary keys only
- --show-datatypes Show datatype of each field
- --show-sizes Show column sizes for VARCHAR and CHAR fields
- --show-constraints Show list of constraints for each field
- -s|--skip Fields to skip in natural joins
- --skip-tables Comma-separated list of table names to exclude
- --skip-tables-like Comma-separated list of regexen to exclude tables
- --debug Print debugging information
-
-=head1 DESCRIPTION
-
-This script will create a graph 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 "REFERNCES" 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 acheive this.
-
-If the schema defines foreign keys, then the graph produced will be
-directed showing the direction of the relationship. If the foreign
-keys are intuited via natural joins, the graph will be undirected.
-
-The syntax for clustering tables into groups is:
-
- cluster1=table1,table2;cluster2=table3,table4
-
-=cut
-
-# -------------------------------------------------------------------
-
-use strict;
-use warnings;
-use Data::Dumper;
-use Getopt::Long;
-use GraphViz;
-use Pod::Usage;
-use SQL::Translator;
-
-use vars '$VERSION';
-$VERSION = '1.59';
-
-#
-# Get arguments.
-#
-my (
- $layout, $node_shape, $out_file, $output_type, $db_driver, $add_color,
- $natural_join, $join_pk_only, $skip_fields, $show_datatypes,
- $show_sizes, $show_constraints, $debug, $help, $height, $width,
- $no_fields, $fontsize, $fontname, $skip_tables, $skip_tables_like,
- $cluster
-);
-
-# multi-valued options:
-my %edgeattrs = ();
-my %nodeattrs = ();
-my %graphattrs = ();
-
-GetOptions(
- 'd|db|f|from=s' => \$db_driver,
- 'o|output:s' => \$out_file,
- 'l|layout:s' => \$layout,
- 'n|node-shape:s' => \$node_shape,
- 't|output-type:s' => \$output_type,
- 'height:f' => \$height,
- 'width:f' => \$width,
- 'fontsize=i' => \$fontsize,
- 'fontname=s' => \$fontname,
- 'nodeattr=s' => \%nodeattrs,
- 'edgeattr=s' => \%edgeattrs,
- 'graphattr=s' => \%graphattrs,
- 'c|color' => \$add_color,
- 'cluster:s' => \$cluster,
- 'no-fields' => \$no_fields,
- 'natural-join' => \$natural_join,
- 'natural-join-pk' => \$join_pk_only,
- 's|skip:s' => \$skip_fields,
- 'skip-tables:s' => \$skip_tables,
- 'skip-tables-like:s' => \$skip_tables_like,
- 'show-datatypes' => \$show_datatypes,
- 'show-sizes' => \$show_sizes,
- 'show-constraints' => \$show_constraints,
- '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 => 'GraphViz',
- debug => $debug || 0,
- producer_args => {
- out_file => $out_file,
- layout => $layout,
- node_shape => $node_shape,
- output_type => $output_type,
- add_color => $add_color,
- natural_join => $natural_join,
- natural_join_pk => $join_pk_only,
- skip_fields => $skip_fields,
- skip_tables => $skip_tables,
- skip_tables_like => $skip_tables_like,
- show_datatypes => $show_datatypes,
- show_sizes => $show_sizes,
- show_constraints => $show_constraints,
- cluster => $cluster,
- height => $height || 0,
- width => $width || 0,
- fontsize => $fontsize,
- fontname => $fontname,
- nodeattrs => \%nodeattrs,
- edgeattrs => \%edgeattrs,
- graphattrs => \%graphattrs,
- show_fields => $no_fields ? 0 : 1,
- },
-) 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>.
-
-=head1 SEE ALSO
-
-perl, SQL::Translator.
-
-=cut