#!/usr/bin/perl
# -------------------------------------------------------------------
# $Id: sqlt.cgi,v 1.4 2004-02-06 17:48:16 kycl4rk Exp $
# -------------------------------------------------------------------
# Copyright (C) 2002-4 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 CGI;
use SQL::Translator;
use vars '$VERSION';
$VERSION = sprintf "%d.%02d", q$Revision: 1.4 $ =~ /(\d+)\.(\d+)/;
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 Y. Clark Ekclark@cpan.orgE.
=head1 SEE ALSO
perl, SQL::Translator.
=cut