allow per-session overriding of internal flags user/gmcharlt/internal_flag
authorGalen Charlton <gmc@esilibrary.com>
Wed, 10 Oct 2012 21:11:25 +0000 (17:11 -0400)
committerGalen Charlton <gmc@esilibrary.com>
Wed, 10 Oct 2012 21:26:44 +0000 (17:26 -0400)
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 <gmc@esilibrary.com>
Open-ILS/src/sql/Pg/002.schema.config.sql
Open-ILS/src/sql/Pg/011.schema.authority.sql
Open-ILS/src/sql/Pg/030.schema.metabib.sql
Open-ILS/src/sql/Pg/110.hold_matrix.sql
Open-ILS/src/sql/Pg/210.schema.serials.sql
Open-ILS/src/sql/Pg/999.functions.global.sql

index e1f8381..e419ff7 100644 (file)
@@ -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);
index 1b15025..45301b9 100644 (file)
@@ -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;
index 5bcb8f8..9fc84c0 100644 (file)
@@ -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;
index be2ff65..4d9e717 100644 (file)
@@ -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
index 39fb75e..4cc8ebe 100644 (file)
@@ -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';
 }
 
 
index 02f2861..0839dca 100644 (file)
@@ -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;