return $self->bail_on_events($e->event)
unless $e->update_action_hold_request($hold);
- $holdcode->delete_hold_copy_maps($e, $hold->id);
return $self->fulfilled_holds([$hold->id]);
}
$e->update_action_hold_request($hold)
or return $e->die_event;
- delete_hold_copy_maps($self, $e, $hold->id);
-
$e->commit;
# re-fetch the hold to pick up the real cancel_time (not "now") for A/T
return 1;
}
-sub delete_hold_copy_maps {
- my $class = shift;
- my $editor = shift;
- my $holdid = shift;
-
- my $maps = $editor->search_action_hold_copy_map({hold=>$holdid});
- for(@$maps) {
- $editor->delete_action_hold_copy_map($_)
- or return $editor->event;
- }
- return undef;
-}
-
my $update_hold_desc = 'The login session is the requestor. ' .
'If the requestor is different from the usr field on the hold, ' .
$hold->cancel_time('now');
$hold->cancel_cause(2); # Hold Shelf expiration
$e->update_action_hold_request($hold) or return $e->die_event;
- delete_hold_copy_maps($self, $e, $hold->id) and return $e->die_event;
push(@canceled_holds, $hold_id);
}
-- CREATE INDEX acm_hold_idx ON action.hold_copy_map (hold);
CREATE INDEX acm_copy_idx ON action.hold_copy_map (target_copy);
+-- delete hold copy maps when not needed.
+CREATE OR REPLACE FUNCTION action.clear_hold_copy_maps() RETURNS TRIGGER AS $f$
+BEGIN
+ IF NEW.capture_time IS NOT NULL
+ OR NEW.cancel_time IS NOT NULL
+ OR NEW.frozen THEN
+ DELETE FROM action.hold_copy_map WHERE hold = NEW.id;
+ END IF;
+ RETURN NEW;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER clear_hold_copy_maps_tgr
+ AFTER UPDATE ON action.hold_request
+ FOR EACH ROW EXECUTE PROCEDURE action.clear_hold_copy_maps();
+
CREATE TABLE action.transit_copy (
id SERIAL PRIMARY KEY,
source_send_time TIMESTAMP WITH TIME ZONE,
--- /dev/null
+BEGIN;
+
+--SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+CREATE OR REPLACE FUNCTION action.clear_hold_copy_maps() RETURNS TRIGGER AS $f$
+BEGIN
+ IF NEW.capture_time IS NOT NULL
+ OR NEW.cancel_time IS NOT NULL
+ OR NEW.frozen THEN
+ DELETE FROM action.hold_copy_map WHERE hold = NEW.id;
+ END IF;
+ RETURN NEW;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER clear_hold_copy_maps_tgr
+ AFTER UPDATE ON action.hold_request
+ FOR EACH ROW EXECUTE PROCEDURE action.clear_hold_copy_maps();
+
+COMMIT;
+
+/*
+-- simple test of the above. note: this assumes the presence of sample
+-- data where the hold targeter has run.
+BEGIN;
+ SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2;
+ UPDATE action.hold_request SET frozen = TRUE WHERE ID = 2;
+ SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2;
+ROLLBACK;
+BEGIN;
+ SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2;
+ UPDATE action.hold_request SET capture_time = NOW() WHERE ID = 2;
+ SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2;
+ROLLBACK;
+BEGIN;
+ SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2;
+ UPDATE action.hold_request SET prev_check_time = NOW() WHERE ID = 2;
+ SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2;
+ROLLBACK;
+*/