From: Ken Youens-Clark Date: Thu, 28 Nov 2002 04:21:07 +0000 (+0000) Subject: Added a rule to MySQL parser to disregard "DROP...;" statements, filled out X-Git-Tag: v0.01~36 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=61745327179965ba143356ac46c3e0ce37cc60a8;p=dbsrgits%2FSQL-Translator.git Added a rule to MySQL parser to disregard "DROP...;" statements, filled out XML producer to generate hand-crafted XML. --- diff --git a/lib/SQL/Translator/Parser/MySQL.pm b/lib/SQL/Translator/Parser/MySQL.pm index 7a32793..ece96e5 100644 --- a/lib/SQL/Translator/Parser/MySQL.pm +++ b/lib/SQL/Translator/Parser/MySQL.pm @@ -1,7 +1,7 @@ package SQL::Translator::Parser::MySQL; # ------------------------------------------------------------------- -# $Id: MySQL.pm,v 1.7 2002-11-23 01:26:56 kycl4rk Exp $ +# $Id: MySQL.pm,v 1.8 2002-11-28 04:21:06 kycl4rk Exp $ # ------------------------------------------------------------------- # Copyright (C) 2002 Ken Y. Clark , # darren chamberlain @@ -41,7 +41,7 @@ The grammar is influenced heavily by Tim Bunce's "mysql2ora" grammar. use strict; use vars qw[ $DEBUG $VERSION $GRAMMAR @EXPORT_OK ]; -$VERSION = sprintf "%d.%02d", q$Revision: 1.7 $ =~ /(\d+)\.(\d+)/; +$VERSION = sprintf "%d.%02d", q$Revision: 1.8 $ =~ /(\d+)\.(\d+)/; $DEBUG = 1 unless defined $DEBUG; use Data::Dumper; @@ -66,16 +66,19 @@ $GRAMMAR = q! startrule : statement(s) { \%tables } statement : comment + | drop | create | +drop : /drop/i WORD(s) ';' + create : create_table table_name '(' create_definition(s /,/) ')' table_option(s?) ';' { my $table_name = $item{'table_name'}; $tables{ $table_name }{'order'} = ++$table_order; $tables{ $table_name }{'table_name'} = $table_name; - my $i = 0; + my $i = 1; for my $definition ( @{ $item[4] } ) { if ( $definition->{'type'} eq 'field' ) { my $field_name = $definition->{'name'}; diff --git a/lib/SQL/Translator/Producer/XML.pm b/lib/SQL/Translator/Producer/XML.pm index 07767e9..66b3e88 100644 --- a/lib/SQL/Translator/Producer/XML.pm +++ b/lib/SQL/Translator/Producer/XML.pm @@ -1,7 +1,7 @@ package SQL::Translator::Producer::XML; # ------------------------------------------------------------------- -# $Id: XML.pm,v 1.3 2002-11-22 03:03:40 kycl4rk Exp $ +# $Id: XML.pm,v 1.4 2002-11-28 04:21:07 kycl4rk Exp $ # ------------------------------------------------------------------- # Copyright (C) 2002 Ken Y. Clark , # darren chamberlain @@ -36,15 +36,85 @@ Meant to create some sort of usable XML output. =cut use strict; -use vars qw( $VERSION ); -$VERSION = sprintf "%d.%02d", q$Revision: 1.3 $ =~ /(\d+)\.(\d+)/; - -use XML::Dumper; +use vars qw[ $VERSION $XML ]; +$VERSION = sprintf "%d.%02d", q$Revision: 1.4 $ =~ /(\d+)\.(\d+)/; +# ------------------------------------------------------------------- sub produce { - my ( $self, $data ) = @_; - my $dumper = XML::Dumper->new; - return $dumper->pl2xml( $data ); + my ( $translator, $data ) = @_; + my $indent = 0; + aggregate( '', $indent ); + + $indent++; + for my $table ( + map { $_->[1] } + sort { $a->[0] <=> $b->[0] } + map { [ $_->{'order'}, $_ ] } + values %$data + ) { + aggregate( '', $indent ); + $indent++; + + aggregate( "$table->{'table_name'}", $indent ); + aggregate( "$table->{'order'}", $indent ); + + # + # Fields + # + aggregate( '', $indent ); + for my $field ( + map { $_->[1] } + sort { $a->[0] <=> $b->[0] } + map { [ $_->{'order'}, $_ ] } + values %{ $table->{'fields'} } + ) { + aggregate( '', ++$indent ); + $indent++; + + for my $key ( keys %$field ) { + my $val = defined $field->{ $key } ? $field->{ $key } : ''; + $val = ref $val eq 'ARRAY' ? join(',', @$val) : $val; + aggregate( "<$key>$val", $indent ); + } + + $indent--; + aggregate( "", $indent-- ); + } + aggregate( "", $indent ); + + # + # Indices + # + aggregate( '', $indent ); + for my $index ( @{ $table->{'indices'} } ) { + aggregate( '', ++$indent ); + $indent++; + + for my $key ( keys %$index ) { + my $val = defined $index->{ $key } ? $index->{ $key } : ''; + $val = ref $val eq 'ARRAY' ? join(',', @$val) : $val; + aggregate( "<$key>$val", $indent ); + } + + $indent--; + aggregate( "", $indent-- ); + } + aggregate( "", $indent ); + + $indent--; + aggregate( "
", $indent ); + } + + $indent--; + aggregate( '
', $indent ); + + return $XML; +} + +# ------------------------------------------------------------------- +sub aggregate { + my ( $text, $indent ) = @_; + $XML .= (' ' x $indent) . "$text\n"; } 1;