1#!/usr/bin/env perl 2 3# ------------------------------------------------------------------- 4# Copyright (C) 2002-2009 SQLFairy Authors 5# 6# This program is free software; you can redistribute it and/or 7# modify it under the terms of the GNU General Public License as 8# published by the Free Software Foundation; version 2. 9# 10# This program is distributed in the hope that it will be useful, but 11# WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13# General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License 16# along with this program; if not, write to the Free Software 17# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18# 02110-1301 USA. 19# ------------------------------------------------------------------- 20 21=head1 NAME 22 23sqlt.cgi - CGI front-end for SQL::Translator 24 25=head1 DESCRIPTION 26 27Place this script in your "cgi-bin" directory and point your browser 28to it. This script is meant to be a simple graphical interface to 29all the parsers and producers of SQL::Translator. 30 31=cut 32 33# ------------------------------------------------------------------- 34 35use strict; 36use warnings; 37use CGI; 38use SQL::Translator; 39 40use vars '$VERSION'; 41$VERSION = '1.62'; 42 43my $q = CGI->new; 44 45eval { 46 if ( $q->param ) { 47 my $data; 48 if ( $q->param('schema') ) { 49 $data = $q->param('schema'); 50 } 51 elsif ( my $fh = $q->upload('schema_file') ) { 52 local $/; 53 $data = <$fh>; 54 } 55 die "No schema provided!\n" unless $data; 56 57 my $producer = $q->param('producer'); 58 my $output_type = $producer eq 'Diagram' 59 ? $q->param('diagram_output_type') 60 : $producer eq 'GraphViz' 61 ? $q->param('graphviz_output_type') 62 : '' 63 ; 64 65 my $t = SQL::Translator->new( 66 from => $q->param('parser'), 67 producer_args => { 68 add_drop_table => $q->param('add_drop_table'), 69 output_type => $output_type, 70 title => $q->param('title') || 'Schema', 71 natural_join => $q->param('natural_join') eq 'no' ? 0 : 1, 72 join_pk_only => $q->param('natural_join') eq 'pk_only' 73 ? 1 : 0, 74 add_color => $q->param('add_color'), 75 skip_fields => $q->param('skip_fields'), 76 show_fk_only => $q->param('show_fk_only'), 77 font_size => $q->param('font_size'), 78 no_columns => $q->param('no_columns'), 79 node_shape => $q->param('node_shape'), 80 layout => $q->param('layout') || '', 81 height => $q->param('height') || 0, 82 width => $q->param('width') || 0, 83 show_fields => $q->param('show_fields') || 0, 84 ttfile => $q->upload('template'), 85 validate => $q->param('validate'), 86 emit_empty_tags => $q->param('emit_empty_tags'), 87 attrib_values => $q->param('attrib_values'), 88 no_comments => !$q->param('comments'), 89 }, 90 parser_args => { 91 trim_fields => $q->param('trim_fields'), 92 scan_fields => $q->param('scan_fields'), 93 field_separator => $q->param('fs'), 94 record_separator => $q->param('rs'), 95 }, 96 ) or die SQL::Translator->error; 97 98 my $image_type = ''; 99 my $text_type = 'plain'; 100 if ( $output_type =~ /(gif|png|jpeg)/ ) { 101 $image_type = $output_type; 102 } 103 elsif ( $output_type eq 'svg' ) { 104 $image_type = 'svg+xml'; 105 } 106 elsif ( $output_type =~ /gd/ ) { 107 $image_type = 'png'; 108 } 109 elsif ( $output_type eq 'ps' ) { 110 $text_type = 'postscript'; 111 } 112 elsif ( $producer eq 'HTML' ) { 113 $text_type = 'html'; 114 } 115 116 my $header_type = $image_type ? "image/$image_type" : "text/$text_type"; 117 118 $t->data( $data ); 119 $t->producer( $producer ); 120 my $output = $t->translate or die $t->error; 121 122 print $q->header( -type => $header_type ), $output; 123 } 124 else { 125 show_form( $q ); 126 } 127}; 128 129if ( my $error = $@ ) { 130 print $q->header, $q->start_html('Error'), 131 $q->h1('Error'), $error, $q->end_html; 132} 133 134# ------------------------------------------------------------------- 135sub show_form { 136 my $q = shift; 137 my $title = 'SQL::Translator'; 138 139 print $q->header, 140 $q->start_html( -title => $title ), 141 $q->h1( qq[<a href="http://sqlfairy.sourceforge.net">$title</a>] ), 142 $q->start_form(-enctype => 'multipart/form-data'), 143 $q->table( { -border => 1 }, 144 $q->Tr( 145 $q->td( [ 146 'Upload your schema file:', 147 $q->filefield( -name => 'schema_file'), 148 ] ), 149 ), 150 $q->Tr( 151 $q->td( [ 152 'Or paste your schema here:', 153 $q->textarea( 154 -name => 'schema', 155 -rows => 5, 156 -columns => 60, 157 ), 158 ] ), 159 ), 160 $q->Tr( 161 $q->td( [ 162 'Parser:', 163 $q->radio_group( 164 -name => 'parser', 165 -values => [ qw( MySQL PostgreSQL Oracle 166 Sybase Excel XML-SQLFairy xSV 167 ) ], 168 -default => 'MySQL', 169 -rows => 3, 170 ), 171 ] ), 172 ), 173 $q->Tr( 174 $q->td( [ 175 'Producer:', 176 $q->radio_group( 177 -name => 'producer', 178 -values => [ qw[ ClassDBI Diagram GraphViz HTML 179 MySQL Oracle POD PostgreSQL SQLite Sybase 180 TTSchema XML-SQLFairy 181 ] ], 182 -default => 'GraphViz', 183 -rows => 3, 184 ), 185 ] ), 186 ), 187 $q->Tr( 188 $q->td( 189 { -colspan => 2, -align => 'center' }, 190 $q->submit( 191 -name => 'submit', 192 -value => 'Submit', 193 ) 194 ), 195 ), 196 $q->Tr( 197 $q->th( 198 { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 199 'General Options:' 200 ), 201 ), 202 $q->Tr( 203 $q->td( [ 204 'Validate Schema:', 205 $q->radio_group( 206 -name => 'validate', 207 -values => [ 1, 0 ], 208 -labels => { 209 1 => 'Yes', 210 0 => 'No' 211 }, 212 -default => 0, 213 -rows => 2, 214 ), 215 ] ), 216 ), 217 $q->Tr( 218 $q->th( 219 { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 220 'DB Producer Options:' 221 ), 222 ), 223 $q->Tr( 224 $q->td( [ 225 'Add "DROP TABLE" statements:', 226 $q->radio_group( 227 -name => 'add_drop_table', 228 -values => [ 1, 0 ], 229 -labels => { 230 1 => 'Yes', 231 0 => 'No' 232 }, 233 -default => 0, 234 -rows => 2, 235 ), 236 ] ), 237 ), 238 $q->Tr( 239 $q->td( [ 240 'Include comments:', 241 $q->radio_group( 242 -name => 'comments', 243 -values => [ 1, 0 ], 244 -labels => { 245 1 => 'Yes', 246 0 => 'No' 247 }, 248 -default => 1, 249 -rows => 2, 250 ), 251 ] ), 252 ), 253 $q->Tr( 254 $q->th( 255 { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 256 'HTML/POD/Diagram Producer Options:' 257 ), 258 ), 259 $q->Tr( 260 $q->td( [ 261 'Title:', 262 $q->textfield('title'), 263 ] ), 264 ), 265 $q->Tr( 266 $q->th( 267 { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 268 'TTSchema Producer Options:' 269 ), 270 ), 271 $q->Tr( 272 $q->td( [ 273 'Template:', 274 $q->filefield( -name => 'template'), 275 ] ), 276 ), 277 $q->Tr( 278 $q->th( 279 { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 280 'Graphical Producer Options' 281 ), 282 ), 283 $q->Tr( 284 $q->td( [ 285 'Perform Natural Joins:', 286 $q->radio_group( 287 -name => 'natural_join', 288 -values => [ 'no', 'yes', 'pk_only' ], 289 -labels => { 290 no => 'No', 291 yes => 'Yes, on all like-named fields', 292 pk_only => 'Yes, but only from primary keys' 293 }, 294 -default => 'no', 295 -rows => 3, 296 ), 297 ] ), 298 ), 299 $q->Tr( 300 $q->td( [ 301 'Skip These Fields in Natural Joins:', 302 $q->textarea( 303 -name => 'skip_fields', 304 -rows => 3, 305 -columns => 60, 306 ), 307 ] ), 308 ), 309 $q->Tr( 310 $q->td( [ 311 'Show Only Foreign Keys:', 312 $q->radio_group( 313 -name => 'show_fk_only', 314 -values => [ 1, 0 ], 315 -default => 0, 316 -labels => { 317 1 => 'Yes', 318 0 => 'No', 319 }, 320 -rows => 2, 321 ), 322 ] ), 323 ), 324 $q->Tr( 325 $q->td( [ 326 'Add Color:', 327 $q->radio_group( 328 -name => 'add_color', 329 -values => [ 1, 0 ], 330 -labels => { 331 1 => 'Yes', 332 0 => 'No' 333 }, 334 -default => 1, 335 -rows => 2, 336 ), 337 ] ), 338 ), 339 $q->Tr( 340 $q->td( [ 341 'Show Field Names:', 342 $q->radio_group( 343 -name => 'show_fields', 344 -values => [ 1, 0 ], 345 -default => 1, 346 -labels => { 347 1 => 'Yes', 348 0 => 'No', 349 }, 350 -rows => 2, 351 ), 352 ] ), 353 ), 354 $q->Tr( 355 $q->th( 356 { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 357 'Diagram Producer Options' 358 ), 359 ), 360 $q->Tr( 361 $q->td( [ 362 'Output Type:', 363 $q->radio_group( 364 -name => 'diagram_output_type', 365 -values => [ 'png', 'jpeg' ], 366 -default => 'png', 367 -rows => 2, 368 ), 369 ] ), 370 ), 371 $q->Tr( 372 $q->td( [ 373 'Font Size:', 374 $q->radio_group( 375 -name => 'font_size', 376 -values => [ qw( small medium large ) ], 377 -default => 'medium', 378 -rows => 3, 379 ), 380 ] ), 381 ), 382 $q->Tr( 383 $q->td( [ 384 'Number of Columns:', 385 $q->textfield('no_columns'), 386 ] ), 387 ), 388 $q->Tr( 389 $q->th( 390 { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 391 'GraphViz Producer Options' 392 ), 393 ), 394 $q->Tr( 395 $q->td( [ 396 'Output Type:', 397 $q->radio_group( 398 -name => 'graphviz_output_type', 399 -values => [ qw( canon text ps hpgl pcl mif pic 400 gd gd2 gif jpeg png wbmp cmap ismap imap 401 vrml vtx mp fig svg plain 402 ) ], 403 -default => 'png', 404 -rows => 4, 405 ), 406 ] ), 407 ), 408 $q->Tr( 409 $q->td( [ 410 'Layout:', 411 $q->radio_group( 412 -name => 'layout', 413 -values => [ qw( dot neato twopi ) ], 414 -default => 'dot', 415 -rows => 3, 416 ), 417 ] ), 418 ), 419 $q->Tr( 420 $q->td( [ 421 'Node Shape:', 422 $q->radio_group( 423 -name => 'node_shape', 424 -values => [ qw( record plaintext ellipse 425 circle egg triangle box diamond trapezium 426 parallelogram house hexagon octagon 427 ) ], 428 -default => 'record', 429 -rows => 4, 430 ), 431 ] ), 432 ), 433 $q->Tr( 434 $q->td( [ 435 'Height:', 436 $q->textfield( -name => 'height' ), 437 ] ), 438 ), 439 $q->Tr( 440 $q->td( [ 441 'Width:', 442 $q->textfield( -name => 'width' ), 443 ] ), 444 ), 445 $q->Tr( 446 $q->th( 447 { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 448 'XML Producer Options:' 449 ), 450 ), 451 $q->Tr( 452 $q->td( [ 453 'Use attributes for values:', 454 $q->radio_group( 455 -name => 'attrib-values', 456 -values => [ 1, 0 ], 457 -labels => { 458 1 => 'Yes', 459 0 => 'No' 460 }, 461 -default => 0, 462 -rows => 2, 463 ), 464 ] ), 465 ), 466 $q->Tr( 467 $q->td( [ 468 'Emit Empty Tags:', 469 $q->radio_group( 470 -name => 'emit-empty-tags', 471 -values => [ 1, 0 ], 472 -labels => { 473 1 => 'Yes', 474 0 => 'No' 475 }, 476 -default => 0, 477 -rows => 2, 478 ), 479 ] ), 480 ), 481 $q->Tr( 482 $q->th( 483 { align => 'left', bgcolor => 'lightgrey', colspan => 2 }, 484 'xSV Parser Options' 485 ), 486 ), 487 $q->Tr( 488 $q->td( [ 489 'Field Separator:', 490 $q->textfield( -name => 'fs' ), 491 ] ), 492 ), 493 $q->Tr( 494 $q->td( [ 495 'Record Separator:', 496 $q->textfield( -name => 'rs' ), 497 ] ), 498 ), 499 $q->Tr( 500 $q->td( [ 501 'Trim Whitespace Around Fields:', 502 $q->radio_group( 503 -name => 'trim_fields', 504 -values => [ 1, 0 ], 505 -default => 1, 506 -labels => { 507 1 => 'Yes', 508 0 => 'No', 509 }, 510 -rows => 2, 511 ), 512 ] ), 513 ), 514 $q->Tr( 515 $q->td( [ 516 'Scan Fields for Data Type:', 517 $q->radio_group( 518 -name => 'scan_fields', 519 -values => [ 1, 0 ], 520 -default => 1, 521 -labels => { 522 1 => 'Yes', 523 0 => 'No', 524 }, 525 -rows => 2, 526 ), 527 ] ), 528 ), 529 $q->Tr( 530 $q->td( 531 { -colspan => 2, -align => 'center' }, 532 $q->submit( 533 -name => 'submit', 534 -value => 'Submit', 535 ) 536 ), 537 ), 538 ), 539 $q->end_form, 540 $q->end_html; 541} 542 543# ------------------------------------------------------------------- 544 545=pod 546 547=head1 AUTHOR 548 549Ken Youens-Clark E<lt>kclark@cpan.orgE<gt>. 550 551=head1 SEE ALSO 552 553L<perl>, 554L<SQL::Translator> 555 556=cut 557