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