#!/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.cgi - CGI front-end for SQL::Translator =head1 DESCRIPTION Place this script in your "cgi-bin" directory and point your browser to it. This script is meant to be a simple graphical interface to all the parsers and producers of SQL::Translator. =cut # ------------------------------------------------------------------- use strict; use warnings; use CGI; use SQL::Translator; use vars '$VERSION'; $VERSION = '1.59'; my $q = CGI->new; eval { if ( $q->param ) { 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 $output_type = $producer eq 'Diagram' ? $q->param('diagram_output_type') : $producer eq 'GraphViz' ? $q->param('graphviz_output_type') : '' ; my $t = SQL::Translator->new( from => $q->param('parser'), producer_args => { add_drop_table => $q->param('add_drop_table'), output_type => $output_type, 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, ttfile => $q->upload('template'), validate => $q->param('validate'), emit_empty_tags => $q->param('emit_empty_tags'), attrib_values => $q->param('attrib_values'), no_comments => !$q->param('comments'), }, parser_args => { trim_fields => $q->param('trim_fields'), scan_fields => $q->param('scan_fields'), field_separator => $q->param('fs'), record_separator => $q->param('rs'), }, ) or die SQL::Translator->error; my $image_type = ''; my $text_type = 'plain'; if ( $output_type =~ /(gif|png|jpeg)/ ) { $image_type = $output_type; } elsif ( $output_type eq 'svg' ) { $image_type = 'svg+xml'; } elsif ( $output_type =~ /gd/ ) { $image_type = 'png'; } elsif ( $output_type eq 'ps' ) { $text_type = 'postscript'; } elsif ( $producer eq 'HTML' ) { $text_type = 'html'; } my $header_type = $image_type ? "image/$image_type" : "text/$text_type"; $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( [ 'Upload your schema file:', $q->filefield( -name => 'schema_file'), ] ), ), $q->Tr( $q->td( [ 'Or paste your schema here:', $q->textarea( -name => 'schema', -rows => 5, -columns => 60, ), ] ), ), $q->Tr( $q->td( [ 'Parser:', $q->radio_group( -name => 'parser', -values => [ qw( MySQL PostgreSQL Oracle Sybase Excel XML-SQLFairy xSV ) ], -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 TTSchema XML-SQLFairy ] ], -default => 'GraphViz', -rows => 3, ), ] ), ), $q->Tr( $q->td( { -colspan => 2, -align => 'center' }, $q->submit( -name => 'submit', -value => 'Submit', ) ), ), $q->Tr( $q->th( { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 'General Options:' ), ), $q->Tr( $q->td( [ 'Validate Schema:', $q->radio_group( -name => 'validate', -values => [ 1, 0 ], -labels => { 1 => 'Yes', 0 => 'No' }, -default => 0, -rows => 2, ), ] ), ), $q->Tr( $q->th( { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 'DB Producer Options:' ), ), $q->Tr( $q->td( [ 'Add "DROP TABLE" statements:', $q->radio_group( -name => 'add_drop_table', -values => [ 1, 0 ], -labels => { 1 => 'Yes', 0 => 'No' }, -default => 0, -rows => 2, ), ] ), ), $q->Tr( $q->td( [ 'Include comments:', $q->radio_group( -name => 'comments', -values => [ 1, 0 ], -labels => { 1 => 'Yes', 0 => 'No' }, -default => 1, -rows => 2, ), ] ), ), $q->Tr( $q->th( { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 'HTML/POD/Diagram Producer Options:' ), ), $q->Tr( $q->td( [ 'Title:', $q->textfield('title'), ] ), ), $q->Tr( $q->th( { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 'TTSchema Producer Options:' ), ), $q->Tr( $q->td( [ 'Template:', $q->filefield( -name => 'template'), ] ), ), $q->Tr( $q->th( { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 'Graphical Producer Options' ), ), $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( [ '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( [ 'Add Color:', $q->radio_group( -name => 'add_color', -values => [ 1, 0 ], -labels => { 1 => 'Yes', 0 => 'No' }, -default => 1, -rows => 2, ), ] ), ), $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->th( { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 'Diagram Producer Options' ), ), $q->Tr( $q->td( [ 'Output Type:', $q->radio_group( -name => 'diagram_output_type', -values => [ 'png', 'jpeg' ], -default => 'png', -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->th( { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 'GraphViz Producer Options' ), ), $q->Tr( $q->td( [ 'Output Type:', $q->radio_group( -name => 'graphviz_output_type', -values => [ qw( canon text ps hpgl pcl mif pic gd gd2 gif jpeg png wbmp cmap ismap imap vrml vtx mp fig svg plain ) ], -default => 'png', -rows => 4, ), ] ), ), $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 => 4, ), ] ), ), $q->Tr( $q->td( [ 'Height:', $q->textfield( -name => 'height' ), ] ), ), $q->Tr( $q->td( [ 'Width:', $q->textfield( -name => 'width' ), ] ), ), $q->Tr( $q->th( { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 'XML Producer Options:' ), ), $q->Tr( $q->td( [ 'Use attributes for values:', $q->radio_group( -name => 'attrib-values', -values => [ 1, 0 ], -labels => { 1 => 'Yes', 0 => 'No' }, -default => 0, -rows => 2, ), ] ), ), $q->Tr( $q->td( [ 'Emit Empty Tags:', $q->radio_group( -name => 'emit-empty-tags', -values => [ 1, 0 ], -labels => { 1 => 'Yes', 0 => 'No' }, -default => 0, -rows => 2, ), ] ), ), $q->Tr( $q->th( { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 'xSV Parser Options' ), ), $q->Tr( $q->td( [ 'Field Separator:', $q->textfield( -name => 'fs' ), ] ), ), $q->Tr( $q->td( [ 'Record Separator:', $q->textfield( -name => 'rs' ), ] ), ), $q->Tr( $q->td( [ 'Trim Whitespace Around Fields:', $q->radio_group( -name => 'trim_fields', -values => [ 1, 0 ], -default => 1, -labels => { 1 => 'Yes', 0 => 'No', }, -rows => 2, ), ] ), ), $q->Tr( $q->td( [ 'Scan Fields for Data Type:', $q->radio_group( -name => 'scan_fields', -values => [ 1, 0 ], -default => 1, -labels => { 1 => 'Yes', 0 => 'No', }, -rows => 2, ), ] ), ), $q->Tr( $q->td( { -colspan => 2, -align => 'center' }, $q->submit( -name => 'submit', -value => 'Submit', ) ), ), ), $q->end_form, $q->end_html; } # ------------------------------------------------------------------- =pod =head1 AUTHOR Ken Youens-Clark Ekclark@cpan.orgE. =head1 SEE ALSO L, L =cut