#!/usr/bin/env perl # ------------------------------------------------------------------- # Copyright (C) 2002-2011 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 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 --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 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 foreign 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.62'; # # Get arguments. # my ( $out_file, $output_type, $db_driver, $title, $num_columns, $no_lines, $font_size, $add_color, $debug, $show_fk_only, $gutter, $natural_join, $join_pk_only, $skip_fields, $skip_tables, $skip_tables_like, $help ); GetOptions( 'd|db|f|from=s' => \$db_driver, 'o|output:s' => \$out_file, 'i|image:s' => \$output_type, 't|title:s' => \$title, 'c|columns:i' => \$num_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, 'skip-tables:s' => \$skip_tables, 'skip-tables-like:s' => \$skip_tables_like, '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, output_type => $output_type, gutter => $gutter || 0, title => $title, num_columns => $num_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, skip_tables => $skip_tables, skip_tables_like => $skip_tables_like, }, ) or die SQL::Translator->error; binmode STDOUT unless $out_file; 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 Ekclark@cpan.orgE. =cut