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