Fix a couple of tests and add forgotten dependency
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Producer / YAML.pm
CommitLineData
d3fad399 1package SQL::Translator::Producer::YAML;
2
3# -------------------------------------------------------------------
478f608d 4# Copyright (C) 2002-2009 SQLFairy Authors
d3fad399 5#
6# This program is free software; you can redistribute it and/or
7# modify it under the terms of the GNU General Public License as
8# published by the Free Software Foundation; version 2.
9#
10# This program is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program; if not, write to the Free Software
17# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18# 02111-1307 USA
19# -------------------------------------------------------------------
20
75c75c55 21=head1 NAME
22
23SQL::Translator::Producer::YAML - A YAML producer for SQL::Translator
24
25=head1 SYNOPSIS
26
27 use SQL::Translator;
28
c16f976a 29 my $translator = SQL::Translator->new(producer => 'YAML');
75c75c55 30
31=head1 DESCRIPTION
32
33This module uses YAML to serialize a schema to a string so that it
34can be saved to disk. Serializing a schema and then calling producers
35on the stored can realize significant performance gains when parsing
36takes a long time.
37
38=cut
39
d3fad399 40use strict;
da06ac74 41use vars qw($VERSION);
4ab3763d 42$VERSION = '1.59';
d3fad399 43
af53e4ec 44use YAML qw(Dump);
d3fad399 45
6785b14e 46# -------------------------------------------------------------------
d3fad399 47sub produce {
07f25b8d 48 my $translator = shift;
49 my $schema = $translator->schema;
d3fad399 50
af53e4ec 51 return Dump({
52 schema => {
6785b14e 53 tables => {
c16f976a 54 map { ($_->name => view_table($_)) }
55 $schema->get_tables,
6785b14e 56 },
57 views => {
c16f976a 58 map { ($_->name => view_view($_)) }
59 $schema->get_views,
6785b14e 60 },
61 triggers => {
c16f976a 62 map { ($_->name => view_trigger($_)) }
63 $schema->get_triggers,
6785b14e 64 },
65 procedures => {
66 map { ($_->name => view_procedure($_)) }
c16f976a 67 $schema->get_procedures,
6785b14e 68 },
25a2e5c6 69 },
70 translator => {
71 add_drop_table => $translator->add_drop_table,
72 filename => $translator->filename,
73 no_comments => $translator->no_comments,
74 parser_args => $translator->parser_args,
75 producer_args => $translator->producer_args,
76 parser_type => $translator->parser_type,
77 producer_type => $translator->producer_type,
78 show_warnings => $translator->show_warnings,
79 trace => $translator->trace,
80 version => $translator->version,
af53e4ec 81 }
82 });
d3fad399 83}
84
6785b14e 85# -------------------------------------------------------------------
d3fad399 86sub view_table {
87 my $table = shift;
88
af53e4ec 89 return {
b3d280e2 90 'name' => $table->name,
91 'order' => $table->order,
92 'options' => $table->options || [],
4d438549 93 $table->comments ? ('comments' => $table->comments ) : (),
b3d280e2 94 'constraints' => [
95 map { view_constraint($_) } $table->get_constraints
96 ],
97 'indices' => [
98 map { view_index($_) } $table->get_indices
99 ],
100 'fields' => {
c16f976a 101 map { ($_->name => view_field($_)) }
102 $table->get_fields
6785b14e 103 },
af53e4ec 104 };
d3fad399 105}
106
6785b14e 107# -------------------------------------------------------------------
b3d280e2 108sub view_constraint {
109 my $constraint = shift;
110
111 return {
112 'deferrable' => scalar $constraint->deferrable,
113 'expression' => scalar $constraint->expression,
4d438549 114 'fields' => [ map { ref $_ ? $_->name : $_ } $constraint->field_names ],
b3d280e2 115 'match_type' => scalar $constraint->match_type,
116 'name' => scalar $constraint->name,
117 'options' => scalar $constraint->options,
118 'on_delete' => scalar $constraint->on_delete,
119 'on_update' => scalar $constraint->on_update,
120 'reference_fields' => scalar $constraint->reference_fields,
121 'reference_table' => scalar $constraint->reference_table,
122 'type' => scalar $constraint->type,
123 };
124}
125
126# -------------------------------------------------------------------
d3fad399 127sub view_field {
128 my $field = shift;
129
af53e4ec 130 return {
4d438549 131 'order' => scalar $field->order,
132 'name' => scalar $field->name,
133 'data_type' => scalar $field->data_type,
134 'size' => [ $field->size ],
135 'default_value' => scalar $field->default_value,
136 'is_nullable' => scalar $field->is_nullable,
137 'is_primary_key' => scalar $field->is_primary_key,
138 'is_unique' => scalar $field->is_unique,
139 $field->is_auto_increment ? ('is_auto_increment' => 1) : (),
140 $field->comments ? ('comments' => $field->comments) : (),
141 'extra' => { $field->extra },
af53e4ec 142 };
d3fad399 143}
144
6785b14e 145# -------------------------------------------------------------------
146sub view_procedure {
147 my $procedure = shift;
148
149 return {
150 'order' => scalar $procedure->order,
151 'name' => scalar $procedure->name,
152 'sql' => scalar $procedure->sql,
153 'parameters' => scalar $procedure->parameters,
154 'owner' => scalar $procedure->owner,
155 'comments' => scalar $procedure->comments,
156 };
157}
158
159# -------------------------------------------------------------------
160sub view_trigger {
161 my $trigger = shift;
162
163 return {
164 'order' => scalar $trigger->order,
165 'name' => scalar $trigger->name,
166 'perform_action_when' => scalar $trigger->perform_action_when,
758106cc 167 'database_events' => scalar $trigger->database_events,
6785b14e 168 'fields' => scalar $trigger->fields,
169 'on_table' => scalar $trigger->on_table,
170 'action' => scalar $trigger->action,
171 };
172}
173
174# -------------------------------------------------------------------
175sub view_view {
176 my $view = shift;
177
178 return {
179 'order' => scalar $view->order,
180 'name' => scalar $view->name,
181 'sql' => scalar $view->sql,
182 'fields' => scalar $view->fields,
183 };
184}
185
c16f976a 186# -------------------------------------------------------------------
187sub view_index {
188 my $index = shift;
189
190 return {
191 'name' => scalar $index->name,
192 'type' => scalar $index->type,
193 'fields' => scalar $index->fields,
194 'options' => scalar $index->options,
195 };
196}
197
af53e4ec 1981;
d3fad399 199
75c75c55 200# -------------------------------------------------------------------
d3fad399 201
75c75c55 202=head1 SEE ALSO
203
204SQL::Translator, YAML, http://www.yaml.org/.
6785b14e 205
206=head1 AUTHORS
207
208darren chamberlain E<lt>darren@cpan.orgE<gt>,
209Ken Y. Clark E<lt>kclark@cpan.orgE<gt>.
210
211=cut