]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0509.schema.better_maintain_901.sql
LP#1206936 - Fix wrong billing info in money.transaction_billing_summary
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0509.schema.better_maintain_901.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0509'); -- gmc
4
5 CREATE OR REPLACE FUNCTION evergreen.xml_escape(str TEXT) RETURNS text AS $$
6     SELECT REPLACE(REPLACE(REPLACE($1,
7        '&', '&'),
8        '<', '&lt;'),
9        '>', '&gt;');
10 $$ LANGUAGE SQL IMMUTABLE;
11
12 CREATE OR REPLACE FUNCTION maintain_901 () RETURNS TRIGGER AS $func$
13 DECLARE
14     use_id_for_tcn BOOLEAN;
15 BEGIN
16     -- Remove any existing 901 fields before we insert the authoritative one
17     NEW.marc := REGEXP_REPLACE(NEW.marc, E'<datafield[^>]*?tag="901".+?</datafield>', '', 'g');
18
19     IF TG_TABLE_SCHEMA = 'biblio' THEN
20         -- Set TCN value to record ID?
21         SELECT enabled FROM config.global_flag INTO use_id_for_tcn
22             WHERE name = 'cat.bib.use_id_for_tcn';
23
24         IF use_id_for_tcn = 't' THEN
25             NEW.tcn_value := NEW.id;
26         END IF;
27
28         NEW.marc := REGEXP_REPLACE(
29             NEW.marc,
30             E'(</(?:[^:]*?:)?record>)',
31             E'<datafield tag="901" ind1=" " ind2=" ">' ||
32                 '<subfield code="a">' || evergreen.xml_escape(NEW.tcn_value) || E'</subfield>' ||
33                 '<subfield code="b">' || evergreen.xml_escape(NEW.tcn_source) || E'</subfield>' ||
34                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
35                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
36                 CASE WHEN NEW.owner IS NOT NULL THEN '<subfield code="o">' || NEW.owner || E'</subfield>' ELSE '' END ||
37                 CASE WHEN NEW.share_depth IS NOT NULL THEN '<subfield code="d">' || NEW.share_depth || E'</subfield>' ELSE '' END ||
38              E'</datafield>\\1'
39         );
40     ELSIF TG_TABLE_SCHEMA = 'authority' THEN
41         NEW.marc := REGEXP_REPLACE(
42             NEW.marc,
43             E'(</(?:[^:]*?:)?record>)',
44             E'<datafield tag="901" ind1=" " ind2=" ">' ||
45                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
46                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
47              E'</datafield>\\1'
48         );
49     ELSIF TG_TABLE_SCHEMA = 'serial' THEN
50         NEW.marc := REGEXP_REPLACE(
51             NEW.marc,
52             E'(</(?:[^:]*?:)?record>)',
53             E'<datafield tag="901" ind1=" " ind2=" ">' ||
54                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
55                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
56                 '<subfield code="o">' || NEW.owning_lib || E'</subfield>' ||
57                 CASE WHEN NEW.record IS NOT NULL THEN '<subfield code="r">' || NEW.record || E'</subfield>' ELSE '' END ||
58              E'</datafield>\\1'
59         );
60     ELSE
61         NEW.marc := REGEXP_REPLACE(
62             NEW.marc,
63             E'(</(?:[^:]*?:)?record>)',
64             E'<datafield tag="901" ind1=" " ind2=" ">' ||
65                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
66                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
67              E'</datafield>\\1'
68         );
69     END IF;
70
71     RETURN NEW;
72 END;
73 $func$ LANGUAGE PLPGSQL;
74
75 COMMIT;