From db7600f7efcd5703097b7187a57c1a13711ec451 Mon Sep 17 00:00:00 2001 From: Mike Rylander Date: Tue, 31 Jan 2017 12:35:05 -0500 Subject: [PATCH] LP#1660059: Protect against null value in group field If a nullable event grouping field is configured, and a null value is indeed encountered when pulling together events, the Action/Trigger code will exit unceremoniously. To prevent this, we will now collect events with either a null grouping object or grouping field, and use a new batch invalidation API call to get rid of them as quickly as possible after group sorting is complete. Signed-off-by: Mike Rylander Signed-off-by: Chris Sharp --- .../lib/OpenILS/Application/Trigger.pm | 11 +++++++++- .../lib/OpenILS/Application/Trigger/Event.pm | 21 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger.pm index 920175b5c7..3336dcbc54 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger.pm @@ -757,6 +757,7 @@ sub grouped_events { $client->status( new OpenSRF::DomainObject::oilsContinueStatus ); } + my @invalid; # sync for events with a null grouping field for my $e (@fleshed_events) { if (my $group = $e->event->event_def->group_field) { @@ -771,12 +772,19 @@ sub grouped_events { }; unless($node) { # should not get here, but to be safe.. - $e->update_state('invalid'); + push @invalid, $e; next; } # get the grouping value for the grouping object on this event my $ident_value = $node->$group_field(); + + # could by false-y, so check definedness + if (!defined($ident_value)) { + push @invalid, $e; + next; + } + if(ref $ident_value) { my $ident_field = $ident_value->Identity; $ident_value = $ident_value->$ident_field() @@ -791,6 +799,7 @@ sub grouped_events { } } + OpenILS::Application::Trigger::Event->invalidate(@invalid) if @invalid; return \%groups; } diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Event.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Event.pm index 91c7994109..bd85e387dd 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Event.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Event.pm @@ -10,6 +10,27 @@ use Safe; my $log = 'OpenSRF::Utils::Logger'; +sub invalidate { + my $class = shift; + my @events = @_; + + # if called as an instance method + unshift(@events,$class) if ref($class); + + my $e = new_editor(); + $e->xact_begin; + + map { + $_->editor($e); + $_->standalone(0); + $_->update_state('invalid'); + } @events; + + $e->commit; + + return @events; +} + sub new { my $class = shift; my $id = shift; -- 2.43.2