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>
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;
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'};
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>
=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;