]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/version-upgrade/2.11.0-2.11.1-upgrade-db.sql
Bumping version numbers, adding Upgrade Script and Changelog
[Evergreen.git] / Open-ILS / src / sql / Pg / version-upgrade / 2.11.0-2.11.1-upgrade-db.sql
1 --Upgrade Script for 2.11.0 to 2.11.1
2 \set eg_version '''2.11.1'''
3 BEGIN;
4 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.11.1', :eg_version);
5
6 SELECT evergreen.upgrade_deps_block_check('1001', :eg_version); -- stompro/gmcharlt
7
8 CREATE INDEX action_usr_circ_history_usr_idx ON action.usr_circ_history ( usr );
9
10
11 SELECT evergreen.upgrade_deps_block_check('1002', :eg_version);
12
13 -- This is a placeholder for the backport of schema update 1002
14 -- (adding es-ES to the list of locales. This script does nothing for
15 -- rel_2_11 and later.
16
17
18 SELECT evergreen.upgrade_deps_block_check('1003', :eg_version); -- gmcharlt/rhamby/csharp
19
20 CREATE OR REPLACE FUNCTION metabib.remap_metarecord_for_bib( bib_id BIGINT, fp TEXT, bib_is_deleted BOOL DEFAULT FALSE, retain_deleted BOOL DEFAULT FALSE ) RETURNS BIGINT AS $func$
21 DECLARE
22     new_mapping     BOOL := TRUE;
23     source_count    INT;
24     old_mr          BIGINT;
25     tmp_mr          metabib.metarecord%ROWTYPE;
26     deleted_mrs     BIGINT[];
27 BEGIN
28
29     -- We need to make sure we're not a deleted master record of an MR
30     IF bib_is_deleted THEN
31         FOR old_mr IN SELECT id FROM metabib.metarecord WHERE master_record = bib_id LOOP
32
33             IF NOT retain_deleted THEN -- Go away for any MR that we're master of, unless retained
34                 DELETE FROM metabib.metarecord_source_map WHERE source = bib_id;
35             END IF;
36
37             -- Now, are there any more sources on this MR?
38             SELECT COUNT(*) INTO source_count FROM metabib.metarecord_source_map WHERE metarecord = old_mr;
39
40             IF source_count = 0 AND NOT retain_deleted THEN -- No other records
41                 deleted_mrs := ARRAY_APPEND(deleted_mrs, old_mr); -- Just in case...
42                 DELETE FROM metabib.metarecord WHERE id = old_mr;
43
44             ELSE -- indeed there are. Update it with a null cache and recalcualated master record
45                 UPDATE  metabib.metarecord
46                   SET   mods = NULL,
47                         master_record = ( SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC LIMIT 1)
48                   WHERE id = old_mr;
49             END IF;
50         END LOOP;
51
52     ELSE -- insert or update
53
54         FOR tmp_mr IN SELECT m.* FROM metabib.metarecord m JOIN metabib.metarecord_source_map s ON (s.metarecord = m.id) WHERE s.source = bib_id LOOP
55
56             -- Find the first fingerprint-matching
57             IF old_mr IS NULL AND fp = tmp_mr.fingerprint THEN
58                 old_mr := tmp_mr.id;
59                 new_mapping := FALSE;
60
61             ELSE -- Our fingerprint changed ... maybe remove the old MR
62                 DELETE FROM metabib.metarecord_source_map WHERE metarecord = tmp_mr.id AND source = bib_id; -- remove the old source mapping
63                 SELECT COUNT(*) INTO source_count FROM metabib.metarecord_source_map WHERE metarecord = tmp_mr.id;
64                 IF source_count = 0 THEN -- No other records
65                     deleted_mrs := ARRAY_APPEND(deleted_mrs, tmp_mr.id);
66                     DELETE FROM metabib.metarecord WHERE id = tmp_mr.id;
67                 END IF;
68             END IF;
69
70         END LOOP;
71
72         -- we found no suitable, preexisting MR based on old source maps
73         IF old_mr IS NULL THEN
74             SELECT id INTO old_mr FROM metabib.metarecord WHERE fingerprint = fp; -- is there one for our current fingerprint?
75
76             IF old_mr IS NULL THEN -- nope, create one and grab its id
77                 INSERT INTO metabib.metarecord ( fingerprint, master_record ) VALUES ( fp, bib_id );
78                 SELECT id INTO old_mr FROM metabib.metarecord WHERE fingerprint = fp;
79
80             ELSE -- indeed there is. update it with a null cache and recalcualated master record
81                 UPDATE  metabib.metarecord
82                   SET   mods = NULL,
83                         master_record = ( SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC LIMIT 1)
84                   WHERE id = old_mr;
85             END IF;
86
87         ELSE -- there was one we already attached to, update its mods cache and master_record
88             UPDATE  metabib.metarecord
89               SET   mods = NULL,
90                     master_record = ( SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC LIMIT 1)
91               WHERE id = old_mr;
92         END IF;
93
94         IF new_mapping THEN
95             INSERT INTO metabib.metarecord_source_map (metarecord, source) VALUES (old_mr, bib_id); -- new source mapping
96         END IF;
97
98     END IF;
99
100     IF ARRAY_UPPER(deleted_mrs,1) > 0 THEN
101         UPDATE action.hold_request SET target = old_mr WHERE target IN ( SELECT unnest(deleted_mrs) ) AND hold_type = 'M'; -- if we had to delete any MRs above, make sure their holds are moved
102     END IF;
103
104     RETURN old_mr;
105
106 END;
107 $func$ LANGUAGE PLPGSQL;
108
109 COMMIT;