]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0653.schema.unapi-indb-optional-org.sql
Update permission name to match existing ones
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0653.schema.unapi-indb-optional-org.sql
1 -- Evergreen DB patch XXXX.schema.unapi-indb-optional-org.sql
2 BEGIN;
3
4 -- check whether patch can be applied
5 SELECT evergreen.upgrade_deps_block_check('0653', :eg_version);
6
7 CREATE OR REPLACE FUNCTION evergreen.org_top() RETURNS SETOF actor.org_unit AS $$ SELECT * FROM actor.org_unit WHERE parent_ou IS NULL LIMIT 1; $$ LANGUAGE SQL ROWS 1;
8
9 CREATE OR REPLACE FUNCTION unapi.biblio_record_entry_feed ( id_list BIGINT[], format TEXT, includes TEXT[], org TEXT DEFAULT '-', depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE, title TEXT DEFAULT NULL, description TEXT DEFAULT NULL, creator TEXT DEFAULT NULL, update_ts TEXT DEFAULT NULL, unapi_url TEXT DEFAULT NULL, header_xml XML DEFAULT NULL ) RETURNS XML AS $F$
10 DECLARE
11     layout          unapi.bre_output_layout%ROWTYPE;
12     transform       config.xml_transform%ROWTYPE;
13     item_format     TEXT;
14     tmp_xml         TEXT;
15     xmlns_uri       TEXT := 'http://open-ils.org/spec/feed-xml/v1';
16     ouid            INT;
17     element_list    TEXT[];
18 BEGIN
19
20     IF org = '-' OR org IS NULL THEN
21         SELECT shortname INTO org FROM evergreen.org_top();
22     END IF;
23
24     SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
25     SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
26
27     IF layout.name IS NULL THEN
28         RETURN NULL::XML;
29     END IF;
30
31     SELECT * INTO transform FROM config.xml_transform WHERE name = layout.transform;
32     xmlns_uri := COALESCE(transform.namespace_uri,xmlns_uri);
33
34     -- Gather the bib xml
35     SELECT XMLAGG( unapi.bre(i, format, '', includes, org, depth, slimit, soffset, include_xmlns)) INTO tmp_xml FROM UNNEST( id_list ) i;
36
37     IF layout.title_element IS NOT NULL THEN
38         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.title_element ||', CASE WHEN $4 THEN XMLATTRIBUTES( $1 AS xmlns) ELSE NULL END, $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, title, include_xmlns;
39     END IF;
40
41     IF layout.description_element IS NOT NULL THEN
42         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.description_element ||', CASE WHEN $4 THEN XMLATTRIBUTES( $1 AS xmlns) ELSE NULL END, $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, description, include_xmlns;
43     END IF;
44
45     IF layout.creator_element IS NOT NULL THEN
46         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.creator_element ||', CASE WHEN $4 THEN XMLATTRIBUTES( $1 AS xmlns) ELSE NULL END, $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, creator, include_xmlns;
47     END IF;
48
49     IF layout.update_ts_element IS NOT NULL THEN
50         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.update_ts_element ||', CASE WHEN $4 THEN XMLATTRIBUTES( $1 AS xmlns) ELSE NULL END, $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, update_ts, include_xmlns;
51     END IF;
52
53     IF unapi_url IS NOT NULL THEN
54         EXECUTE $$SELECT XMLCONCAT( XMLELEMENT( name link, XMLATTRIBUTES( 'http://www.w3.org/1999/xhtml' AS xmlns, 'unapi-server' AS rel, $1 AS href, 'unapi' AS title)), $2)$$ INTO tmp_xml USING unapi_url, tmp_xml::XML;
55     END IF;
56
57     IF header_xml IS NOT NULL THEN tmp_xml := XMLCONCAT(header_xml,tmp_xml::XML); END IF;
58
59     element_list := regexp_split_to_array(layout.feed_top,E'\\.');
60     FOR i IN REVERSE ARRAY_UPPER(element_list, 1) .. 1 LOOP
61         EXECUTE 'SELECT XMLELEMENT( name '|| quote_ident(element_list[i]) ||', CASE WHEN $4 THEN XMLATTRIBUTES( $1 AS xmlns) ELSE NULL END, $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, include_xmlns;
62     END LOOP;
63
64     RETURN tmp_xml::XML;
65 END;
66 $F$ LANGUAGE PLPGSQL;
67
68 CREATE OR REPLACE FUNCTION unapi.bre ( obj_id BIGINT, format TEXT,  ename TEXT, includes TEXT[], org TEXT DEFAULT '-', depth INT DEFAULT NULL, slimit INT DEFAULT NULL, soffset INT DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$
69 DECLARE
70     me      biblio.record_entry%ROWTYPE;
71     layout  unapi.bre_output_layout%ROWTYPE;
72     xfrm    config.xml_transform%ROWTYPE;
73     ouid    INT;
74     tmp_xml TEXT;
75     top_el  TEXT;
76     output  XML;
77     hxml    XML;
78     axml    XML;
79 BEGIN
80
81     IF org = '-' OR org IS NULL THEN
82         SELECT shortname INTO org FROM evergreen.org_top();
83     END IF;
84
85     SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
86
87     IF ouid IS NULL THEN
88         RETURN NULL::XML;
89     END IF;
90
91     IF format = 'holdings_xml' THEN -- the special case
92         output := unapi.holdings_xml( obj_id, ouid, org, depth, includes, slimit, soffset, include_xmlns);
93         RETURN output;
94     END IF;
95
96     SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
97
98     IF layout.name IS NULL THEN
99         RETURN NULL::XML;
100     END IF;
101
102     SELECT * INTO xfrm FROM config.xml_transform WHERE name = layout.transform;
103
104     SELECT * INTO me FROM biblio.record_entry WHERE id = obj_id;
105
106     -- grab SVF if we need them
107     IF ('mra' = ANY (includes)) THEN 
108         axml := unapi.mra(obj_id,NULL,NULL,NULL,NULL);
109     ELSE
110         axml := NULL::XML;
111     END IF;
112
113     -- grab hodlings if we need them
114     IF ('holdings_xml' = ANY (includes)) THEN 
115         hxml := unapi.holdings_xml(obj_id, ouid, org, depth, evergreen.array_remove_item_by_value(includes,'holdings_xml'), slimit, soffset, include_xmlns);
116     ELSE
117         hxml := NULL::XML;
118     END IF;
119
120
121     -- generate our item node
122
123
124     IF format = 'marcxml' THEN
125         tmp_xml := me.marc;
126         IF tmp_xml !~ E'<marc:' THEN -- If we're not using the prefixed namespace in this record, then remove all declarations of it
127            tmp_xml := REGEXP_REPLACE(tmp_xml, ' xmlns:marc="http://www.loc.gov/MARC21/slim"', '', 'g');
128         END IF; 
129     ELSE
130         tmp_xml := oils_xslt_process(me.marc, xfrm.xslt)::XML;
131     END IF;
132
133     top_el := REGEXP_REPLACE(tmp_xml, E'^.*?<((?:\\S+:)?' || layout.holdings_element || ').*$', E'\\1');
134
135     IF axml IS NOT NULL THEN 
136         tmp_xml := REGEXP_REPLACE(tmp_xml, '</' || top_el || '>(.*?)$', axml || '</' || top_el || E'>\\1');
137     END IF;
138
139     IF hxml IS NOT NULL THEN -- XXX how do we configure the holdings position?
140         tmp_xml := REGEXP_REPLACE(tmp_xml, '</' || top_el || '>(.*?)$', hxml || '</' || top_el || E'>\\1');
141     END IF;
142
143     IF ('bre.unapi' = ANY (includes)) THEN 
144         output := REGEXP_REPLACE(
145             tmp_xml,
146             '</' || top_el || '>(.*?)',
147             XMLELEMENT(
148                 name abbr,
149                 XMLATTRIBUTES(
150                     'http://www.w3.org/1999/xhtml' AS xmlns,
151                     'unapi-id' AS class,
152                     'tag:open-ils.org:U2@bre/' || obj_id || '/' || org AS title
153                 )
154             )::TEXT || '</' || top_el || E'>\\1'
155         );
156     ELSE
157         output := tmp_xml;
158     END IF;
159
160     output := REGEXP_REPLACE(output::TEXT,E'>\\s+<','><','gs')::XML;
161     RETURN output;
162 END;
163 $F$ LANGUAGE PLPGSQL;
164
165
166
167 COMMIT;