Bumping version to 1.62
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Parser / YAML.pm
CommitLineData
d3fad399 1package SQL::Translator::Parser::YAML;
2
d3fad399 3use strict;
f27f9229 4use warnings;
f769b7e8 5our $VERSION = '1.62';
d3fad399 6
7use SQL::Translator::Schema;
8use SQL::Translator::Utils qw(header_comment);
6785b14e 9use Data::Dumper;
10use YAML qw(Load);
d3fad399 11
12sub parse {
13 my ($translator, $data) = @_;
6785b14e 14 $data = Load($data);
15 $data = $data->{'schema'};
16
f9aa1ac9 17 warn "YAML data:",Dumper( $data ) if $translator->debug;
6785b14e 18
d3fad399 19 my $schema = $translator->schema;
d3fad399 20
6785b14e 21 #
22 # Tables
23 #
ea93df61 24 my @tables =
6785b14e 25 map { $data->{'tables'}{ $_->[1] } }
26 sort { $a->[0] <=> $b->[0] }
7cc97e4f 27 map { [ $data->{'tables'}{ $_ }{'order'} || 0, $_ ] }
6785b14e 28 keys %{ $data->{'tables'} }
29 ;
30
31 for my $tdata ( @tables ) {
ea93df61 32
6785b14e 33 my $table = $schema->add_table(
4d438549 34 map {
35 $tdata->{$_} ? ($_ => $tdata->{$_}) : ()
36 } (qw/name extra options/)
6785b14e 37 ) or die $schema->error;
38
ea93df61 39 my @fields =
6785b14e 40 map { $tdata->{'fields'}{ $_->[1] } }
41 sort { $a->[0] <=> $b->[0] }
42 map { [ $tdata->{'fields'}{ $_ }{'order'}, $_ ] }
43 keys %{ $tdata->{'fields'} }
44 ;
45
46 for my $fdata ( @fields ) {
47 $table->add_field( %$fdata ) or die $table->error;
ea93df61 48 $table->primary_key( $fdata->{'name'} )
46a06350 49 if $fdata->{'is_primary_key'};
6785b14e 50 }
623a0a9e 51
52 for my $idata ( @{ $tdata->{'indices'} || [] } ) {
53 $table->add_index( %$idata ) or die $table->error;
54 }
55
56 for my $cdata ( @{ $tdata->{'constraints'} || [] } ) {
57 $table->add_constraint( %$cdata ) or die $table->error;
58 }
6785b14e 59 }
60
61 #
62 # Views
63 #
ea93df61 64 my @views =
6785b14e 65 map { $data->{'views'}{ $_->[1] } }
66 sort { $a->[0] <=> $b->[0] }
67 map { [ $data->{'views'}{ $_ }{'order'}, $_ ] }
68 keys %{ $data->{'views'} }
69 ;
70
71 for my $vdata ( @views ) {
72 $schema->add_view( %$vdata ) or die $schema->error;
73 }
74
75 #
76 # Triggers
77 #
ea93df61 78 my @triggers =
6785b14e 79 map { $data->{'triggers'}{ $_->[1] } }
80 sort { $a->[0] <=> $b->[0] }
81 map { [ $data->{'triggers'}{ $_ }{'order'}, $_ ] }
82 keys %{ $data->{'triggers'} }
83 ;
84
85 for my $tdata ( @triggers ) {
86 $schema->add_trigger( %$tdata ) or die $schema->error;
87 }
88
89 #
90 # Procedures
91 #
ea93df61 92 my @procedures =
6785b14e 93 map { $data->{'procedures'}{ $_->[1] } }
94 sort { $a->[0] <=> $b->[0] }
95 map { [ $data->{'procedures'}{ $_ }{'order'}, $_ ] }
96 keys %{ $data->{'procedures'} }
97 ;
98
99 for my $tdata ( @procedures ) {
100 $schema->add_procedure( %$tdata ) or die $schema->error;
101 }
102
01fe35e0 103 if ( my $tr_data = $data->{'translator'} ) {
104 $translator->add_drop_table( $tr_data->{'add_drop_table'} );
105 $translator->filename( $tr_data->{'filename'} );
106 $translator->no_comments( $tr_data->{'no_comments'} );
107 $translator->parser_args( $tr_data->{'parser_args'} );
108 $translator->producer_args( $tr_data->{'producer_args'} );
109 $translator->parser_type( $tr_data->{'parser_type'} );
110 $translator->producer_type( $tr_data->{'producer_type'} );
111 $translator->show_warnings( $tr_data->{'show_warnings'} );
112 $translator->trace( $tr_data->{'trace'} );
113 }
114
6785b14e 115 return 1;
d3fad399 116}
117
1181;
119
120__END__
121
122=head1 NAME
123
124SQL::Translator::Parser::YAML - Parse a YAML representation of a schema
125
126=head1 SYNOPSIS
127
128 use SQL::Translator;
129
130 my $translator = SQL::Translator->new(parser => "YAML");
131
132=head1 DESCRIPTION
133
134C<SQL::Translator::Parser::YAML> parses a schema serialized with YAML.
135
90075866 136=head1 AUTHORS
d3fad399 137
6785b14e 138Darren Chamberlain E<lt>darren@cpan.orgE<gt>,
11ad2df9 139Ken Y. Clark E<lt>kclark@cpan.orgE<gt>.