X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FParser%2FYAML.pm;h=e1daebf4f9fbaf279b7881d571b9229b17dba5d5;hb=b03926cdac036bdbcf69e478ca29e1121c814646;hp=fe996cb00beeee60a4bb33f45407f0a112948069;hpb=d3fad3998a3f824c3eb36b14d373bc71c9c4b3d1;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Parser/YAML.pm b/lib/SQL/Translator/Parser/YAML.pm index fe996cb..e1daebf 100644 --- a/lib/SQL/Translator/Parser/YAML.pm +++ b/lib/SQL/Translator/Parser/YAML.pm @@ -1,9 +1,7 @@ package SQL::Translator::Parser::YAML; # ------------------------------------------------------------------- -# $Id: YAML.pm,v 1.1 2003-10-08 16:33:13 dlc Exp $ -# ------------------------------------------------------------------- -# Copyright (C) 2003 darren chamberlain , +# Copyright (C) 2002-2009 SQLFairy Authors # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -22,17 +20,117 @@ package SQL::Translator::Parser::YAML; use strict; use vars qw($VERSION); -$VERSION = sprintf "%d.%02d", q$Revision: 1.1 $ =~ /(\d+)\.(\d+)/; +$VERSION = '1.99'; use SQL::Translator::Schema; use SQL::Translator::Utils qw(header_comment); -use YAML; +use Data::Dumper; +use YAML qw(Load); sub parse { my ($translator, $data) = @_; + $data = Load($data); + $data = $data->{'schema'}; + + warn "YAML data:",Dumper( $data ) if $translator->debug; + my $schema = $translator->schema; - my $data = Load($data); + # + # Tables + # + my @tables = + map { $data->{'tables'}{ $_->[1] } } + sort { $a->[0] <=> $b->[0] } + map { [ $data->{'tables'}{ $_ }{'order'} || 0, $_ ] } + keys %{ $data->{'tables'} } + ; + + for my $tdata ( @tables ) { + + my $table = $schema->add_table( + map { + $tdata->{$_} ? ($_ => $tdata->{$_}) : () + } (qw/name extra options/) + ) or die $schema->error; + + my @fields = + map { $tdata->{'fields'}{ $_->[1] } } + sort { $a->[0] <=> $b->[0] } + map { [ $tdata->{'fields'}{ $_ }{'order'}, $_ ] } + keys %{ $tdata->{'fields'} } + ; + + for my $fdata ( @fields ) { + $table->add_field( %$fdata ) or die $table->error; + $table->primary_key( $fdata->{'name'} ) + if $fdata->{'is_primary_key'}; + } + + for my $idata ( @{ $tdata->{'indices'} || [] } ) { + $table->add_index( %$idata ) or die $table->error; + } + + for my $cdata ( @{ $tdata->{'constraints'} || [] } ) { + $table->add_constraint( %$cdata ) or die $table->error; + } + } + + # + # Views + # + my @views = + map { $data->{'views'}{ $_->[1] } } + sort { $a->[0] <=> $b->[0] } + map { [ $data->{'views'}{ $_ }{'order'}, $_ ] } + keys %{ $data->{'views'} } + ; + + for my $vdata ( @views ) { + $schema->add_view( %$vdata ) or die $schema->error; + } + + # + # Triggers + # + my @triggers = + map { $data->{'triggers'}{ $_->[1] } } + sort { $a->[0] <=> $b->[0] } + map { [ $data->{'triggers'}{ $_ }{'order'}, $_ ] } + keys %{ $data->{'triggers'} } + ; + + for my $tdata ( @triggers ) { + $schema->add_trigger( %$tdata ) or die $schema->error; + } + + # + # Procedures + # + my @procedures = + map { $data->{'procedures'}{ $_->[1] } } + sort { $a->[0] <=> $b->[0] } + map { [ $data->{'procedures'}{ $_ }{'order'}, $_ ] } + keys %{ $data->{'procedures'} } + ; + + for my $tdata ( @procedures ) { + $schema->add_procedure( %$tdata ) or die $schema->error; + } + + if ( my $tr_data = $data->{'translator'} ) { + $translator->add_drop_table( $tr_data->{'add_drop_table'} ); + $translator->filename( $tr_data->{'filename'} ); + $translator->no_comments( $tr_data->{'no_comments'} ); + $translator->parser_args( $tr_data->{'parser_args'} ); + $translator->producer_args( $tr_data->{'producer_args'} ); + $translator->parser_type( $tr_data->{'parser_type'} ); + $translator->producer_type( $tr_data->{'producer_type'} ); + $translator->show_warnings( $tr_data->{'show_warnings'} ); + $translator->trace( $tr_data->{'trace'} ); + } + + return 1; } 1; @@ -53,6 +151,7 @@ SQL::Translator::Parser::YAML - Parse a YAML representation of a schema C parses a schema serialized with YAML. -=head1 AUTHOR +=head1 AUTHORS -Darren Chamberlain Edarren@cpan.orgE +Darren Chamberlain Edarren@cpan.orgE, +Ken Y. Clark Ekclark@cpan.orgE.