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 | |
a69b5060 |
15 | multi method parse(Schema $data) { $data } |
cac60624 |
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; |
a69b5060 |
43 | $fdata->{table} = $table; |
7a8a2a90 |
44 | |
cac60624 |
45 | my $column = Column->new($fdata); |
46 | $table->add_column($column); |
47 | $table->primary_key($column->name) if $fdata->{is_primary_key}; |
48 | } |
49 | |
5fdf3329 |
50 | for my $idata ( @{ $tdata->{'indices'} || [] } ) { |
a69b5060 |
51 | $idata->{table} = $table; |
5fdf3329 |
52 | my $columns = delete $idata->{fields}; |
53 | |
cac60624 |
54 | my $index = Index->new($idata); |
5fdf3329 |
55 | $index->add_column($table->get_column($_)) for @$columns; |
cac60624 |
56 | $table->add_index($index); |
57 | } |
58 | |
59 | for my $cdata ( @{ $tdata->{'constraints'} || [] } ) { |
a69b5060 |
60 | $cdata->{table} = $table; |
5fdf3329 |
61 | $cdata->{reference_columns} = delete $cdata->{reference_fields}; |
62 | my $columns = delete $cdata->{fields} || []; |
cac60624 |
63 | my $constraint = Constraint->new($cdata); |
5fdf3329 |
64 | $constraint->add_column($table->get_column($_)) for @$columns; |
cac60624 |
65 | $table->add_constraint($constraint); |
66 | } |
67 | } |
68 | |
69 | # |
70 | # Views |
71 | # |
72 | my @views = |
73 | map { $data->{'views'}{ $_->[1] } } |
cac60624 |
74 | map { [ $data->{'views'}{ $_ }{'order'}, $_ ] } |
7a8a2a90 |
75 | keys %{ $data->{'views'} }; |
cac60624 |
76 | |
77 | for my $vdata ( @views ) { |
7a8a2a90 |
78 | my $view = View->new($vdata); |
79 | $schema->add_view($view); |
cac60624 |
80 | } |
81 | |
82 | # |
83 | # Triggers |
84 | # |
85 | my @triggers = |
86 | map { $data->{'triggers'}{ $_->[1] } } |
cac60624 |
87 | map { [ $data->{'triggers'}{ $_ }{'order'}, $_ ] } |
7a8a2a90 |
88 | keys %{ $data->{'triggers'} }; |
cac60624 |
89 | |
90 | for my $tdata ( @triggers ) { |
5fdf3329 |
91 | my $columns = delete $tdata->{fields} || (); |
7a8a2a90 |
92 | my $trigger = Trigger->new($tdata); |
5fdf3329 |
93 | $trigger->add_column($schema->get_table($tdata->{on_table})->get_column($_)) for @$columns; |
7a8a2a90 |
94 | $schema->add_trigger($trigger); |
cac60624 |
95 | } |
96 | |
97 | # |
98 | # Procedures |
99 | # |
100 | my @procedures = |
101 | map { $data->{'procedures'}{ $_->[1] } } |
cac60624 |
102 | map { [ $data->{'procedures'}{ $_ }{'order'}, $_ ] } |
7a8a2a90 |
103 | keys %{ $data->{'procedures'} }; |
cac60624 |
104 | |
105 | for my $tdata ( @procedures ) { |
7a8a2a90 |
106 | my $procedure = Procedure->new($tdata); |
107 | $schema->add_procedure($procedure); |
cac60624 |
108 | } |
109 | |
110 | if ( my $tr_data = $data->{'translator'} ) { |
7a8a2a90 |
111 | $translator->add_drop_table( $tr_data->{'add_drop_table'} ); |
112 | $translator->filename( $tr_data->{'filename'} ); |
113 | $translator->no_comments( $tr_data->{'no_comments'} ); |
114 | $translator->parser_args( $tr_data->{'parser_args'} ); |
115 | $translator->producer_args( $tr_data->{'producer_args'} ); |
116 | $translator->parser_type( $tr_data->{'parser_type'} ); |
117 | $translator->producer_type( $tr_data->{'producer_type'} ); |
118 | $translator->show_warnings( $tr_data->{'show_warnings'} ); |
119 | $translator->trace( $tr_data->{'trace'} ); |
cac60624 |
120 | } |
121 | |
122 | return $schema; |
123 | } |
124 | } |