]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0517.schema.multiple-9s-in-856.sql
LP#1178377: Make bib source optional element from unapi.bre
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0517.schema.multiple-9s-in-856.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0517'); --miker
4
5 CREATE OR REPLACE FUNCTION biblio.extract_located_uris( bib_id BIGINT, marcxml TEXT, editor_id INT ) RETURNS VOID AS $func$
6 DECLARE
7     uris            TEXT[];
8     uri_xml         TEXT;
9     uri_label       TEXT;
10     uri_href        TEXT;
11     uri_use         TEXT;
12     uri_owner_list  TEXT[];
13     uri_owner       TEXT;
14     uri_owner_id    INT;
15     uri_id          INT;
16     uri_cn_id       INT;
17     uri_map_id      INT;
18 BEGIN
19
20     uris := oils_xpath('//*[@tag="856" and (@ind1="4" or @ind1="1") and (@ind2="0" or @ind2="1")]',marcxml);
21     IF ARRAY_UPPER(uris,1) > 0 THEN
22         FOR i IN 1 .. ARRAY_UPPER(uris, 1) LOOP
23             -- First we pull info out of the 856
24             uri_xml     := uris[i];
25
26             uri_href    := (oils_xpath('//*[@code="u"]/text()',uri_xml))[1];
27             uri_label   := (oils_xpath('//*[@code="y"]/text()|//*[@code="3"]/text()|//*[@code="u"]/text()',uri_xml))[1];
28             uri_use     := (oils_xpath('//*[@code="z"]/text()|//*[@code="2"]/text()|//*[@code="n"]/text()|//*[@code="u"]/text()',uri_xml))[1];
29             CONTINUE WHEN uri_href IS NULL OR uri_label IS NULL;
30
31             -- Get the distinct list of libraries wanting to use 
32             SELECT  ARRAY_ACCUM(
33                         DISTINCT REGEXP_REPLACE(
34                             x,
35                             $re$^.*?\((\w+)\).*$$re$,
36                             E'\\1'
37                         )
38                     ) INTO uri_owner_list
39               FROM  UNNEST(
40                         oils_xpath(
41                             '//*[@code="9"]/text()|//*[@code="w"]/text()|//*[@code="n"]/text()',
42                             uri_xml
43                         )
44                     )x;
45
46             IF ARRAY_UPPER(uri_owner_list,1) > 0 THEN
47
48                 -- look for a matching uri
49                 SELECT id INTO uri_id FROM asset.uri WHERE label = uri_label AND href = uri_href AND use_restriction = uri_use AND active;
50                 IF NOT FOUND THEN -- create one
51                     INSERT INTO asset.uri (label, href, use_restriction) VALUES (uri_label, uri_href, uri_use);
52                     SELECT id INTO uri_id FROM asset.uri WHERE label = uri_label AND href = uri_href AND use_restriction = uri_use AND active;
53                 END IF;
54
55                 FOR j IN 1 .. ARRAY_UPPER(uri_owner_list, 1) LOOP
56                     uri_owner := uri_owner_list[j];
57
58                     SELECT id INTO uri_owner_id FROM actor.org_unit WHERE shortname = uri_owner;
59                     CONTINUE WHEN NOT FOUND;
60
61                     -- we need a call number to link through
62                     SELECT id INTO uri_cn_id FROM asset.call_number WHERE owning_lib = uri_owner_id AND record = bib_id AND label = '##URI##' AND NOT deleted;
63                     IF NOT FOUND THEN
64                         INSERT INTO asset.call_number (owning_lib, record, create_date, edit_date, creator, editor, label)
65                             VALUES (uri_owner_id, bib_id, 'now', 'now', editor_id, editor_id, '##URI##');
66                         SELECT id INTO uri_cn_id FROM asset.call_number WHERE owning_lib = uri_owner_id AND record = bib_id AND label = '##URI##' AND NOT deleted;
67                     END IF;
68
69                     -- now, link them if they're not already
70                     SELECT id INTO uri_map_id FROM asset.uri_call_number_map WHERE call_number = uri_cn_id AND uri = uri_id;
71                     IF NOT FOUND THEN
72                         INSERT INTO asset.uri_call_number_map (call_number, uri) VALUES (uri_cn_id, uri_id);
73                     END IF;
74
75                 END LOOP;
76
77             END IF;
78
79         END LOOP;
80     END IF;
81
82     RETURN;
83 END;
84 $func$ LANGUAGE PLPGSQL;
85
86 COMMIT;
87