package SQL::Translator::Producer::GraphViz;
# -------------------------------------------------------------------
-# $Id$
-# -------------------------------------------------------------------
# Copyright (C) 2002-2009 SQLFairy Authors
#
# This program is free software; you can redistribute it and/or
=item * out_file
-the name of the file where the graphviz graphic is to be written
+The name of the file where the resulting GraphViz output will be
+written. Alternatively an open filehandle can be supplied. If
+undefined (the default) - the result is returned as a string.
=item * layout (DEFAULT: 'dot')
which columns are included in the index. this option requires
that show_fields is a true value as well
-=item * show_index_name
+=item * show_index_names
if show_indexes is set to a true value, then the value of this
parameter determines whether or not to print names of indexes.
-if show_index_name is false, then a list of indexed columns
+if show_index_names is false, then a list of indexed columns
will appear below the field list. otherwise, it will be a list
prefixed with the name of each index. it defaults to true.
use GraphViz;
use SQL::Translator::Schema::Constants;
use SQL::Translator::Utils qw(debug);
+use Scalar::Util qw/openhandle/;
use vars qw[ $VERSION $DEBUG ];
-$VERSION = sprintf "%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/;
+$VERSION = '1.59';
$DEBUG = 0 unless defined $DEBUG;
use constant VALID_LAYOUT => {
octagon => 1,
};
-use constant VALID_OUTPUT => {
- canon => 1,
- text => 1,
- ps => 1,
- hpgl => 1,
- pcl => 1,
- mif => 1,
- pic => 1,
- gd => 1,
- gd2 => 1,
- gif => 1,
- jpeg => 1,
- png => 1,
- wbmp => 1,
- cmap => 1,
- ismap => 1,
- imap => 1,
- vrml => 1,
- vtx => 1,
- mp => 1,
- fig => 1,
- svg => 1,
- plain => 1,
-};
-
sub produce {
my $t = shift;
my $schema = $t->schema;
my $show_datatypes = $args->{'show_datatypes'};
my $show_sizes = $args->{'show_sizes'};
my $show_indexes = $args->{'show_indexes'};
- my $show_index_name = defined $args->{'show_index_name'} ? $args->{'show_index_name'} : 1;
+ my $show_index_names = defined $args->{'show_index_names'} ? $args->{'show_index_names'} : 1;
my $friendly_ints = $args->{'friendly_ints'};
my $friendly_ints_ex = $args->{'friendly_ints_extended'};
my $show_constraints = $args->{'show_constraints'};
) if $natural_join;
die "Invalid layout '$layout'" unless VALID_LAYOUT->{ $layout };
- die "Invalid output type: '$output_type'"
- unless VALID_OUTPUT->{ $output_type };
die "Invalid node shape'$node_shape'"
unless VALID_NODE_SHAPE->{ $node_shape };
$_ = 0 if $_ < 0;
}
- #
- # Create GraphViz and see if we can produce the output type.
- #
my %args = (
directed => $natural_join ? 0 : 1,
layout => $layout,
$args{'graph'}->{$key} = $val;
}
- my $gv = GraphViz->new( %args ) or die "Can't create GraphViz object\n";
+ #
+ # Create a blank GraphViz object and see if we can produce the output type.
+ #
+ my $gv = GraphViz->new( %args ) or die "Can't create GraphViz object\n";
+ my $output_method = "as_$output_type";
+
+ # the generators are AUTOLOADed so can't use ->can ($output_method)
+ eval { $gv->$output_method };
+ die "Invalid output type: '$output_type'" if $@;
+
my %nj_registry; # for locations of fields for natural joins
my @fk_registry; # for locations of fields for foreign keys
# mediumint* (24) 8388607 7
# 16777215 8
# int (32) 2147483647 10
- # 4294967295 10
+ # 4294967295 11
# bigint (64) 9223372036854775807 19
# 18446744073709551615 20
#
push @fmt_indexes, join (' ',
'*',
- $show_index_name ? $index->name . ':' : (),
+ $show_index_names ? $index->name . ':' : (),
join (', ', $index->fields),
($index->type eq 'UNIQUE') ? '[U]' : (),
);
#
# Print the image.
#
- my $output_method = "as_$output_type";
if ( $out_file ) {
+ if (openhandle ($out_file)) {
+ print $out_file $gv->$output_method;
+ }
+ else {
open my $fh, ">$out_file" or die "Can't write '$out_file': $!\n";
binmode $fh;
print $fh $gv->$output_method;
close $fh;
+ }
}
else {
- return $gv->$output_method;
+ return $gv->$output_method;
}
}