Commit | Line | Data |
cac60624 |
1 | use MooseX::Declare; |
2 | role SQL::Translator::Parser::DDL::YAML { |
7a8a2a90 |
3 | use MooseX::Types::Moose qw(Str); |
cac60624 |
4 | use SQL::Translator::Types qw(Schema); |
5 | use aliased 'SQL::Translator::Object::Column'; |
6 | use aliased 'SQL::Translator::Object::Constraint'; |
7 | use aliased 'SQL::Translator::Object::Index'; |
7a8a2a90 |
8 | use aliased 'SQL::Translator::Object::Procedure'; |
cac60624 |
9 | use aliased 'SQL::Translator::Object::Table'; |
7a8a2a90 |
10 | use aliased 'SQL::Translator::Object::Trigger'; |
11 | use aliased 'SQL::Translator::Object::View'; |
cac60624 |
12 | use YAML qw(Load); |
13 | use MooseX::MultiMethods; |
14 | |
cac60624 |
15 | multi method parse(Schema $data) { return $data } |
16 | |
17 | multi method parse(Str $data) { |
cac60624 |
18 | $data = Load($data); |
19 | $data = $data->{schema}; |
20 | |
7a8a2a90 |
21 | my $schema = $self->schema; |
22 | my $translator = $self->translator; |
cac60624 |
23 | |
24 | # |
25 | # Tables |
26 | # |
27 | my @tables = |
28 | map { $data->{'tables'}{ $_->[1] } } |
cac60624 |
29 | map { [ $data->{'tables'}{ $_ }{'order'} || 0, $_ ] } |
7a8a2a90 |
30 | keys %{ $data->{'tables'} }; |
cac60624 |
31 | |
32 | for my $tdata ( @tables ) { |
33 | my $table = Table->new({ map { $tdata->{$_} ? ($_ => $tdata->{$_}) : () } qw/name extra options/ }); |
34 | $schema->add_table($table); |
cac60624 |
35 | |
36 | my @fields = |
37 | map { $tdata->{'fields'}{ $_->[1] } } |
cac60624 |
38 | map { [ $tdata->{'fields'}{ $_ }{'order'}, $_ ] } |
7a8a2a90 |
39 | keys %{ $tdata->{'fields'} }; |
cac60624 |
40 | |
41 | for my $fdata ( @fields ) { |
cac60624 |
42 | $fdata->{sql_data_type} = $self->data_type_mapping->{$fdata->{data_type}} || -99999; |
7a8a2a90 |
43 | |
cac60624 |
44 | my $column = Column->new($fdata); |
45 | $table->add_column($column); |
46 | $table->primary_key($column->name) if $fdata->{is_primary_key}; |
47 | } |
48 | |
49 | for my $idata ( @{ $tdata->{'indices'} || [] } ) { |
cac60624 |
50 | my $index = Index->new($idata); |
51 | $table->add_index($index); |
52 | } |
53 | |
54 | for my $cdata ( @{ $tdata->{'constraints'} || [] } ) { |
cac60624 |
55 | my $constraint = Constraint->new($cdata); |
56 | $table->add_constraint($constraint); |
57 | } |
58 | } |
59 | |
60 | # |
61 | # Views |
62 | # |
63 | my @views = |
64 | map { $data->{'views'}{ $_->[1] } } |
cac60624 |
65 | map { [ $data->{'views'}{ $_ }{'order'}, $_ ] } |
7a8a2a90 |
66 | keys %{ $data->{'views'} }; |
cac60624 |
67 | |
68 | for my $vdata ( @views ) { |
7a8a2a90 |
69 | my $view = View->new($vdata); |
70 | $schema->add_view($view); |
cac60624 |
71 | } |
72 | |
73 | # |
74 | # Triggers |
75 | # |
76 | my @triggers = |
77 | map { $data->{'triggers'}{ $_->[1] } } |
cac60624 |
78 | map { [ $data->{'triggers'}{ $_ }{'order'}, $_ ] } |
7a8a2a90 |
79 | keys %{ $data->{'triggers'} }; |
cac60624 |
80 | |
81 | for my $tdata ( @triggers ) { |
7a8a2a90 |
82 | my @columns = delete $tdata->{fields} || (); |
83 | my $trigger = Trigger->new($tdata); |
84 | $trigger->add_column($schema->get_table($tdata->{on_table})->get_column($_)) for @columns; |
85 | $schema->add_trigger($trigger); |
cac60624 |
86 | } |
87 | |
88 | # |
89 | # Procedures |
90 | # |
91 | my @procedures = |
92 | map { $data->{'procedures'}{ $_->[1] } } |
cac60624 |
93 | map { [ $data->{'procedures'}{ $_ }{'order'}, $_ ] } |
7a8a2a90 |
94 | keys %{ $data->{'procedures'} }; |
cac60624 |
95 | |
96 | for my $tdata ( @procedures ) { |
7a8a2a90 |
97 | my $procedure = Procedure->new($tdata); |
98 | $schema->add_procedure($procedure); |
cac60624 |
99 | } |
100 | |
101 | if ( my $tr_data = $data->{'translator'} ) { |
7a8a2a90 |
102 | $translator->add_drop_table( $tr_data->{'add_drop_table'} ); |
103 | $translator->filename( $tr_data->{'filename'} ); |
104 | $translator->no_comments( $tr_data->{'no_comments'} ); |
105 | $translator->parser_args( $tr_data->{'parser_args'} ); |
106 | $translator->producer_args( $tr_data->{'producer_args'} ); |
107 | $translator->parser_type( $tr_data->{'parser_type'} ); |
108 | $translator->producer_type( $tr_data->{'producer_type'} ); |
109 | $translator->show_warnings( $tr_data->{'show_warnings'} ); |
110 | $translator->trace( $tr_data->{'trace'} ); |
cac60624 |
111 | } |
112 | |
113 | return $schema; |
114 | } |
115 | } |