From: Ken Youens-Clark Date: Tue, 26 Aug 2003 02:29:12 +0000 (+0000) Subject: Moving files around, removing ".pl" suffixes, now all start with "sqlt." X-Git-Tag: v0.04~226 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=7d8b348991ab628caa939808ed6282577312f7e0;p=dbsrgits%2FSQL-Translator.git Moving files around, removing ".pl" suffixes, now all start with "sqlt." --- diff --git a/bin/sql_translator.cgi b/bin/sql_translator.cgi deleted file mode 100755 index 072e4ef..0000000 --- a/bin/sql_translator.cgi +++ /dev/null @@ -1,315 +0,0 @@ -#!/usr/bin/perl - -# ------------------------------------------------------------------- -# $Id: sql_translator.cgi,v 1.4 2003-08-21 02:47:22 kycl4rk Exp $ -# ------------------------------------------------------------------- -# Copyright (C) 2003 Ken Y. Clark -# -# 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 - -auto-viv.cgi - -=head1 DESCRIPTION - -A CGI script for transforming SQL schemas into pictures, either GraphViz -graphs or ER diagrams. Basically, a simple web-form front-end for the -myriad options available to "auto-dia.pl" and "auto-graph.pl." - -=cut - -use strict; -use CGI; -use SQL::Translator; - -my $q = CGI->new; - -eval { - if ( $q->param ) { - my $t = SQL::Translator->new( - from => $q->param('parser'), - producer_args => { - image_type => $q->param('output_type') || 'png', - title => $q->param('title') || 'Schema', - natural_join => $q->param('natural_join') eq 'no' ? 0 : 1, - join_pk_only => $q->param('natural_join') eq 'pk_only' ? 1 : 0, - add_color => $q->param('add_color'), - skip_fields => $q->param('skip_fields'), - show_fk_only => $q->param('show_fk_only'), - font_size => $q->param('font_size'), - no_columns => $q->param('no_columns'), - node_shape => $q->param('node_shape'), - layout => $q->param('layout') || '', - height => $q->param('height') || 0, - width => $q->param('width') || 0, - show_fields => $q->param('show_fields') || 0, - }, - ) or die SQL::Translator->error; - - my $data; - if ( $q->param('schema') ) { - $data = $q->param('schema'); - } - elsif ( my $fh = $q->upload('schema_file') ) { - local $/; - $data = <$fh>; - } - die "No schema provided!\n" unless $data; - - my $producer = $q->param('producer'); - my $image_type = $q->param('output_type') || 'png'; - my $header_type = - $producer =~ m/(GraphViz|Diagram)/ - ? "image/$image_type" - : 'text/plain'; - - $t->data( $data ); - $t->producer( $producer ); - my $output = $t->translate or die $t->error; - - print $q->header( -type => $header_type ), $output; - } - else { - show_form( $q ); - } -}; - -if ( my $error = $@ ) { - print $q->header, $q->start_html('Error'), - $q->h1('Error'), $error, $q->end_html; -} - -# ------------------------------------------------------------------- -sub show_form { - my $q = shift; - my $title = 'SQL::Translator'; - - print $q->header, - $q->start_html( -title => $title ), - $q->h1( qq[$title] ), - $q->start_form(-enctype => 'multipart/form-data'), - $q->table( { -border => 1 }, - $q->Tr( - $q->td( [ - 'Paste your schema here:', - $q->textarea( - -name => 'schema', - -rows => 10, - -columns => 60, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Or upload your schema file:', - $q->filefield( -name => 'schema_file'), - ] ), - ), - $q->Tr( - $q->td( [ - 'Parser:', - $q->radio_group( - -name => 'parser', - -values => [ 'MySQL', 'PostgreSQL', 'Oracle' ], - -default => 'MySQL', - -rows => 3, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Producer:', - $q->radio_group( - -name => 'producer', - -values => [ qw[ ClassDBI Diagram GraphViz HTML - MySQL Oracle POD PostgreSQL SQLite Sybase XML - ] ], - -default => 'GraphViz', - -rows => 3, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Title:', - $q->textfield('title'), - ] ), - ), - $q->Tr( - $q->td( [ - 'Output Type:', - $q->radio_group( - -name => 'output_type', - -values => [ 'png', 'jpeg' ], - -default => 'png', - -rows => 2, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Perform Natural Joins:', - $q->radio_group( - -name => 'natural_join', - -values => [ 'no', 'yes', 'pk_only' ], - -labels => { - no => 'No', - yes => 'Yes, on all like-named fields', - pk_only => 'Yes, but only from primary keys' - }, - -default => 'no', - -rows => 3, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Skip These Fields in Natural Joins:', - $q->textarea( - -name => 'skip_fields', - -rows => 3, - -columns => 60, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Color:', - $q->radio_group( - -name => 'add_color', - -values => [ 1, 0 ], - -labels => { - 1 => 'Yes', - 0 => 'No' - }, - -default => 1, - -rows => 2, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Show Only Foreign Keys *:', - $q->radio_group( - -name => 'show_fk_only', - -values => [ 1, 0 ], - -default => 0, - -labels => { - 1 => 'Yes', - 0 => 'No', - }, - -rows => 2, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Font Size *:', - $q->radio_group( - -name => 'font_size', - -values => [ qw( small medium large ) ], - -default => 'medium', - -rows => 3, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Number of Columns *:', - $q->textfield('no_columns'), - ] ), - ), - $q->Tr( - $q->td( [ - 'Layout **:', - $q->radio_group( - -name => 'layout', - -values => [ qw( dot neato twopi ) ], - -default => 'dot', - -rows => 3, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Node Shape **:', - $q->radio_group( - -name => 'node_shape', - -values => [ qw( record plaintext ellipse - circle egg triangle box diamond trapezium - parallelogram house hexagon octagon - ) ], - -default => 'record', - -rows => 13, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Show Field Names **:', - $q->radio_group( - -name => 'show_fields', - -values => [ 1, 0 ], - -default => 1, - -labels => { - 1 => 'Yes', - 0 => 'No', - }, - -rows => 2, - ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Height **:', - $q->textfield( -name => 'height', -default => 11 ), - ] ), - ), - $q->Tr( - $q->td( [ - 'Width **:', - $q->textfield( -name => 'width', -default => 8.5 ), - ] ), - ), - $q->Tr( - $q->td( - { -colspan => 2, -align => 'center' }, - $q->submit( - -name => 'submit', - -value => 'Submit', - ), - $q->br, - q[ - - * -- Applies to diagram only
- ** -- Applies to graph only
-
- ], - ), - ), - ), - $q->end_form, - $q->end_html; -} - -=pod - -=head1 AUTHOR - -Ken Y. Clark Ekclark@cpan.orgE - -=cut diff --git a/bin/sql_translator.pl b/bin/sqlt similarity index 97% rename from bin/sql_translator.pl rename to bin/sqlt index 61a761b..8038ac0 100755 --- a/bin/sql_translator.pl +++ b/bin/sqlt @@ -1,7 +1,7 @@ #!/usr/bin/perl -w # ------------------------------------------------------------------- -# $Id: sql_translator.pl,v 1.14 2003-08-21 02:47:43 kycl4rk Exp $ +# $Id: sqlt,v 1.1 2003-08-26 02:29:12 kycl4rk Exp $ # ------------------------------------------------------------------- # Copyright (C) 2002 Ken Y. Clark , # darren chamberlain @@ -29,7 +29,7 @@ use SQL::Translator; use Data::Dumper; use vars qw( $VERSION ); -$VERSION = sprintf "%d.%02d", q$Revision: 1.14 $ =~ /(\d+)\.(\d+)/; +$VERSION = sprintf "%d.%02d", q$Revision: 1.1 $ =~ /(\d+)\.(\d+)/; my $from; # the original database my $to; # the destination database diff --git a/bin/sqlt-diagram.pl b/bin/sqlt-diagram similarity index 97% rename from bin/sqlt-diagram.pl rename to bin/sqlt-diagram index c84d7ee..cfe5f91 100755 --- a/bin/sqlt-diagram.pl +++ b/bin/sqlt-diagram @@ -1,6 +1,6 @@ #!/usr/bin/perl -# $Id: sqlt-diagram.pl,v 1.2 2003-06-16 18:25:36 kycl4rk Exp $ +# $Id: sqlt-diagram,v 1.1 2003-08-26 02:29:12 kycl4rk Exp $ =head1 NAME @@ -56,7 +56,7 @@ use Getopt::Long; use Pod::Usage; use SQL::Translator; -my $VERSION = (qw$Revision: 1.2 $)[-1]; +my $VERSION = (qw$Revision: 1.1 $)[-1]; # # Get arguments. diff --git a/bin/sqlt-dumper.pl b/bin/sqlt-dumper.pl deleted file mode 100755 index 14b3555..0000000 --- a/bin/sqlt-dumper.pl +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/perl - -# ------------------------------------------------------------------- -# $Id: sqlt-dumper.pl,v 1.3 2003-08-21 00:29:57 kycl4rk Exp $ -# ------------------------------------------------------------------- -# Copyright (C) 2003 Ken Y. Clark -# -# 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-dumper.pl - create a dumper script from a schema - -=head1 SYNOPSIS - - ./sqlt-dumper.pl -d Oracle [options] schema.sql > dumper.pl - ./dumper.pl > data.sql - - Options: - - -h|--help Show help and exit - --add-truncate Add "TRUNCATE TABLE" statements for each table - --skip=t1[,t2] Skip tables in comma-separated list - -u|--user Database username - -p|--password Database password - --dsn DSN for DBI - -=head1 DESCRIPTION - -This script uses SQL::Translator to parse the SQL schema and create a -Perl script that can connect to the database and dump the data as -INSERT statements a la mysqldump. If you enable "add-truncate" or -specify tables to "skip," then the generated dumper script will have -those hardcoded. However, these will also be options in the generated -dumper, so you can wait to specify these options when you dump your -database. The database username, password, and DSN can be hardcoded -into the generated script, or part of the DSN can be intuited from the -"database" argument. - -=cut - -use strict; -use Pod::Usage; -use Getopt::Long; -use SQL::Translator; - -my ( $help, $db, $add_truncate, $skip, $db_user, $db_pass, $dsn ); -GetOptions( - 'h|help' => \$help, - 'd|f|from|db=s' => \$db, - 'add-truncate' => \$add_truncate, - 'skip:s' => \$skip, - 'u|user:s' => \$db_user, - 'p|password:s' => \$db_pass, - 'dsn:s' => \$dsn, -) or pod2usage; - -pod2usage(0) if $help; -pod2usage( 'No database driver specified' ) unless $db; -$db_user ||= 'username'; -$db_pass ||= 'password'; -$dsn ||= "dbi:$db:_"; - -my $file = shift @ARGV or pod2usage( -msg => 'No input file' ); - -my $t = SQL::Translator->new; -$t->parser( $db ) or die $t->error, "\n"; -$t->filename( $file ) or die $t->error, "\n"; - -my %skip = map { $_, 1 } map { s/^\s+|\s+$//; $_ } split (/,/, $skip); -my $parser = $t->parser or die $t->error; -$parser->($t, $t->data); -my $schema = $t->schema; -my $now = localtime; - -my $out = <<"EOF"; -#!/usr/bin/perl - -# -# Generated $now -# By sqlt-dumper.pl, part of the SQLFairy project -# For more info, see http://sqlfairy.sourceforge.net/ -# - -use strict; -use DBI; -use Getopt::Long; - -my ( \$help, \$add_truncate, \$skip ); -GetOptions( - 'h|help' => \\\$help, - 'add-truncate' => \\\$add_truncate, - 'skip:s' => \\\$skip, -); - -if ( \$help ) { - print <<"USAGE"; -Usage: - \$0 [options] - - Options: - -h|--help Show help and exit - --add-truncate Add "TRUNCATE TABLE" statements - --skip=t1[,t2] Comma-separated list of tables to skip - -USAGE - exit(0); -} - -my \%skip = map { \$_, 1 } map { s/^\\s+|\\s+\$//; \$_ } split (/,/, \$skip); -my \$db = DBI->connect('$dsn', '$db_user', '$db_pass'); - -EOF - -for my $table ( $schema->get_tables ) { - my $table_name = $table->name; - next if $skip{ $table_name }; - my ( @field_names, %types ); - for my $field ( $table->get_fields ) { - $types{ $field->name } = $field->data_type =~ m/(char|str|long|text)/ - ? 'string' : 'number'; - push @field_names, $field->name; - } - - $out .= join('', - "#\n# Table: $table_name\n#\n{\n", - " next if \$skip{'$table_name'};\n", - " print \"--\\n-- Data for table '$table_name'\\n--\\n\";\n\n", - " if ( \$add_truncate ) {\n", - " print \"TRUNCATE TABLE $table_name;\\n\";\n", - " }\n\n", - ); - - my $insert = "INSERT INTO $table_name (". join(', ', @field_names). - ') VALUES ('; - - if ( $add_truncate ) { - $out .= " print \"TRUNCATE TABLE $table_name;\\n\";\n"; - } - - $out .= join('', - " my \%types = (\n", - join("\n", map { " $_ => '$types{ $_ }'," } @field_names), - "\n );\n\n", - " my \$data = \$db->selectall_arrayref(\n", - " 'select ", join(', ', @field_names), " from $table_name',\n", - " { Columns => {} },\n", - " );\n\n", - " for my \$rec ( \@{ \$data } ) {\n", - " my \@vals;\n", - " for my \$fld ( qw[", join(' ', @field_names), "] ) {\n", - " my \$val = \$rec->{ \$fld };\n", - " if ( \$types{ \$fld } eq 'string' ) {\n", - " \$val =~ s/'/\\'/g;\n", - " \$val = defined \$val ? qq['\$val'] : qq[''];\n", - " }\n", - " else {\n", - " \$val = defined \$val ? \$val : 'NULL';\n", - " }\n", - " push \@vals, \$val;\n", - " }\n", - " print \"$insert\", join(', ', \@vals), \");\\n\";\n", - " }\n", - " print \"\\n\";\n", - "}\n\n", - ); -} - -print $out; diff --git a/bin/sqlt-graph.pl b/bin/sqlt-graph.pl deleted file mode 100755 index 10c94bc..0000000 --- a/bin/sqlt-graph.pl +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/perl - -# $Id: sqlt-graph.pl,v 1.3 2003-08-21 02:48:04 kycl4rk Exp $ - -=head1 NAME - -sqlt-graph.pl - Automatically create a graph from a database schema - -=head1 SYNOPSIS - - ./sqlt-graph.pl -d|--db=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 - --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) - --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 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. - -=cut - -use strict; -use Data::Dumper; -use Getopt::Long; -use GraphViz; -use Pod::Usage; -use SQL::Translator; - -my $VERSION = (qw$Revision: 1.3 $)[-1]; - -# -# Get arguments. -# -my ( - $layout, $node_shape, $out_file, $output_type, $db_driver, $add_color, - $natural_join, $join_pk_only, $skip_fields, $debug, $help, $height, - $width, $no_fields -); - -GetOptions( - 'd|db=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:i' => \$height, - 'width:i' => \$width, - 'c|color' => \$add_color, - 'no-fields' => \$no_fields, - '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 => '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, - height => $height || 0, - width => $width || 0, - 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 Y. Clark Ekclark@cpan.orgE - -=cut