1 -- Evergreen DB patch XXXX.schema.unapi-indb-optional-org.sql
4 -- check whether patch can be applied
5 SELECT evergreen.upgrade_deps_block_check('0653', :eg_version);
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;
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$
11 layout unapi.bre_output_layout%ROWTYPE;
12 transform config.xml_transform%ROWTYPE;
15 xmlns_uri TEXT := 'http://open-ils.org/spec/feed-xml/v1';
20 IF org = '-' OR org IS NULL THEN
21 SELECT shortname INTO org FROM evergreen.org_top();
24 SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
25 SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
27 IF layout.name IS NULL THEN
31 SELECT * INTO transform FROM config.xml_transform WHERE name = layout.transform;
32 xmlns_uri := COALESCE(transform.namespace_uri,xmlns_uri);
35 SELECT XMLAGG( unapi.bre(i, format, '', includes, org, depth, slimit, soffset, include_xmlns)) INTO tmp_xml FROM UNNEST( id_list ) i;
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;
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;
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;
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;
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;
57 IF header_xml IS NOT NULL THEN tmp_xml := XMLCONCAT(header_xml,tmp_xml::XML); END IF;
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;
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$
70 me biblio.record_entry%ROWTYPE;
71 layout unapi.bre_output_layout%ROWTYPE;
72 xfrm config.xml_transform%ROWTYPE;
81 IF org = '-' OR org IS NULL THEN
82 SELECT shortname INTO org FROM evergreen.org_top();
85 SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
91 IF format = 'holdings_xml' THEN -- the special case
92 output := unapi.holdings_xml( obj_id, ouid, org, depth, includes, slimit, soffset, include_xmlns);
96 SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
98 IF layout.name IS NULL THEN
102 SELECT * INTO xfrm FROM config.xml_transform WHERE name = layout.transform;
104 SELECT * INTO me FROM biblio.record_entry WHERE id = obj_id;
106 -- grab SVF if we need them
107 IF ('mra' = ANY (includes)) THEN
108 axml := unapi.mra(obj_id,NULL,NULL,NULL,NULL);
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);
121 -- generate our item node
124 IF format = 'marcxml' THEN
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');
130 tmp_xml := oils_xslt_process(me.marc, xfrm.xslt)::XML;
133 top_el := REGEXP_REPLACE(tmp_xml, E'^.*?<((?:\\S+:)?' || layout.holdings_element || ').*$', E'\\1');
135 IF axml IS NOT NULL THEN
136 tmp_xml := REGEXP_REPLACE(tmp_xml, '</' || top_el || '>(.*?)$', axml || '</' || top_el || E'>\\1');
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');
143 IF ('bre.unapi' = ANY (includes)) THEN
144 output := REGEXP_REPLACE(
146 '</' || top_el || '>(.*?)',
150 'http://www.w3.org/1999/xhtml' AS xmlns,
152 'tag:open-ils.org:U2@bre/' || obj_id || '/' || org AS title
154 )::TEXT || '</' || top_el || E'>\\1'
160 output := REGEXP_REPLACE(output::TEXT,E'>\\s+<','><','gs')::XML;
163 $F$ LANGUAGE PLPGSQL;