Moved some code around to fix ordering, convert "type" to match what's
[dbsrgits/SQL-Translator.git] / bin / auto-viv.cgi
CommitLineData
69e4626f 1#!/usr/bin/perl
2
3# -------------------------------------------------------------------
be35c82f 4# $Id: auto-viv.cgi,v 1.2 2003-06-05 01:43:35 kycl4rk Exp $
69e4626f 5# -------------------------------------------------------------------
6# Copyright (C) 2003 Ken Y. Clark <kclark@cpan.org>
7#
8# This program is free software; you can redistribute it and/or
9# modify it under the terms of the GNU General Public License as
10# published by the Free Software Foundation; version 2.
11#
12# This program is distributed in the hope that it will be useful, but
13# WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15# General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20# 02111-1307 USA
21# -------------------------------------------------------------------
22
23=head1 NAME
24
25auto-viv.cgi
26
27=head1 DESCRIPTION
28
29A CGI script for transforming SQL schemas into pictures, either GraphViz
30graphs or ER diagrams. Basically, a simple web-form front-end for the
31myriad options available to "auto-dia.pl" and "auto-graph.pl."
32
33=cut
34
35use strict;
36use CGI;
37use SQL::Translator;
38
39my $q = CGI->new;
40
41eval {
42 if ( $q->param ) {
43 my $t = SQL::Translator->new(
44 from => $q->param('database'),
45 producer_args => {
46 image_type => $q->param('output_type') || 'png',
47 title => $q->param('title') || 'Schema',
48 natural_join => $q->param('natural_join') eq 'no' ? 0 : 1,
49 join_pk_only => $q->param('natural_join') eq 'pk_only' ? 1 : 0,
50 add_color => $q->param('add_color'),
51 skip_fields => $q->param('skip_fields'),
52 show_fk_only => $q->param('show_fk_only'),
53 font_size => $q->param('font_size'),
54 no_columns => $q->param('no_columns'),
55 node_shape => $q->param('node_shape'),
be35c82f 56 height => $q->param('height') || 0,
57 width => $q->param('width') || 0,
58 show_fields => $q->param('show_fields') || 0,
69e4626f 59 },
60 ) or die SQL::Translator->error;
61
62 my $data;
63 if ( $q->param('schema') ) {
64 $data = $q->param('schema');
65 }
66 elsif ( my $fh = $q->upload('schema_file') ) {
67 local $/;
68 $data = <$fh>;
69 }
70
71 die "No schema provided!\n" unless $data;
72 $t->data( $data );
73 $t->producer( $q->param('do_graph') ? 'GraphViz' : 'Diagram' );
74 my $output = $t->translate or die $t->error;
75
76 my $image_type = $q->param('output_type') || 'png';
77 print $q->header( -type => "image/$image_type" ), $output;
78 }
79 else {
80 show_form( $q );
81 }
82};
83
84if ( my $error = $@ ) {
85 print $q->header, $q->start_html('Error'),
86 $q->h1('Error'), $error, $q->end_html;
87}
88
89# -------------------------------------------------------------------
90sub show_form {
91 my $q = shift;
92 my $title = 'SQL::Translator';
93
94 print $q->header,
95 $q->start_html( -title => $title ),
96 $q->h1( qq[<a href="http://sqlfairy.sourceforge.net">$title</a>] ),
97 $q->start_form(-enctype => 'multipart/form-data'),
98 $q->table( { -border => 1 },
99 $q->Tr(
100 $q->td( [
101 'Paste your schema here:',
102 $q->textarea(
103 -name => 'schema',
104 -rows => 10,
105 -columns => 60,
106 ),
107 ] ),
108 ),
109 $q->Tr(
110 $q->td( [
111 'Or upload your schema file:',
112 $q->filefield( -name => 'schema_file'),
113 ] ),
114 ),
115 $q->Tr(
116 $q->td( [
117 'Database:',
118 $q->radio_group(
119 -name => 'database',
120 -values => [ 'MySQL', 'PostgreSQL', 'Oracle' ],
121 -default => 'MySQL',
122 -rows => 3,
123 ),
124 ] ),
125 ),
126 $q->Tr(
127 $q->td( [
128 'Title:',
129 $q->textfield('title'),
130 ] ),
131 ),
132 $q->Tr(
133 $q->td( [
134 'Output Type:',
135 $q->radio_group(
136 -name => 'output_type',
137 -values => [ 'png', 'jpeg' ],
138 -default => 'png',
139 -rows => 2,
140 ),
141 ] ),
142 ),
143 $q->Tr(
144 $q->td( [
145 'Perform Natural Joins:',
146 $q->radio_group(
147 -name => 'natural_join',
148 -values => [ 'no', 'yes', 'pk_only' ],
149 -labels => {
150 no => 'No',
151 yes => 'Yes, on all like-named fields',
152 pk_only => 'Yes, but only from primary keys'
153 },
154 -default => 'no',
155 -rows => 3,
156 ),
157 ] ),
158 ),
159 $q->Tr(
160 $q->td( [
161 'Skip These Fields in Natural Joins:',
162 $q->textarea(
163 -name => 'skip_fields',
164 -rows => 3,
165 -columns => 60,
166 ),
167 ] ),
168 ),
169 $q->Tr(
170 $q->td( [
171 'Color:',
172 $q->radio_group(
173 -name => 'add_color',
174 -values => [ 1, 0 ],
175 -labels => {
176 1 => 'Yes',
177 0 => 'No'
178 },
179 -default => 1,
180 -rows => 2,
181 ),
182 ] ),
183 ),
184 $q->Tr(
185 $q->td( [
186 'Show Only Foreign Keys *:',
187 $q->radio_group(
188 -name => 'show_fk_only',
189 -values => [ 1, 0 ],
190 -default => 0,
191 -labels => {
192 1 => 'Yes',
193 0 => 'No',
194 },
195 -rows => 2,
196 ),
197 ] ),
198 ),
199 $q->Tr(
200 $q->td( [
201 'Font Size *:',
202 $q->radio_group(
203 -name => 'font_size',
204 -values => [ qw( small medium large ) ],
205 -default => 'medium',
206 -rows => 3,
207 ),
208 ] ),
209 ),
210 $q->Tr(
211 $q->td( [
212 'Number of Columns *:',
213 $q->textfield('no_columns'),
214 ] ),
215 ),
216 $q->Tr(
217 $q->td( [
218 'Layout **:',
219 $q->radio_group(
220 -name => 'layout',
221 -values => [ qw( dot neato twopi ) ],
222 -default => 'neato',
223 -rows => 3,
224 ),
225 ] ),
226 ),
227 $q->Tr(
228 $q->td( [
229 'Node Shape **:',
230 $q->radio_group(
231 -name => 'node_shape',
232 -values => [ qw( record plaintext ellipse
233 circle egg triangle box diamond trapezium
234 parallelogram house hexagon octagon
235 ) ],
be35c82f 236 -default => 'record',
69e4626f 237 -rows => 13,
238 ),
239 ] ),
240 ),
241 $q->Tr(
be35c82f 242 $q->td( [
243 'Show Field Names **:',
244 $q->radio_group(
245 -name => 'show_fields',
246 -values => [ 1, 0 ],
247 -default => 1,
248 -labels => {
249 1 => 'Yes',
250 0 => 'No',
251 },
252 -rows => 2,
253 ),
254 ] ),
255 ),
256 $q->Tr(
257 $q->td( [
258 'Height **:',
259 $q->textfield( -name => 'height', -default => 11 ),
260 ] ),
261 ),
262 $q->Tr(
263 $q->td( [
264 'Width **:',
265 $q->textfield( -name => 'width', -default => 8.5 ),
266 ] ),
267 ),
268 $q->Tr(
69e4626f 269 $q->td(
270 { -colspan => 2, -align => 'center' },
271 $q->submit(
272 -name => 'do_diagram',
273 -value => 'Create ER Diagram'
274 ),
275 $q->submit(
276 -name => 'do_graph',
277 -value => 'Create Graph'
278 ),
279 $q->br,
280 q[
281 <small>
282 * -- Applies to diagram only<br>
283 ** -- Applies to graph only<br>
284 </small>
285 ],
286 ),
287 ),
288 ),
289 $q->end_form,
290 $q->end_html;
291}
292
293=pod
294
295=head1 AUTHOR
296
297Ken Y. Clark E<lt>kclark@cpan.orgE<gt>
298
299=cut