]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority_overlay_protection.sql
9273b805dbfde5434d8cfcc431b3cfb65b429b03
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / XXXX.schema.authority_overlay_protection.sql
1 -- Evergreen DB patch XXXX.schema.authority_overlay_protection.sql
2 --
3 -- FIXME: insert description of change, if needed
4 --
5 BEGIN;
6
7
8 -- check whether patch can be applied
9 SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
10
11 -- FIXME: add/check SQL statements to perform the upgrade
12
13 -- Function to generate an ephemeral overlay template from an authority record
14 CREATE OR REPLACE FUNCTION authority.generate_overlay_template (source_xml TEXT) RETURNS TEXT AS $f$
15 DECLARE
16     cset                INT;
17     main_entry          authority.control_set_authority_field%ROWTYPE;
18     bib_field           authority.control_set_bib_field%ROWTYPE;
19     auth_id             INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', source_xml)::INT;
20     replace_data        XML[] DEFAULT '{}'::XML[];
21     replace_rules       TEXT[] DEFAULT '{}'::TEXT[];
22     auth_field          XML[];
23 BEGIN
24     IF auth_id IS NULL THEN
25         RETURN NULL;
26     END IF;
27
28     -- Default to the LoC controll set
29     SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
30
31     -- if none, make a best guess
32     IF cset IS NULL THEN
33         SELECT  control_set INTO cset
34           FROM  authority.control_set_authority_field
35           WHERE tag IN (
36                     SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marc::XML)::TEXT[])
37                       FROM  authority.record_entry
38                       WHERE id = auth_id
39                 )
40           LIMIT 1;
41     END IF;
42
43     -- if STILL none, no-op change
44     IF cset IS NULL THEN
45         RETURN XMLELEMENT(
46             name record,
47             XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
48             XMLELEMENT( name leader, '00881nam a2200193   4500'),
49             XMLELEMENT(
50                 name datafield,
51                 XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
52                 XMLELEMENT(
53                     name subfield,
54                     XMLATTRIBUTES('d' AS code),
55                     '901c'
56                 )
57             )
58         )::TEXT;
59     END IF;
60
61     FOR main_entry IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset LOOP
62         auth_field := XPATH('//*[@tag="'||main_entry.tag||'"][1]',source_xml::XML);
63         IF ARRAY_LENGTH(auth_field,1) > 0 THEN
64             FOR bib_field IN SELECT * FROM authority.control_set_bib_field WHERE authority_field = main_entry.id LOOP
65                 replace_data := replace_data || XMLELEMENT( name datafield, XMLATTRIBUTES(bib_field.tag AS tag), XPATH('//*[local-name()="subfield"]',auth_field[1])::XML[]);
66                 replace_rules := replace_rules || ( bib_field.tag || main_entry.sf_list || E'[0~\\)' || auth_id || '$]' );
67             END LOOP;
68             EXIT;
69         END IF;
70     END LOOP;
71
72     RETURN XMLELEMENT(
73         name record,
74         XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
75         XMLELEMENT( name leader, '00881nam a2200193   4500'),
76         replace_data,
77         XMLELEMENT(
78             name datafield,
79             XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
80             XMLELEMENT(
81                 name subfield,
82                 XMLATTRIBUTES('r' AS code),
83                 ARRAY_TO_STRING(replace_rules,',')
84             )
85         )
86     )::TEXT;
87 END;
88 $f$ STABLE LANGUAGE PLPGSQL;
89
90
91
92 COMMIT;