Forward port 3.0.8 upgrade script
[working/Evergreen.git] / Open-ILS / src / sql / Pg / version-upgrade / 3.0.7-3.0.8-upgrade-db.sql
1 --Upgrade Script for 3.0.7 to 3.0.8
2 \set eg_version '''3.0.8'''
3 BEGIN;
4 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('3.0.8', :eg_version);
5
6 SELECT evergreen.upgrade_deps_block_check('1110', :eg_version);
7
8 DROP FUNCTION IF EXISTS unapi.biblio_record_entry_feed (BIGINT[], TEXT, TEXT[], TEXT, INT, HSTORE, HSTORE,
9                                                         BOOL, TEXT, TEXT, TEXT, TEXT, TEXT, XML);
10 DROP FUNCTION IF EXISTS unapi.metabib_virtual_record_feed (BIGINT[], TEXT, TEXT[], TEXT, INT, HSTORE, HSTORE,
11                                                            BOOL, TEXT, TEXT, TEXT, TEXT, TEXT, XML);
12
13 CREATE OR REPLACE FUNCTION unapi.biblio_record_entry_feed ( id_list BIGINT[], format TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE 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, pref_lib INT DEFAULT NULL ) RETURNS XML AS $F$
14 DECLARE
15     layout          unapi.bre_output_layout%ROWTYPE;
16     transform       config.xml_transform%ROWTYPE;
17     item_format     TEXT;
18     tmp_xml         TEXT;
19     xmlns_uri       TEXT := 'http://open-ils.org/spec/feed-xml/v1';
20     ouid            INT;
21     element_list    TEXT[];
22 BEGIN
23
24     IF org = '-' OR org IS NULL THEN
25         SELECT shortname INTO org FROM evergreen.org_top();
26     END IF;
27
28     SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
29     SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
30
31     IF layout.name IS NULL THEN
32         RETURN NULL::XML;
33     END IF;
34
35     SELECT * INTO transform FROM config.xml_transform WHERE name = layout.transform;
36     xmlns_uri := COALESCE(transform.namespace_uri,xmlns_uri);
37
38     -- Gather the bib xml
39     SELECT XMLAGG( unapi.bre(i, format, '', includes, org, depth, slimit, soffset, include_xmlns, pref_lib)) INTO tmp_xml FROM UNNEST( id_list ) i;
40
41     IF layout.title_element IS NOT NULL THEN
42         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.title_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, title;
43     END IF;
44
45     IF layout.description_element IS NOT NULL THEN
46         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.description_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, description;
47     END IF;
48
49     IF layout.creator_element IS NOT NULL THEN
50         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.creator_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, creator;
51     END IF;
52
53     IF layout.update_ts_element IS NOT NULL THEN
54         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.update_ts_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, update_ts;
55     END IF;
56
57     IF unapi_url IS NOT NULL THEN
58         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;
59     END IF;
60
61     IF header_xml IS NOT NULL THEN tmp_xml := XMLCONCAT(header_xml,tmp_xml::XML); END IF;
62
63     element_list := regexp_split_to_array(layout.feed_top,E'\\.');
64     FOR i IN REVERSE ARRAY_UPPER(element_list, 1) .. 1 LOOP
65         EXECUTE 'SELECT XMLELEMENT( name '|| quote_ident(element_list[i]) ||', XMLATTRIBUTES( $1 AS xmlns), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML;
66     END LOOP;
67
68     RETURN tmp_xml::XML;
69 END;
70 $F$ LANGUAGE PLPGSQL STABLE;
71
72 CREATE OR REPLACE FUNCTION unapi.metabib_virtual_record_feed ( id_list BIGINT[], format TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE 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, pref_lib INT DEFAULT NULL ) RETURNS XML AS $F$
73 DECLARE
74     layout          unapi.bre_output_layout%ROWTYPE;
75     transform       config.xml_transform%ROWTYPE;
76     item_format     TEXT;
77     tmp_xml         TEXT;
78     xmlns_uri       TEXT := 'http://open-ils.org/spec/feed-xml/v1';
79     ouid            INT;
80     element_list    TEXT[];
81 BEGIN
82
83     IF org = '-' OR org IS NULL THEN
84         SELECT shortname INTO org FROM evergreen.org_top();
85     END IF;
86
87     SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org;
88     SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format;
89
90     IF layout.name IS NULL THEN
91         RETURN NULL::XML;
92     END IF;
93
94     SELECT * INTO transform FROM config.xml_transform WHERE name = layout.transform;
95     xmlns_uri := COALESCE(transform.namespace_uri,xmlns_uri);
96
97     -- Gather the bib xml
98     SELECT XMLAGG( unapi.mmr(i, format, '', includes, org, depth, slimit, soffset, include_xmlns, pref_lib)) INTO tmp_xml FROM UNNEST( id_list ) i;
99
100     IF layout.title_element IS NOT NULL THEN
101         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.title_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, title;
102     END IF;
103
104     IF layout.description_element IS NOT NULL THEN
105         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.description_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, description;
106     END IF;
107
108     IF layout.creator_element IS NOT NULL THEN
109         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.creator_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, creator;
110     END IF;
111
112     IF layout.update_ts_element IS NOT NULL THEN
113         EXECUTE 'SELECT XMLCONCAT( XMLELEMENT( name '|| layout.update_ts_element ||', XMLATTRIBUTES( $1 AS xmlns), $3), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML, update_ts;
114     END IF;
115
116     IF unapi_url IS NOT NULL THEN
117         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;
118     END IF;
119
120     IF header_xml IS NOT NULL THEN tmp_xml := XMLCONCAT(header_xml,tmp_xml::XML); END IF;
121
122     element_list := regexp_split_to_array(layout.feed_top,E'\\.');
123     FOR i IN REVERSE ARRAY_UPPER(element_list, 1) .. 1 LOOP
124         EXECUTE 'SELECT XMLELEMENT( name '|| quote_ident(element_list[i]) ||', XMLATTRIBUTES( $1 AS xmlns), $2)' INTO tmp_xml USING xmlns_uri, tmp_xml::XML;
125     END LOOP;
126
127     RETURN tmp_xml::XML;
128 END;
129 $F$ LANGUAGE PLPGSQL STABLE;
130
131 COMMIT;