2 role SQL::Translator::Parser::DDL::YAML {
3 use MooseX::Types::Moose qw(Str);
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';
8 use aliased 'SQL::Translator::Object::Procedure';
9 use aliased 'SQL::Translator::Object::Table';
10 use aliased 'SQL::Translator::Object::Trigger';
11 use aliased 'SQL::Translator::Object::View';
13 use MooseX::MultiMethods;
15 multi method parse(Schema $data) { $data }
17 multi method parse(Str $data) {
19 $data = $data->{schema};
21 my $schema = $self->schema;
22 my $translator = $self->translator;
28 map { $data->{'tables'}{ $_->[1] } }
29 map { [ $data->{'tables'}{ $_ }{'order'} || 0, $_ ] }
30 keys %{ $data->{'tables'} };
32 for my $tdata ( @tables ) {
33 my $table = Table->new({ map { $tdata->{$_} ? ($_ => $tdata->{$_}) : () } qw/name extra options/ });
34 $schema->add_table($table);
37 map { $tdata->{'fields'}{ $_->[1] } }
38 map { [ $tdata->{'fields'}{ $_ }{'order'}, $_ ] }
39 keys %{ $tdata->{'fields'} };
41 for my $fdata ( @fields ) {
42 $fdata->{sql_data_type} = $self->data_type_mapping->{$fdata->{data_type}} || -99999;
43 $fdata->{table} = $table;
45 my $column = Column->new($fdata);
46 $table->add_column($column);
47 $table->primary_key($column->name) if $fdata->{is_primary_key};
50 for my $idata ( @{ $tdata->{'indices'} || [] } ) {
51 $idata->{table} = $table;
52 my $columns = delete $idata->{fields};
54 my $index = Index->new($idata);
55 $index->add_column($table->get_column($_)) for @$columns;
56 $table->add_index($index);
59 for my $cdata ( @{ $tdata->{'constraints'} || [] } ) {
60 $cdata->{table} = $table;
61 $cdata->{reference_columns} = delete $cdata->{reference_fields};
62 my $columns = delete $cdata->{fields} || [];
63 my $constraint = Constraint->new($cdata);
64 $constraint->add_column($table->get_column($_)) for @$columns;
65 $table->add_constraint($constraint);
73 map { $data->{'views'}{ $_->[1] } }
74 map { [ $data->{'views'}{ $_ }{'order'}, $_ ] }
75 keys %{ $data->{'views'} };
77 for my $vdata ( @views ) {
78 my $view = View->new($vdata);
79 $schema->add_view($view);
86 map { $data->{'triggers'}{ $_->[1] } }
87 map { [ $data->{'triggers'}{ $_ }{'order'}, $_ ] }
88 keys %{ $data->{'triggers'} };
90 for my $tdata ( @triggers ) {
91 my $columns = delete $tdata->{fields} || ();
92 my $trigger = Trigger->new($tdata);
93 $trigger->add_column($schema->get_table($tdata->{on_table})->get_column($_)) for @$columns;
94 $schema->add_trigger($trigger);
101 map { $data->{'procedures'}{ $_->[1] } }
102 map { [ $data->{'procedures'}{ $_ }{'order'}, $_ ] }
103 keys %{ $data->{'procedures'} };
105 for my $tdata ( @procedures ) {
106 my $procedure = Procedure->new($tdata);
107 $schema->add_procedure($procedure);
110 if ( my $tr_data = $data->{'translator'} ) {
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'} );