From 1263db6406bbae8ae38d0f9e6ec134c53028e087 Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Wed, 10 Oct 2012 17:11:25 -0400 Subject: [PATCH] allow per-session overriding of internal flags It can be handy during record ingest to selectively disable parts of the ingest chain, for example to allow for parallel record loads, while not interfering with normal cataloging. This patch provides a mechanism for per-database-connection overriding of the enabled state of config.internal_flag values. Three new database functions are defined: * evergreen.override_internal_flag_status(flag, enabled) Override the enabled status of the specified flag; this override is visible only to the database connection that invokes this function. * evergreen.clear_internal_flag_override(flag) Remove the per-session override on the specified flag. * evergreen.internal_flag_set(flag) Returns true if the flag exists and is enabled, taking any per-session overrides into account. The intention is that all internal flag queries should use this wrapper function. Signed-off-by: Galen Charlton --- Open-ILS/src/sql/Pg/002.schema.config.sql | 30 ++++++++++++++++++++++++++ Open-ILS/src/sql/Pg/011.schema.authority.sql | 26 ++++++---------------- Open-ILS/src/sql/Pg/030.schema.metabib.sql | 32 ++++++++++------------------ Open-ILS/src/sql/Pg/110.hold_matrix.sql | 13 +++++------ Open-ILS/src/sql/Pg/210.schema.serials.sql | 5 ++--- Open-ILS/src/sql/Pg/999.functions.global.sql | 11 ++++------ 6 files changed, 59 insertions(+), 58 deletions(-) diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql index e1f8381576..e419ff7579 100644 --- a/Open-ILS/src/sql/Pg/002.schema.config.sql +++ b/Open-ILS/src/sql/Pg/002.schema.config.sql @@ -48,6 +48,36 @@ INSERT INTO config.internal_flag (name) VALUES ('ingest.disable_metabib_field_en INSERT INTO config.internal_flag (name) VALUES ('ingest.assume_inserts_only'); INSERT INTO config.internal_flag (name) VALUES ('serial.rematerialize_on_same_holding_code'); +CREATE OR REPLACE FUNCTION evergreen.override_internal_flag_status(flag TEXT, enabled BOOLEAN) RETURNS VOID AS $$ + my ($flag, $enabled) = @_; + $_SHARED{"internal_flag_$flag"} = $enabled; +$$ LANGUAGE PLPERLU; +COMMENT ON FUNCTION evergreen.override_internal_flag_status(TEXT, BOOLEAN) IS $$ +Set a per-session override of the enabled column of the specified config.internal_flag row. +$$; + +CREATE OR REPLACE FUNCTION evergreen.clear_internal_flag_override(flag TEXT) RETURNS VOID AS $$ + my ($flag) = @_; + delete $_SHARED{"internal_flag_$flag"}; +$$ LANGUAGE PLPERLU; +COMMENT ON FUNCTION evergreen.clear_internal_flag_override(TEXT) IS $$ +Clear the per-session override of the enabled value of the specified internal flag. +$$; + +CREATE OR REPLACE FUNCTION evergreen.internal_flag_enabled(flag TEXT) RETURNS BOOLEAN AS $$ + my $flag = shift; + return $_SHARED{"internal_flag_$flag"} if exists $_SHARED{"internal_flag_$flag"}; + my $rv = spi_exec_query("SELECT enabled FROM config.internal_flag WHERE name = '$flag'"); + if ($rv->{processed} && $rv->{rows}[0]->{enabled} eq 't') { + return 1; + } else { + return 0; + } +$$ LANGUAGE PLPERLU STABLE; +COMMENT ON FUNCTION evergreen.internal_flag_enabled(TEXT) IS $$ +Returns true if the specified internal flag exists and is set. +$$; + CREATE TABLE config.global_flag ( label TEXT NOT NULL ) INHERITS (config.internal_flag); diff --git a/Open-ILS/src/sql/Pg/011.schema.authority.sql b/Open-ILS/src/sql/Pg/011.schema.authority.sql index 1b150252e3..45301b9ce6 100644 --- a/Open-ILS/src/sql/Pg/011.schema.authority.sql +++ b/Open-ILS/src/sql/Pg/011.schema.authority.sql @@ -475,32 +475,20 @@ BEGIN moved_objects := moved_objects + 1; END LOOP; - -- 2. Grab the current value of reingest on same MARC flag - SELECT enabled INTO ingest_same - FROM config.internal_flag - WHERE name = 'ingest.reingest.force_on_same_marc' - ; - - -- 3. Temporarily set reingest on same to TRUE - UPDATE config.internal_flag - SET enabled = TRUE - WHERE name = 'ingest.reingest.force_on_same_marc' - ; - - -- 4. Make a harmless update to target_record to trigger auto-update + -- 2. Temporarily set reingest on same to TRUE + SELECT evergreen.override_internal_flag_status('ingest.reingest.force_on_same_marc', TRUE); + + -- 3. Make a harmless update to target_record to trigger auto-update -- in linked bibliographic records UPDATE authority.record_entry SET deleted = FALSE WHERE id = target_record; - -- 5. "Delete" source_record + -- 4. "Delete" source_record DELETE FROM authority.record_entry WHERE id = source_record; - -- 6. Set "reingest on same MARC" flag back to initial value - UPDATE config.internal_flag - SET enabled = ingest_same - WHERE name = 'ingest.reingest.force_on_same_marc' - ; + -- 5. Remove the override of the "reingest on same MARC" flag + SELECT evergreen.clear_internal_flag_override('ingest.reingest.force_on_same_marc'); RETURN moved_objects; END; diff --git a/Open-ILS/src/sql/Pg/030.schema.metabib.sql b/Open-ILS/src/sql/Pg/030.schema.metabib.sql index 5bcb8f8461..9fc84c0409 100644 --- a/Open-ILS/src/sql/Pg/030.schema.metabib.sql +++ b/Open-ILS/src/sql/Pg/030.schema.metabib.sql @@ -480,8 +480,7 @@ DECLARE mbe_row metabib.browse_entry%ROWTYPE; mbe_id BIGINT; BEGIN - PERFORM * FROM config.internal_flag WHERE name = 'ingest.assume_inserts_only' AND enabled; - IF NOT FOUND THEN + IF NOT evergreen.internal_flag_set('ingest.assume_inserts_only') THEN IF NOT skip_search THEN FOR fclass IN SELECT * FROM config.metabib_class LOOP -- RAISE NOTICE 'Emptying out %', fclass.name; @@ -859,8 +858,7 @@ $func$ LANGUAGE PLPGSQL; CREATE OR REPLACE FUNCTION metabib.reingest_metabib_full_rec( bib_id BIGINT ) RETURNS VOID AS $func$ BEGIN - PERFORM * FROM config.internal_flag WHERE name = 'ingest.assume_inserts_only' AND enabled; - IF NOT FOUND THEN + IF NOT evergreen.internal_flag_set('ingest.assume_inserts_only') THEN DELETE FROM metabib.real_full_rec WHERE record = bib_id; END IF; INSERT INTO metabib.real_full_rec (record, tag, ind1, ind2, subfield, value) @@ -1069,27 +1067,23 @@ BEGIN END IF; IF TG_OP = 'UPDATE' THEN -- re-ingest? - PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled; - - IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change + IF NOT evergreen.internal_flag_set('ingest.reingest.force_on_same_marc') + AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change RETURN NEW; END IF; END IF; -- Record authority linking - PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_linking' AND enabled; - IF NOT FOUND THEN + IF NOT evergreen.internal_flag_set('ingest.disable_authority_linking') THEN PERFORM biblio.map_authority_linking( NEW.id, NEW.marc ); END IF; -- Flatten and insert the mfr data - PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_full_rec' AND enabled; - IF NOT FOUND THEN + IF NOT evergreen.internal_flag_set('ingest.disable_metabib_full_rec') THEN PERFORM metabib.reingest_metabib_full_rec(NEW.id); -- Now we pull out attribute data, which is dependent on the mfr for all but XPath-based fields - PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_rec_descriptor' AND enabled; - IF NOT FOUND THEN + IF NOT evergreen.internal_flag_set('ingest.disable_metabib_rec_descriptor') THEN FOR attr_def IN SELECT * FROM config.record_attr_definition ORDER BY format LOOP IF attr_def.tag IS NOT NULL THEN -- tag (and optional subfield list) selection @@ -1181,26 +1175,22 @@ BEGIN -- Located URI magic IF TG_OP = 'INSERT' THEN - PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_located_uri' AND enabled; - IF NOT FOUND THEN + IF NOT evergreen.internal_flag_set('ingest.disable_located_uri') THEN PERFORM biblio.extract_located_uris( NEW.id, NEW.marc, NEW.editor ); END IF; ELSE - PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_located_uri' AND enabled; - IF NOT FOUND THEN + IF NOT evergreen.internal_flag_set('ingest.disable_located_uri') THEN PERFORM biblio.extract_located_uris( NEW.id, NEW.marc, NEW.editor ); END IF; END IF; -- (re)map metarecord-bib linking IF TG_OP = 'INSERT' THEN -- if not deleted and performing an insert, check for the flag - PERFORM * FROM config.internal_flag WHERE name = 'ingest.metarecord_mapping.skip_on_insert' AND enabled; - IF NOT FOUND THEN + IF NOT evergreen.internal_flag_set('ingest.metarecord_mapping.skip_on_insert') THEN PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint ); END IF; ELSE -- we're doing an update, and we're not deleted, remap - PERFORM * FROM config.internal_flag WHERE name = 'ingest.metarecord_mapping.skip_on_update' AND enabled; - IF NOT FOUND THEN + IF NOT evergreen.internal_flag_set('ingest.metarecord_mapping.skip_on_update') THEN PERFORM metabib.remap_metarecord_for_bib( NEW.id, NEW.fingerprint ); END IF; END IF; diff --git a/Open-ILS/src/sql/Pg/110.hold_matrix.sql b/Open-ILS/src/sql/Pg/110.hold_matrix.sql index be2ff6511d..4d9e7172e8 100644 --- a/Open-ILS/src/sql/Pg/110.hold_matrix.sql +++ b/Open-ILS/src/sql/Pg/110.hold_matrix.sql @@ -83,13 +83,12 @@ BEGIN SELECT INTO my_item_age age(coalesce(item_object.active_date, now())); + -- Grab the closest set circ weight setting. -- The item's owner should probably be the one determining if the item is holdable -- How to decide that is debatable. Decided to default to the circ library (where the item lives) - -- This flag will allow for setting it to the owning library (where the call number "lives") - PERFORM * FROM config.internal_flag WHERE name = 'circ.holds.weight_owner_not_circ' AND enabled; - - -- Grab the closest set circ weight setting. - IF NOT FOUND THEN + -- This circ.holds.weight_owner_not_circx flag will allow for setting it to the owning library + -- (where the call number "lives") + IF NOT evergreen.internal_flag_set('circ.holds.weight_owner_not_circ') THEN -- Default to circ library SELECT INTO weights hw.* FROM config.weight_assoc wa @@ -143,9 +142,7 @@ BEGIN -- This may be better implemented as part of the upgrade script? -- Set usr_grp = requestor_grp, requestor_grp = 1 or something when this flag is already set -- Then remove this flag, of course. - PERFORM * FROM config.internal_flag WHERE name = 'circ.holds.usr_not_requestor' AND enabled; - - IF FOUND THEN + IF evergreen.internal_flag_set('circ.holds.usr_not_requestor') THEN -- Note: This, to me, is REALLY hacky. I put it in anyway. -- If you can't tell, this is a single call swap on two variables. SELECT INTO user_object.profile, requestor_object.profile diff --git a/Open-ILS/src/sql/Pg/210.schema.serials.sql b/Open-ILS/src/sql/Pg/210.schema.serials.sql index 39fb75e057..4cc8ebe6b6 100644 --- a/Open-ILS/src/sql/Pg/210.schema.serials.sql +++ b/Open-ILS/src/sql/Pg/210.schema.serials.sql @@ -371,10 +371,9 @@ if ($_TD->{new}{holding_code} eq $_TD->{old}{holding_code}) { # ... unless the following internal flag is set. my $flag_rv = spi_exec_query(q{ - SELECT * FROM config.internal_flag - WHERE name = 'serial.rematerialize_on_same_holding_code' AND enabled + SELECT evergreen.internal_flag_set('serial.rematerialize_on_same_holding_code') }, 1); - return unless $flag_rv->{processed}; + return unless $flag_rv->{processed} and $flag_rv->{rows}[0]->{internal_flag_set} eq 't'; } diff --git a/Open-ILS/src/sql/Pg/999.functions.global.sql b/Open-ILS/src/sql/Pg/999.functions.global.sql index 02f2861482..0839dcadc8 100644 --- a/Open-ILS/src/sql/Pg/999.functions.global.sql +++ b/Open-ILS/src/sql/Pg/999.functions.global.sql @@ -1532,9 +1532,8 @@ BEGIN END IF; IF TG_OP = 'UPDATE' THEN -- re-ingest? - PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled; - - IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change + IF NOT evergreen.internal_flag_set('ingest.reingest.force_on_same_marc') + AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change RETURN NEW; END IF; @@ -1548,11 +1547,9 @@ BEGIN SELECT record, atag, value, sort_value FROM authority.simple_heading_set(NEW.marc); -- Flatten and insert the afr data - PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_full_rec' AND enabled; - IF NOT FOUND THEN + IF NOT evergreen.internal_flag_set('ingest.disable_authority_full_rec') THEN PERFORM authority.reingest_authority_full_rec(NEW.id); - PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_rec_descriptor' AND enabled; - IF NOT FOUND THEN + IF NOT evergreen.internal_flag_set('ingest.disable_authority_rec_descriptor') THEN PERFORM authority.reingest_authority_rec_descriptor(NEW.id); END IF; END IF; -- 2.11.0