File Coverage

blib/lib/SQL/Translator/Parser/YAML.pm
Criterion Covered Total %
statement 67 78 85.9
branch 18 28 64.2
condition 2 2 100.0
subroutine 7 7 100.0
pod 0 1 0.0
total 94 116 81.0


line stmt bran cond sub pod time code
1             package SQL::Translator::Parser::YAML;
2              
3 17     17   128 use strict;
  17         45  
  17         716  
4 17     17   96 use warnings;
  17         38  
  17         1476  
5             our $VERSION = '1.66';
6              
7 17     17   861 use SQL::Translator::Schema;
  17         41  
  17         708  
8 17     17   350 use SQL::Translator::Utils qw(header_comment);
  17         242  
  17         1539  
9 17     17   115 use Data::Dumper;
  17         34  
  17         1176  
10 17     17   7097 use YAML qw(Load);
  17         122916  
  17         17968  
11              
12             sub parse {
13 25     25 0 92 my ($translator, $data) = @_;
14 25         151 $data = Load($data);
15 25         2506445 $data = $data->{'schema'};
16              
17 25 50       381 warn "YAML data:", Dumper($data) if $translator->debug;
18              
19 25         1015 my $schema = $translator->schema;
20              
21             #
22             # Tables
23             #
24 64         231 my @tables = map { $data->{'tables'}{ $_->[1] } }
25 61         186 sort { $a->[0] <=> $b->[0] }
26 64   100     414 map { [ $data->{'tables'}{$_}{'order'} || 0, $_ ] }
27 25         2056 keys %{ $data->{'tables'} };
  25         164  
28              
29 25         112 for my $tdata (@tables) {
30              
31 64 100       188 my $table = $schema->add_table(map { $tdata->{$_} ? ($_ => $tdata->{$_}) : () } (qw/name extra options/))
  192 50       1118  
32             or die $schema->error;
33              
34 200         513 my @fields = map { $tdata->{'fields'}{ $_->[1] } }
35 266         528 sort { $a->[0] <=> $b->[0] }
36 200         864 map { [ $tdata->{'fields'}{$_}{'order'}, $_ ] }
37 64         1415 keys %{ $tdata->{'fields'} };
  64         391  
38              
39 64         325 for my $fdata (@fields) {
40 200 50       1327 $table->add_field(%$fdata) or die $table->error;
41             $table->primary_key($fdata->{'name'})
42 200 100       5388 if $fdata->{'is_primary_key'};
43             }
44              
45 64 100       133 for my $idata (@{ $tdata->{'indices'} || [] }) {
  64         439  
46 21 50       151 $table->add_index(%$idata) or die $table->error;
47             }
48              
49 64 100       135 for my $cdata (@{ $tdata->{'constraints'} || [] }) {
  64         313  
50 84 50       539 $table->add_constraint(%$cdata) or die $table->error;
51             }
52              
53             $table->comments($tdata->{'comments'})
54 64 50       386 if exists $tdata->{'comments'};
55             }
56              
57             #
58             # Views
59             #
60 3         14 my @views = map { $data->{'views'}{ $_->[1] } }
61 0         0 sort { $a->[0] <=> $b->[0] }
62 3         19 map { [ $data->{'views'}{$_}{'order'}, $_ ] }
63 25         66 keys %{ $data->{'views'} };
  25         159  
64              
65 25         75 for my $vdata (@views) {
66 3 50       25 $schema->add_view(%$vdata) or die $schema->error;
67             }
68              
69             #
70             # Triggers
71             #
72 9         23 my @triggers = map { $data->{'triggers'}{ $_->[1] } }
73 8         26 sort { $a->[0] <=> $b->[0] }
74 9         47 map { [ $data->{'triggers'}{$_}{'order'}, $_ ] }
75 25         63 keys %{ $data->{'triggers'} };
  25         109  
76              
77 25         105 for my $tdata (@triggers) {
78 9 50       53 $schema->add_trigger(%$tdata) or die $schema->error;
79             }
80              
81             #
82             # Procedures
83             #
84 3         16 my @procedures = map { $data->{'procedures'}{ $_->[1] } }
85 0         0 sort { $a->[0] <=> $b->[0] }
86 3         21 map { [ $data->{'procedures'}{$_}{'order'}, $_ ] }
87 25         81 keys %{ $data->{'procedures'} };
  25         253  
88              
89 25         83 for my $tdata (@procedures) {
90 3 50       25 $schema->add_procedure(%$tdata) or die $schema->error;
91             }
92              
93 25 50       123 if (my $tr_data = $data->{'translator'}) {
94 0         0 $translator->add_drop_table($tr_data->{'add_drop_table'});
95 0         0 $translator->filename($tr_data->{'filename'});
96 0         0 $translator->no_comments($tr_data->{'no_comments'});
97 0         0 $translator->parser_args($tr_data->{'parser_args'});
98 0         0 $translator->producer_args($tr_data->{'producer_args'});
99 0         0 $translator->parser_type($tr_data->{'parser_type'});
100 0         0 $translator->producer_type($tr_data->{'producer_type'});
101 0         0 $translator->show_warnings($tr_data->{'show_warnings'});
102 0         0 $translator->trace($tr_data->{'trace'});
103             }
104              
105 25         1321 return 1;
106             }
107              
108             1;
109              
110             __END__