Added a rule to MySQL parser to disregard "DROP...;" statements, filled out
Ken Youens-Clark [Thu, 28 Nov 2002 04:21:07 +0000 (04:21 +0000)]
XML producer to generate hand-crafted XML.

lib/SQL/Translator/Parser/MySQL.pm
lib/SQL/Translator/Producer/XML.pm

index 7a32793..ece96e5 100644 (file)
@@ -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 <kclark@cpan.org>,
 #                    darren chamberlain <darren@cpan.org>
@@ -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
     | <error>
 
+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'};
index 07767e9..66b3e88 100644 (file)
@@ -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 <kclark@cpan.org>,
 #                    darren chamberlain <darren@cpan.org>
@@ -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( '<schema>', $indent );
+    
+    $indent++;
+    for my $table ( 
+        map  { $_->[1] }
+        sort { $a->[0] <=> $b->[0] }
+        map  { [ $_->{'order'}, $_ ] }
+        values %$data
+    ) { 
+        aggregate( '<table>', $indent );
+        $indent++;
+
+        aggregate( "<name>$table->{'table_name'}</name>", $indent );
+        aggregate( "<order>$table->{'order'}</order>", $indent );
+
+        #
+        # Fields
+        #
+        aggregate( '<fields>', $indent );
+        for my $field ( 
+            map  { $_->[1] }
+            sort { $a->[0] <=> $b->[0] }
+            map  { [ $_->{'order'}, $_ ] }
+            values %{ $table->{'fields'} }
+        ) {
+            aggregate( '<field>', ++$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</$key>", $indent );
+            }
+
+            $indent--;
+            aggregate( "</field>", $indent-- );
+        }
+        aggregate( "</fields>", $indent );
+
+        #
+        # Indices
+        #
+        aggregate( '<indices>', $indent );
+        for my $index ( @{ $table->{'indices'} } ) {
+            aggregate( '<index>', ++$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</$key>", $indent );
+            }
+
+            $indent--;
+            aggregate( "</index>", $indent-- );
+        }
+        aggregate( "</indices>", $indent );
+
+        $indent--;
+        aggregate( "</table>", $indent );
+    }
+
+    $indent--;
+    aggregate( '</schema>', $indent );
+
+    return $XML;
+}
+
+# -------------------------------------------------------------------
+sub aggregate {
+    my ( $text, $indent ) = @_;
+    $XML .= ('  ' x $indent) . "$text\n";
 }
 
 1;