#!/usr/bin/perl
# -------------------------------------------------------------------
-# $Id: sqlt.cgi,v 1.1 2003-08-26 16:25:34 kycl4rk Exp $
+# $Id: sqlt.cgi,v 1.2 2003-08-27 04:01:14 kycl4rk Exp $
# -------------------------------------------------------------------
# Copyright (C) 2003 Ken Y. Clark <kclark@cpan.org>
#
=head1 NAME
-sqlt.cgi
+sqlt.cgi - CGI front-end for SQL::Translator
=head1 DESCRIPTION
-A CGI front-end for SQL::Translator.
+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.1 $ =~ /(\d+)\.(\d+)/;
+$VERSION = sprintf "%d.%02d", q$Revision: 1.2 $ =~ /(\d+)\.(\d+)/;
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');
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';
+ my $output_type = $producer eq 'Diagram'
+ ? $q->param('diagram_output_type')
+ : $producer eq 'GraphViz'
+ ? $q->param('graphviz_output_type')
+ : 'png'
+ ;
+
+ 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';
+ }
+
+ my $header_type = $image_type ? "image/$image_type" : "text/$text_type";
$t->data( $data );
$t->producer( $producer );
$q->table( { -border => 1 },
$q->Tr(
$q->td( [
- 'Paste your schema here:',
- $q->textarea(
- -name => 'schema',
- -rows => 10,
- -columns => 60,
- ),
+ 'Upload your schema file:',
+ $q->filefield( -name => 'schema_file'),
] ),
),
$q->Tr(
$q->td( [
- 'Or upload your schema file:',
- $q->filefield( -name => 'schema_file'),
+ 'Or paste your schema here:',
+ $q->textarea(
+ -name => 'schema',
+ -rows => 5,
+ -columns => 60,
+ ),
] ),
),
$q->Tr(
'Parser:',
$q->radio_group(
-name => 'parser',
- -values => [ 'MySQL', 'PostgreSQL', 'Oracle' ],
+ -values => [ qw( MySQL PostgreSQL Oracle
+ Sybase Excel XML-SQLFairy xSV
+ ) ],
-default => 'MySQL',
-rows => 3,
),
$q->radio_group(
-name => 'producer',
-values => [ qw[ ClassDBI Diagram GraphViz HTML
- MySQL Oracle POD PostgreSQL SQLite Sybase XML
+ 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( [
- 'Title:',
- $q->textfield('title'),
+ '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( [
- 'Output Type:',
+ 'Add "DROP TABLE" statements:',
$q->radio_group(
- -name => 'output_type',
- -values => [ 'png', 'jpeg' ],
- -default => 'png',
+ -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',
),
$q->Tr(
$q->td( [
- 'Color:',
+ '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 ],
),
$q->Tr(
$q->td( [
- 'Show Only Foreign Keys *:',
+ 'Show Field Names:',
$q->radio_group(
- -name => 'show_fk_only',
+ -name => 'show_fields',
-values => [ 1, 0 ],
- -default => 0,
+ -default => 1,
-labels => {
1 => 'Yes',
0 => 'No',
] ),
),
$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 *:',
+ 'Font Size:',
$q->radio_group(
-name => 'font_size',
-values => [ qw( small medium large ) ],
),
$q->Tr(
$q->td( [
- 'Number of Columns *:',
+ '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 **:',
+ 'Layout:',
$q->radio_group(
-name => 'layout',
-values => [ qw( dot neato twopi ) ],
),
$q->Tr(
$q->td( [
- 'Node Shape **:',
+ 'Node Shape:',
$q->radio_group(
-name => 'node_shape',
-values => [ qw( record plaintext ellipse
parallelogram house hexagon octagon
) ],
-default => 'record',
- -rows => 13,
+ -rows => 4,
),
] ),
),
$q->Tr(
$q->td( [
- 'Show Field Names **:',
+ '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 => 'show_fields',
+ -name => 'attrib-values',
-values => [ 1, 0 ],
- -default => 1,
- -labels => {
- 1 => 'Yes',
- 0 => 'No',
+ -labels => {
+ 1 => 'Yes',
+ 0 => 'No'
},
+ -default => 0,
-rows => 2,
),
] ),
),
$q->Tr(
$q->td( [
- 'Height **:',
- $q->textfield( -name => 'height', -default => 11 ),
+ '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( [
- 'Width **:',
- $q->textfield( -name => 'width', -default => 8.5 ),
+ '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->submit(
-name => 'submit',
-value => 'Submit',
- ),
- $q->br,
- q[
- <small>
- * -- Applies to diagram only<br>
- ** -- Applies to graph only<br>
- </small>
- ],
+ )
),
),
),