X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FSchema%2FTrigger.pm;h=83ff30f8222564dbdd4ff6f615e62aa96b7870fc;hb=ba506e52c480afe33dfec6b38a12759fad1e7fa2;hp=2219ee8265f1ecb4c5f3c78d33cb9b0c435e819d;hpb=782b5a43519d2713171767f74a544fe9892542ea;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Schema/Trigger.pm b/lib/SQL/Translator/Schema/Trigger.pm index 2219ee8..83ff30f 100644 --- a/lib/SQL/Translator/Schema/Trigger.pm +++ b/lib/SQL/Translator/Schema/Trigger.pm @@ -1,8 +1,6 @@ package SQL::Translator::Schema::Trigger; # ---------------------------------------------------------------------- -# $Id$ -# ---------------------------------------------------------------------- # Copyright (C) 2002-2009 SQLFairy Authors # # This program is free software; you can redistribute it and/or @@ -30,14 +28,13 @@ SQL::Translator::Schema::Trigger - SQL::Translator trigger object use SQL::Translator::Schema::Trigger; my $trigger = SQL::Translator::Schema::Trigger->new( - name => 'foo', - perform_action_when => 'before', # or after - database_event => 'insert', # Obsolete please use database_events! - database_events => [qw/update instert/], # or update, update_on, delete - fields => [], # fields if event is "update" - on_table => 'foo', # table name - action => '...', # text of trigger - schema => $schema, # Schema object + name => 'foo', + perform_action_when => 'before', # or after + database_events => [qw/update insert/], # also update, update_on, delete + fields => [], # if event is "update" + on_table => 'foo', # table name + action => '...', # text of trigger + schema => $schema, # Schema object ); =head1 DESCRIPTION @@ -57,13 +54,13 @@ use Carp; use vars qw($VERSION $TABLE_COUNT $VIEW_COUNT); -$VERSION = '1.99'; +$VERSION = '1.60'; # ---------------------------------------------------------------------- __PACKAGE__->_attributes( qw/ - name schema perform_action_when database_event database_events fields table on_table action - order + name schema perform_action_when database_events database_event + fields table on_table action order /); =pod @@ -114,23 +111,15 @@ sub database_event { =head2 database_event -Obosolete please use database_events! +Obsolete please use database_events! =cut - my $self = shift; - - - if ( my $arg = shift ) { - $self->database_events( [$arg] ); - } - - return $self->error("Please use database_events the trigger has more then one events!") - if (scalar @{$self->{'database_events'}} > 1); - - carp 'database_event is obsolete please use database_events'; - return (@{ $self->{'database_events'} })[0]; + my $self = shift; + + return $self->database_events( @_ ); } + # ---------------------------------------------------------------------- sub database_events { @@ -144,24 +133,28 @@ Gets or sets the events that triggers the trigger. =cut - my $self = shift; - - if ( my $arg = shift ) { - if (ref $arg eq "ARRAY"){ - map { - $_ = lc; - $_ =~ s/\s+/ /g; - return $self->error("Invalid event '$_' in database_events") unless ( $_ =~ /^(insert|update|update_on|delete)$/ ); - } @$arg ; - @{ $self->{'database_events'} } = @$arg; - - }else{ - return $self->error("Invalid argument to database_events"); - }; - - } - - return $self->{'database_events'}; + my $self = shift; + my @args = ref $_[0] eq 'ARRAY' ? @{ $_[0] } : @_; + + if ( @args ) { + @args = map { s/\s+/ /g; lc $_ } @args; + my %valid = map { $_, 1 } qw[ insert update update_on delete ]; + my @invalid = grep { !defined $valid{ $_ } } @args; + + if ( @invalid ) { + return $self->error( + sprintf("Invalid events '%s' in database_events", + join(', ', @invalid) + ) + ); + } + + $self->{'database_events'} = [ @args ]; + } + + return wantarray + ? @{ $self->{'database_events'} || [] } + : $self->{'database_events'}; } # ---------------------------------------------------------------------- @@ -286,9 +279,9 @@ Determine whether the trigger is valid or not. my $self = shift; for my $attr ( - qw[ name perform_action_when database_event on_table action ] + qw[ name perform_action_when database_events on_table action ] ) { - return $self->error("No $attr") unless $self->$attr(); + return $self->error("Invalid: missing '$attr'") unless $self->$attr(); } return $self->error("Missing fields for UPDATE ON") if @@ -371,18 +364,23 @@ sub compare_arrays { Compare two arrays. =cut - - my ($first, $second) = @_; - no warnings; # silence spurious -w undef complaints - - return 0 unless (ref $first eq 'ARRAY' and ref $second eq 'ARRAY' ) ; - return 0 unless @$first == @$second; - my @first = sort @$first; - my @second = sort @$second; - for (my $i = 0; $i < scalar @first; $i++) { - return 0 if @first[$i] ne @second[$i]; - } - return 1; + + my ($first, $second) = @_; + no warnings; # silence spurious -w undef complaints + + return 0 unless (ref $first eq 'ARRAY' and ref $second eq 'ARRAY' ) ; + + return 0 unless @$first == @$second; + + my @first = sort @$first; + + my @second = sort @$second; + + for (my $i = 0; $i < scalar @first; $i++) { + return 0 if @first[$i] ne @second[$i]; + } + + return 1; } # ---------------------------------------------------------------------- @@ -394,22 +392,50 @@ sub equals { Determines if this trigger is the same as another - my $isIdentical = $trigger1->equals( $trigger2 ); + my $is_identical = $trigger1->equals( $trigger2 ); =cut - my $self = shift; - my $other = shift; + my $self = shift; + my $other = shift; my $case_insensitive = shift; return 0 unless $self->SUPER::equals($other); - return 0 unless $case_insensitive ? uc($self->name) eq uc($other->name) : $self->name eq $other->name; - #return 0 unless $self->is_valid eq $other->is_valid; - return 0 unless $self->perform_action_when eq $other->perform_action_when; - return 0 unless compare_arrays($self->database_events,$other->database_events) ; - return 0 unless $self->on_table eq $other->on_table; - return 0 unless $self->action eq $other->action; - return 0 unless $self->_compare_objects(scalar $self->extra, scalar $other->extra); + + my %names; + for my $name ( $self->name, $other->name ) { + $name = lc $name if $case_insensitive; + $names{ $name }++; + } + + if ( keys %names > 1 ) { + return $self->error('Names not equal'); + } + + if ( !$self->perform_action_when eq $other->perform_action_when ) { + return $self->error('perform_action_when differs'); + } + + if ( + !compare_arrays( [$self->database_events], [$other->database_events] ) + ) { + return $self->error('database_events differ'); + } + + if ( $self->on_table ne $other->on_table ) { + return $self->error('on_table differs'); + } + + if ( $self->action ne $other->action ) { + return $self->error('action differs'); + } + + if ( + !$self->_compare_objects( scalar $self->extra, scalar $other->extra ) + ) { + return $self->error('extras differ'); + } + return 1; } @@ -425,8 +451,9 @@ sub DESTROY { =pod -=head1 AUTHOR +=head1 AUTHORS -Ken Y. Clark Ekclark@cpan.orgE. +Anonymous, +Ken Youens-Clark Ekclark@cpan.orgE. =cut