use $pdata instead of $tdata for procedure info
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Parser / DDL / YAML.pm
CommitLineData
cac60624 1use MooseX::Declare;
2role 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}