new: makes tables in latex format
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Filter / Globals.pm
CommitLineData
8dc6a4a3 1package SQL::Translator::Filter::Globals;
2
3# -------------------------------------------------------------------
7abd9a69 4# $Id: Globals.pm,v 1.2 2006-03-10 15:04:12 grommit Exp $
8dc6a4a3 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
25SQL::Translator::Filter::Globals - Add global fields and indices to all tables.
26
27=head1 SYNOPSIS
28
29 # e.g. Add timestamp field to all tables.
30 use SQL::Translator;
31
32 my $sqlt = SQL::Translator->new(
33 from => 'MySQL',
34 to => 'MySQL',
35 filters => [
36 Globals => {
37 fields => [
38 {
39 name => 'modified'
40 data_type => 'TIMESTAMP'
41 }
42 ],
43 indices => [
44 {
45 fields => 'modifed',
46 },
47 ]
7abd9a69 48 constraints => [
49 {
50 }
51 ]
8dc6a4a3 52 },
53 ],
54 ) || die "SQLFairy error : ".SQL::Translator->error;
55 my $sql = $sqlt->translate || die "SQLFairy error : ".$sqlt->error;
56
57=cut
58
59use strict;
60use vars qw/$VERSION/;
61$VERSION=0.1;
62
63sub filter {
64 my $schema = shift;
65 my %args = @_;
66 my $global_table = $args{global_table} ||= '_GLOBAL_';
67
7abd9a69 68 my (@global_fields, @global_indices, @global_constraints);
69 push @global_fields, @{ $args{fields} } if $args{fields};
70 push @global_indices, @{ $args{indices} } if $args{indices};
71 push @global_constraints, @{ $args{constraints} } if $args{constraints};
8dc6a4a3 72
73 # Pull fields and indices off global table and then remove it.
74 if ( my $gtbl = $schema->get_table( $global_table ) ) {
75
76 foreach ( $gtbl->get_fields ) {
77 # We don't copy the order attrib so the added fields should get
78 # pushed on the end of each table.
79 push @global_fields, {
80 name => $_->name,
81 comments => "".$_->comments,
82 data_type => $_->data_type,
83 default_value => $_->default_value,
84 size => [$_->size],
85 extra => scalar($_->extra),
86 foreign_key_reference => $_->foreign_key_reference,
87 is_auto_increment => $_->is_auto_increment,
88 is_foreign_key => $_->is_foreign_key,
89 is_nullable => $_->is_nullable,
90 is_primary_key => $_->is_primary_key,
91 is_unique => $_->is_unique,
92 is_valid => $_->is_valid,
93 };
94 }
95
96 foreach ( $gtbl->get_indices ) {
97 push @global_indices, {
98 name => $_->name,
99 type => $_->type,
100 fields => [$_->fields],
101 options => [$_->options],
102 };
103 }
104
7abd9a69 105 foreach ( $gtbl->get_constraints ) {
106 push @global_constraints, {
107 name => $_->name,
108 fields => [$_->fields],
109 deferrable => $_->deferrable,
110 expression => $_->expression,
111 match_type => $_->match_type,
112 options => [$_->options],
113 on_delete => $_->on_delete,
114 on_update => $_->on_update,
115 reference_fields => [$_->reference_fields],
116 reference_table => $_->reference_table,
117 table => $_->table,
118 type => $_->type,
119 };
120 }
121
8dc6a4a3 122 $schema->drop_table($gtbl);
123 }
124
125 # Add globalis to tables
126 foreach my $tbl ( $schema->get_tables ) {
127
128 foreach my $new_fld ( @global_fields ) {
129 # Don't add if field already there
130 next if $tbl->get_field( $new_fld->{name} );
131 $tbl->add_field( %$new_fld );
132 }
133
134 foreach my $new_index ( @global_indices ) {
8dc6a4a3 135 $tbl->add_index( %$new_index );
136 }
7abd9a69 137
138 foreach my $new_constraint ( @global_constraints ) {
139 $tbl->add_constraint( %$new_constraint );
140 }
8dc6a4a3 141 }
142}
143
1441;
145
146__END__
147
148=head1 DESCRIPTION
149
7abd9a69 150Adds global fields, indices and constraints to all tables in the schema.
8dc6a4a3 151The globals to add can either be defined in the filter args or using a _GLOBAL_
152table (see below).
153
154If a table already contains a field with the same name as a global then it is
155skipped for that table.
156
157=head2 The _GLOBAL_ Table
158
159An alternative to using the args is to add a table called C<_GLOBAL_> to the
160schema and then just use the filter. Any fields and indices defined on this table
161will be added to all the tables in the schema and the _GLOBAL_ table removed.
162
163The name of the global can be changed using a C<global_table> arg to the
164filter.
165
166=head1 SEE ALSO
167
168L<perl(1)>, L<SQL::Translator>
169
170=head1 BUGS
171
172Will generate duplicate indices if an index already exists on a table the same
173as one added globally.
174
7abd9a69 175Will generate duplicate constraints if a constraint already exists on a table
176the same as one added globally.
8dc6a4a3 177
7abd9a69 178=head1 TODO
8dc6a4a3 179
180Some extra data values that can be used to control the global addition. e.g.
181'skip_global'.
182
183=head1 AUTHOR
184
185Mark Addison <grommit@users.sourceforge.net>
186
187=cut