Commit | Line | Data |
cac60624 |
1 | use MooseX::Declare; |
2 | role SQL::Translator::Producer::YAML { |
510dbe0f |
3 | use YAML qw(Dump); |
4 | use SQL::Translator::Types qw(Column Constraint Index Procedure Table Trigger View); |
5 | |
6 | method produce { |
7 | my $schema = $self->schema; |
8 | my $translator = $self->translator; |
9 | |
10 | return Dump({ |
11 | schema => { |
12 | tables => { map { ($_->name => $self->_create_table($_)) } $schema->get_tables, }, |
13 | views => { map { ($_->name => $self->_create_view($_)) } $schema->get_views, }, |
14 | triggers => { map { ($_->name => $self->_create_trigger($_)) } $schema->get_triggers, }, |
15 | procedures => { map { ($_->name => $self->_create_procedure($_)) } $schema->get_procedures, }, |
cac60624 |
16 | }, |
510dbe0f |
17 | translator => { |
18 | add_drop_table => $translator->add_drop_table, |
19 | filename => $translator->filename, |
20 | no_comments => $translator->no_comments, |
788d91fd |
21 | parser_args => $translator->parser_args || {}, |
22 | producer_args => $translator->producer_args || {}, |
510dbe0f |
23 | parser_type => $translator->parser_type, |
24 | producer_type => $translator->producer_type, |
25 | show_warnings => $translator->show_warnings, |
26 | trace => $translator->trace, |
27 | version => $translator->version, |
cac60624 |
28 | }, |
92761bc6 |
29 | keys %{$schema->extra} ? ('extra' => { $schema->extra } ) : (), |
510dbe0f |
30 | }); |
31 | } |
32 | |
33 | method _create_table(Table $table) { |
34 | return { |
92761bc6 |
35 | 'name' => scalar $table->name, |
788d91fd |
36 | 'options' => $table->options || [], |
510dbe0f |
37 | $table->comments ? ('comments' => $table->comments ) : (), |
38 | 'constraints' => [ map { $self->_create_constraint($_) } $table->get_constraints ], |
39 | 'indices' => [ map { $self->_create_index($_) } $table->get_indices ], |
788d91fd |
40 | 'fields' => { map { ($_->name => $self->_create_field($_)) } $table->get_fields, |
41 | 'order' => $table->order, |
cac60624 |
42 | }, |
92761bc6 |
43 | keys %{$table->extra} ? ('extra' => { $table->extra } ) : (), |
510dbe0f |
44 | }; |
45 | } |
46 | |
47 | method _create_constraint(Constraint $constraint) { |
48 | return { |
49 | 'deferrable' => scalar $constraint->deferrable, |
788d91fd |
50 | 'expression' => scalar $constraint->expression || '', |
efdd470e |
51 | 'fields' => [ $constraint->fields ], |
510dbe0f |
52 | 'match_type' => scalar $constraint->match_type, |
53 | 'name' => scalar $constraint->name, |
788d91fd |
54 | 'options' => $constraint->options || [], |
55 | 'on_delete' => scalar $constraint->on_delete || '', |
56 | 'on_update' => scalar $constraint->on_update || '', |
efdd470e |
57 | 'reference_fields' => [ map { ref $_ ? $_->name : $_ } $constraint->reference_fields ], |
788d91fd |
58 | 'reference_table' => $constraint->reference_table || '', |
510dbe0f |
59 | 'type' => scalar $constraint->type, |
92761bc6 |
60 | keys %{$constraint->extra} ? ('extra' => { $constraint->extra } ) : (), |
510dbe0f |
61 | }; |
62 | } |
63 | |
64 | method _create_field(Column $field) { |
65 | return { |
788d91fd |
66 | 'name' => $field->name, |
510dbe0f |
67 | 'data_type' => scalar $field->data_type, |
68 | 'size' => [ $field->size ], |
69 | 'default_value' => scalar $field->default_value, |
788d91fd |
70 | 'is_nullable' => $field->is_nullable, |
510dbe0f |
71 | 'is_primary_key' => scalar $field->is_primary_key, |
788d91fd |
72 | 'is_unique' => $field->is_unique, |
73 | 'order' => scalar $field->order, |
510dbe0f |
74 | $field->is_auto_increment ? ('is_auto_increment' => 1) : (), |
75 | $field->comments ? ('comments' => $field->comments) : (), |
92761bc6 |
76 | keys %{$field->extra} ? ('extra' => { $field->extra } ) : (), |
510dbe0f |
77 | }; |
78 | } |
79 | |
80 | method _create_procedure(Procedure $procedure) { |
81 | return { |
510dbe0f |
82 | 'name' => scalar $procedure->name, |
83 | 'sql' => scalar $procedure->sql, |
84 | 'parameters' => scalar $procedure->parameters, |
85 | 'owner' => scalar $procedure->owner, |
86 | 'comments' => scalar $procedure->comments, |
92761bc6 |
87 | keys %{$procedure->extra} ? ('extra' => { $procedure->extra } ) : (), |
510dbe0f |
88 | }; |
89 | } |
90 | |
91 | method _create_trigger(Trigger $trigger) { |
92 | return { |
510dbe0f |
93 | 'name' => scalar $trigger->name, |
94 | 'perform_action_when' => scalar $trigger->perform_action_when, |
788d91fd |
95 | 'database_events' => [ $trigger->database_events ], |
96 | 'fields' => $trigger->fields ? [ $trigger->fields ] : undef, |
510dbe0f |
97 | 'on_table' => scalar $trigger->on_table, |
98 | 'action' => scalar $trigger->action, |
788d91fd |
99 | 'order' => $trigger->order, |
92761bc6 |
100 | keys %{$trigger->extra} ? ('extra' => { $trigger->extra } ) : (), |
510dbe0f |
101 | }; |
102 | } |
103 | |
104 | method _create_view(View $view) { |
105 | return { |
510dbe0f |
106 | 'name' => scalar $view->name, |
107 | 'sql' => scalar $view->sql, |
788d91fd |
108 | 'fields' => $view->fields ? [ $view->fields ] : '', |
109 | 'order' => $view->order, |
92761bc6 |
110 | keys %{$view->extra} ? ('extra' => { $view->extra } ) : (), |
510dbe0f |
111 | }; |
112 | } |
113 | |
114 | method _create_index(Index $index) { |
115 | return { |
116 | 'name' => scalar $index->name, |
117 | 'type' => scalar $index->type, |
efdd470e |
118 | 'fields' => [ $index->fields ], |
510dbe0f |
119 | 'options' => scalar $index->options, |
92761bc6 |
120 | keys %{$index->extra} ? ('extra' => { $index->extra } ) : (), |
510dbe0f |
121 | }; |
122 | } |
cac60624 |
123 | } |