Added a test for Producer::SqlfXML.
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Producer / SqlfXML.pm
1 package SQL::Translator::Producer::SqlfXML;
2
3 # -------------------------------------------------------------------
4 # $Id: SqlfXML.pm,v 1.3 2003-08-08 12:30:20 grommit Exp $
5 # -------------------------------------------------------------------
6 # Copyright (C) 2003 Ken Y. Clark <kclark@cpan.org>,
7 #                    darren chamberlain <darren@cpan.org>,
8 #                    Chris Mungall <cjm@fruitfly.org>
9 #
10 # This program is free software; you can redistribute it and/or
11 # modify it under the terms of the GNU General Public License as
12 # published by the Free Software Foundation; version 2.
13 #
14 # This program is distributed in the hope that it will be useful, but
15 # WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 # General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program; if not, write to the Free Software
21 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
22 # 02111-1307  USA
23 # -------------------------------------------------------------------
24
25 use strict;
26 use warnings;
27 use vars qw[ $VERSION ];
28 $VERSION = sprintf "%d.%02d", q$Revision: 1.3 $ =~ /(\d+)\.(\d+)/;
29
30 use Exporter;
31 use base qw(Exporter);
32 our @EXPORT_OK = qw(produce);
33
34 use IO::Scalar;
35 use SQL::Translator::Utils qw(header_comment);
36 use XML::Writer;
37
38 my $namespace = 'http://sqlfairy.sourceforge.net/sqlfairy.xml';
39 my $name = 'sqlt';
40
41
42 our ($translator,$args,$schema);
43
44 sub debug { $translator->debug(@_,"\n"); } # Shortcut.
45
46 sub produce {
47     $translator = shift;
48     $args       = $translator->producer_args;
49     $schema  = $translator->schema;
50
51     my $io       = IO::Scalar->new;
52     my $xml         = XML::Writer->new(
53         OUTPUT      => $io,
54         NAMESPACES  => 1,
55         PREFIX_MAP  => { $namespace => $name },
56         DATA_MODE   => 1,
57         DATA_INDENT => 2,
58     );
59
60     $xml->xmlDecl('UTF-8');
61     $xml->comment(header_comment('', ''));
62     $xml->startTag([ $namespace => 'schema' ]);
63
64     #
65     # Table
66     #
67     for my $table ( $schema->get_tables ) {
68         debug "Table:",$table->name;
69         $xml->startTag( [ $namespace => 'table' ] );
70         xml_objAttr($xml,$table, qw/name order/);
71         
72         #
73         # Fields
74         #
75         $xml->startTag( [ $namespace => 'fields' ] );
76         for my $field ( $table->get_fields ) {
77             debug "    Field:",$field->name;
78             $xml->startTag( [ $namespace => 'field' ] );
79             xml_objAttr($xml,$field, qw/ 
80                      name data_type default_value is_auto_increment 
81                      is_primary_key is_nullable is_foreign_key order size
82             /);
83             $xml->endTag( [ $namespace => 'field' ] );
84         }
85         $xml->endTag( [ $namespace => 'fields' ] );
86
87         #
88         # Indices
89         #
90         $xml->startTag( [ $namespace => 'indices' ] );
91         for my $index ( $table->get_indices ) {
92             debug "Index:",$index->name;
93             $xml->startTag( [ $namespace => 'index' ] );
94             xml_objAttr($xml,$index, qw/fields name options type/);
95             $xml->endTag( [ $namespace => 'index' ] );
96         }
97         $xml->endTag( [ $namespace => 'indices' ] );
98
99         #
100         # Constraints
101         #
102         $xml->startTag( [ $namespace => 'constraints' ] );
103         for my $index ( $table->get_constraints ) {
104             debug "Constraint:",$index->name;
105             $xml->startTag( [ $namespace => 'constraint' ] );
106             xml_objAttr($xml,$index, qw/
107                     deferrable expression fields match_type name 
108                     options on_delete on_update reference_fields
109                     reference_table type 
110             /);
111             $xml->endTag( [ $namespace => 'constraint' ] );
112         }
113         $xml->endTag( [ $namespace => 'constraints' ] );
114
115         $xml->endTag( [ $namespace => 'table' ] );
116     }
117
118     $xml->endTag([ $namespace => 'schema' ]);
119     $xml->end;
120
121     return $io;
122 }
123
124 # Takes an xml writer, a Schema:: object and a list of methods and adds the
125 # XML for those methods.
126 sub xml_objAttr {
127     my ($xml, $obj, @methods) = @_;
128     for my $method (@methods) {
129         my $val = $obj->$method;
130         debug "        ".ref($obj)."->$method=",
131               (defined $val ? "'$val'" : "<UNDEF>");
132         next unless $args->{emit_empty_tags} || defined $val;
133         $val = "" if not defined $val;
134         $val = ref $val eq 'ARRAY' ? join(',', @$val) : $val;
135         debug "        Adding Attr:".$method."='",$val,"'";
136         $xml->dataElement( [ $namespace => $method ], $val );
137     }
138 }
139         
140 } # End of our scoped bit
141
142 1;
143
144 # -------------------------------------------------------------------
145 # The eyes of fire, the nostrils of air,
146 # The mouth of water, the beard of earth.
147 # William Blake
148 # -------------------------------------------------------------------
149
150 =head1 NAME
151
152 SQL::Translator::Producer::SqlfXML - XML output
153
154 =head1 SYNOPSIS
155
156   use SQL::Translator;
157
158   my $translator = SQL::Translator->new(
159       show_warnings  => 1,
160       add_drop_table => 1,
161   );
162   print = $obj->translate(
163       from     => "MySQL",
164       to       => "SqlfXML",
165       filename => "fooschema.sql",
166   );
167
168 =head1 DESCRIPTION
169
170 Creates XML output of a schema.
171
172 =head1 TODO
173
174 =head1 AUTHOR
175
176 Ken Y. Clark E<lt>kclark@cpan.orgE<gt>, 
177 darren chamberlain E<lt>darren@cpan.orgE<gt>, 
178 mark addison E<lt>mark.addison@itn.co.ukE<gt>, 
179
180 =head1 SEE ALSO
181
182 perl(1), SQL::Translator, SQL::Translator::Parser::SqlfXML,
183 SQL::Translator::Schema, XML::Writer.