]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0335.schema.maintain_901_xmlns.sql
LP#1117808: Stamping upgrade scripts for extend use of merge profiles
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0335.schema.maintain_901_xmlns.sql
1 BEGIN;
2
3 -- Some records manage to get XML namespace declarations into each element,
4 -- like <datafield xmlns:marc="http://www.loc.gov/MARC21/slim"
5 -- This broke the old maintain_901(), so we'll make the regex more robust
6
7 INSERT INTO config.upgrade_log (version) VALUES ('0335'); -- dbs
8
9 CREATE OR REPLACE FUNCTION maintain_901 () RETURNS TRIGGER AS $func$
10 BEGIN
11     -- Remove any existing 901 fields before we insert the authoritative one
12     NEW.marc := REGEXP_REPLACE(NEW.marc, E'<datafield\s*[^<>]*?\s*tag="901".+?</datafield>', '', 'g');
13     IF TG_TABLE_SCHEMA = 'biblio' THEN
14         NEW.marc := REGEXP_REPLACE(
15             NEW.marc,
16             E'(</(?:[^:]*?:)?record>)',
17             E'<datafield tag="901" ind1=" " ind2=" ">' ||
18                 '<subfield code="a">' || NEW.tcn_value || E'</subfield>' ||
19                 '<subfield code="b">' || NEW.tcn_source || E'</subfield>' ||
20                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
21                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
22                 CASE WHEN NEW.owner IS NOT NULL THEN '<subfield code="o">' || NEW.owner || E'</subfield>' ELSE '' END ||
23                 CASE WHEN NEW.share_depth IS NOT NULL THEN '<subfield code="d">' || NEW.share_depth || E'</subfield>' ELSE '' END ||
24              E'</datafield>\\1'
25         );
26     ELSIF TG_TABLE_SCHEMA = 'authority' THEN
27         NEW.marc := REGEXP_REPLACE(
28             NEW.marc,
29             E'(</(?:[^:]*?:)?record>)',
30             E'<datafield tag="901" ind1=" " ind2=" ">' ||
31                 '<subfield code="a">' || NEW.arn_value || E'</subfield>' ||
32                 '<subfield code="b">' || NEW.arn_source || E'</subfield>' ||
33                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
34                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
35              E'</datafield>\\1'
36         );
37     ELSIF TG_TABLE_SCHEMA = 'serial' THEN
38         NEW.marc := REGEXP_REPLACE(
39             NEW.marc,
40             E'(</(?:[^:]*?:)?record>)',
41             E'<datafield tag="901" ind1=" " ind2=" ">' ||
42                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
43                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
44                 '<subfield code="o">' || NEW.owning_lib || E'</subfield>' ||
45                 CASE WHEN NEW.record IS NOT NULL THEN '<subfield code="r">' || NEW.record || E'</subfield>' ELSE '' END ||
46              E'</datafield>\\1'
47         );
48     ELSE
49         NEW.marc := REGEXP_REPLACE(
50             NEW.marc,
51             E'(</(?:[^:]*?:)?record>)',
52             E'<datafield tag="901" ind1=" " ind2=" ">' ||
53                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
54                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
55              E'</datafield>\\1'
56         );
57     END IF;
58
59     RETURN NEW;
60 END;
61 $func$ LANGUAGE PLPGSQL;
62
63 COMMIT;