]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/version-upgrade/2.0.1-2.0.2-upgrade-db.sql
Merge branch 'master' of git.evergreen-ils.org:Evergreen-DocBook into doc_consolidati...
[Evergreen.git] / Open-ILS / src / sql / Pg / version-upgrade / 2.0.1-2.0.2-upgrade-db.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('2.0.2');
4 INSERT INTO config.upgrade_log (version) VALUES ('0484'); -- miker
5
6 DROP FUNCTION asset.metarecord_copy_count ( INT, BIGINT, BOOL );
7 DROP FUNCTION asset.record_copy_count ( INT, BIGINT, BOOL );
8
9 DROP FUNCTION asset.opac_ou_record_copy_count (INT, BIGINT);
10 CREATE OR REPLACE FUNCTION asset.opac_ou_record_copy_count (org INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
11 DECLARE
12     ans RECORD;
13     trans INT;
14 BEGIN
15     SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = rid;
16
17     FOR ans IN SELECT u.id, t.depth FROM actor.org_unit_ancestors(org) AS u JOIN actor.org_unit_type t ON (u.ou_type = t.id) LOOP
18         RETURN QUERY
19         SELECT  ans.depth,
20                 ans.id,
21                 COUNT( av.id ),
22                 SUM( CASE WHEN cp.status IN (0,7,12) THEN 1 ELSE 0 END ),
23                 COUNT( av.id ),
24                 trans
25           FROM  
26                 actor.org_unit_descendants(ans.id) d
27                 JOIN asset.opac_visible_copies av ON (av.record = rid AND av.circ_lib = d.id)
28                 JOIN asset.copy cp ON (cp.id = av.id)
29           GROUP BY 1,2,6;
30
31         IF NOT FOUND THEN
32             RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
33         END IF;
34
35     END LOOP;
36
37     RETURN;
38 END;
39 $f$ LANGUAGE PLPGSQL;
40
41 DROP FUNCTION asset.opac_lasso_record_copy_count (INT, BIGINT);
42 CREATE OR REPLACE FUNCTION asset.opac_lasso_record_copy_count (i_lasso INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
43 DECLARE
44     ans RECORD;
45     trans INT;
46 BEGIN
47     SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = rid;
48
49     FOR ans IN SELECT u.org_unit AS id FROM actor.org_lasso_map AS u WHERE lasso = i_lasso LOOP
50         RETURN QUERY
51         SELECT  -1,
52                 ans.id,
53                 COUNT( av.id ),
54                 SUM( CASE WHEN cp.status IN (0,7,12) THEN 1 ELSE 0 END ),
55                 COUNT( av.id ),
56                 trans
57           FROM  
58                 actor.org_unit_descendants(ans.id) d
59                 JOIN asset.opac_visible_copies av ON (av.record = rid AND av.circ_lib = d.id)
60                 JOIN asset.copy cp ON (cp.id = av.id)
61           GROUP BY 1,2,6;
62
63         IF NOT FOUND THEN
64             RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
65         END IF;
66
67     END LOOP;
68
69     RETURN;
70 END;
71 $f$ LANGUAGE PLPGSQL;
72
73 DROP FUNCTION asset.staff_ou_record_copy_count (INT, BIGINT);
74 CREATE OR REPLACE FUNCTION asset.staff_ou_record_copy_count (org INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
75 DECLARE
76     ans RECORD;
77     trans INT;
78 BEGIN
79     SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = rid;
80
81     FOR ans IN SELECT u.id, t.depth FROM actor.org_unit_ancestors(org) AS u JOIN actor.org_unit_type t ON (u.ou_type = t.id) LOOP
82         RETURN QUERY
83         SELECT  ans.depth,
84                 ans.id,
85                 COUNT( cp.id ),
86                 SUM( CASE WHEN cp.status IN (0,7,12) THEN 1 ELSE 0 END ),
87                 COUNT( cp.id ),
88                 trans
89           FROM
90                 actor.org_unit_descendants(ans.id) d
91                 JOIN asset.copy cp ON (cp.circ_lib = d.id)
92                 JOIN asset.call_number cn ON (cn.record = rid AND cn.id = cp.call_number)
93           GROUP BY 1,2,6;
94
95         IF NOT FOUND THEN
96             RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
97         END IF;
98
99     END LOOP;
100
101     RETURN;
102 END;
103 $f$ LANGUAGE PLPGSQL;
104
105 DROP FUNCTION asset.staff_lasso_record_copy_count (INT, BIGINT);
106 CREATE OR REPLACE FUNCTION asset.staff_lasso_record_copy_count (i_lasso INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
107 DECLARE
108     ans RECORD;
109     trans INT;
110 BEGIN
111     SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = rid;
112
113     FOR ans IN SELECT u.org_unit AS id FROM actor.org_lasso_map AS u WHERE lasso = i_lasso LOOP
114         RETURN QUERY
115         SELECT  -1,
116                 ans.id,
117                 COUNT( cp.id ),
118                 SUM( CASE WHEN cp.status IN (0,7,12) THEN 1 ELSE 0 END ),
119                 COUNT( cp.id ),
120                 trans
121           FROM
122                 actor.org_unit_descendants(ans.id) d
123                 JOIN asset.copy cp ON (cp.circ_lib = d.id)
124                 JOIN asset.call_number cn ON (cn.record = rid AND cn.id = cp.call_number)
125           GROUP BY 1,2,6;
126
127         IF NOT FOUND THEN
128             RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
129         END IF;
130
131     END LOOP;
132
133     RETURN;
134 END;
135 $f$ LANGUAGE PLPGSQL;
136
137 CREATE OR REPLACE FUNCTION asset.record_copy_count ( place INT, rid BIGINT, staff BOOL) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
138 BEGIN
139     IF staff IS TRUE THEN
140         IF place > 0 THEN
141             RETURN QUERY SELECT * FROM asset.staff_ou_record_copy_count( place, rid );
142         ELSE
143             RETURN QUERY SELECT * FROM asset.staff_lasso_record_copy_count( -place, rid );
144         END IF;
145     ELSE
146         IF place > 0 THEN
147             RETURN QUERY SELECT * FROM asset.opac_ou_record_copy_count( place, rid );
148         ELSE
149             RETURN QUERY SELECT * FROM asset.opac_lasso_record_copy_count( -place, rid );
150         END IF;
151     END IF;
152
153     RETURN;
154 END;
155 $f$ LANGUAGE PLPGSQL;
156
157 DROP FUNCTION asset.opac_ou_metarecord_copy_count (INT, BIGINT);
158 CREATE OR REPLACE FUNCTION asset.opac_ou_metarecord_copy_count (org INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
159 DECLARE
160     ans RECORD;
161     trans INT;
162 BEGIN
163     SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = rid;
164
165     FOR ans IN SELECT u.id, t.depth FROM actor.org_unit_ancestors(org) AS u JOIN actor.org_unit_type t ON (u.ou_type = t.id) LOOP
166         RETURN QUERY
167         SELECT  ans.depth,
168                 ans.id,
169                 COUNT( av.id ),
170                 SUM( CASE WHEN cp.status IN (0,7,12) THEN 1 ELSE 0 END ),
171                 COUNT( av.id ),
172                 trans
173           FROM
174                 actor.org_unit_descendants(ans.id) d
175                 JOIN asset.opac_visible_copies av ON (av.record = rid AND av.circ_lib = d.id)
176                 JOIN asset.copy cp ON (cp.id = av.id)
177                 JOIN metabib.metarecord_source_map m ON (m.source = av.record)
178           GROUP BY 1,2,6;
179
180         IF NOT FOUND THEN
181             RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
182         END IF;
183
184     END LOOP;
185
186     RETURN;
187 END;
188 $f$ LANGUAGE PLPGSQL;
189
190 DROP FUNCTION asset.opac_lasso_metarecord_copy_count (INT, BIGINT);
191 CREATE OR REPLACE FUNCTION asset.opac_lasso_metarecord_copy_count (i_lasso INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
192 DECLARE
193     ans RECORD;
194     trans INT;
195 BEGIN
196     SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = rid;
197
198     FOR ans IN SELECT u.org_unit AS id FROM actor.org_lasso_map AS u WHERE lasso = i_lasso LOOP
199         RETURN QUERY
200         SELECT  -1,
201                 ans.id,
202                 COUNT( av.id ),
203                 SUM( CASE WHEN cp.status IN (0,7,12) THEN 1 ELSE 0 END ),
204                 COUNT( av.id ),
205                 trans
206           FROM
207                 actor.org_unit_descendants(ans.id) d
208                 JOIN asset.opac_visible_copies av ON (av.record = rid AND av.circ_lib = d.id)
209                 JOIN asset.copy cp ON (cp.id = av.id)
210                 JOIN metabib.metarecord_source_map m ON (m.source = av.record)
211           GROUP BY 1,2,6;
212
213         IF NOT FOUND THEN
214             RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
215         END IF;
216
217     END LOOP;
218
219     RETURN;
220 END;
221 $f$ LANGUAGE PLPGSQL;
222
223 DROP FUNCTION asset.staff_ou_metarecord_copy_count (INT, BIGINT);
224 CREATE OR REPLACE FUNCTION asset.staff_ou_metarecord_copy_count (org INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
225 DECLARE
226     ans RECORD;
227     trans INT;
228 BEGIN
229     SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = rid;
230
231     FOR ans IN SELECT u.id, t.depth FROM actor.org_unit_ancestors(org) AS u JOIN actor.org_unit_type t ON (u.ou_type = t.id) LOOP
232         RETURN QUERY
233         SELECT  ans.depth,
234                 ans.id,
235                 COUNT( cp.id ),
236                 SUM( CASE WHEN cp.status IN (0,7,12) THEN 1 ELSE 0 END ),
237                 COUNT( cp.id ),
238                 trans
239           FROM
240                 actor.org_unit_descendants(ans.id) d
241                 JOIN asset.copy cp ON (cp.circ_lib = d.id)
242                 JOIN asset.call_number cn ON (cn.record = rid AND cn.id = cp.call_number)
243                 JOIN metabib.metarecord_source_map m ON (m.source = cn.record)
244           GROUP BY 1,2,6;
245
246         IF NOT FOUND THEN
247             RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
248         END IF;
249
250     END LOOP;
251
252     RETURN;
253 END;
254 $f$ LANGUAGE PLPGSQL;
255
256 DROP FUNCTION asset.staff_lasso_metarecord_copy_count (INT, BIGINT);
257 CREATE OR REPLACE FUNCTION asset.staff_lasso_metarecord_copy_count (i_lasso INT, rid BIGINT) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
258 DECLARE
259     ans RECORD;
260     trans INT;
261 BEGIN
262     SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = rid;
263
264     FOR ans IN SELECT u.org_unit AS id FROM actor.org_lasso_map AS u WHERE lasso = i_lasso LOOP
265         RETURN QUERY
266         SELECT  -1,
267                 ans.id,
268                 COUNT( cp.id ),
269                 SUM( CASE WHEN cp.status IN (0,7,12) THEN 1 ELSE 0 END ),
270                 COUNT( cp.id ),
271                 trans
272           FROM
273                 actor.org_unit_descendants(ans.id) d
274                 JOIN asset.copy cp ON (cp.circ_lib = d.id)
275                 JOIN asset.call_number cn ON (cn.record = rid AND cn.id = cp.call_number)
276                 JOIN metabib.metarecord_source_map m ON (m.source = cn.record)
277           GROUP BY 1,2,6;
278
279         IF NOT FOUND THEN
280             RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans;
281         END IF;
282
283     END LOOP;
284
285     RETURN;
286 END;
287 $f$ LANGUAGE PLPGSQL;
288
289 CREATE OR REPLACE FUNCTION asset.metarecord_copy_count ( place INT, rid BIGINT, staff BOOL) RETURNS TABLE (depth INT, org_unit INT, visible BIGINT, available BIGINT, unshadow BIGINT, transcendant INT) AS $f$
290 BEGIN
291     IF staff IS TRUE THEN
292         IF place > 0 THEN
293             RETURN QUERY SELECT * FROM asset.staff_ou_metarecord_copy_count( place, rid );
294         ELSE
295             RETURN QUERY SELECT * FROM asset.staff_lasso_metarecord_copy_count( -place, rid );
296         END IF;
297     ELSE
298         IF place > 0 THEN
299             RETURN QUERY SELECT * FROM asset.opac_ou_metarecord_copy_count( place, rid );
300         ELSE
301             RETURN QUERY SELECT * FROM asset.opac_lasso_metarecord_copy_count( -place, rid );
302         END IF;
303     END IF;
304
305     RETURN;
306 END;
307 $f$ LANGUAGE PLPGSQL;
308
309 INSERT INTO config.upgrade_log (version) VALUES ('0485'); -- dbs
310
311 CREATE OR REPLACE VIEW reporter.simple_record AS
312 SELECT  r.id,
313         s.metarecord,
314         r.fingerprint,
315         r.quality,
316         r.tcn_source,
317         r.tcn_value,
318         title.value AS title,
319         uniform_title.value AS uniform_title,
320         author.value AS author,
321         publisher.value AS publisher,
322         SUBSTRING(pubdate.value FROM $$\d+$$) AS pubdate,
323         series_title.value AS series_title,
324         series_statement.value AS series_statement,
325         summary.value AS summary,
326         ARRAY_ACCUM( DISTINCT REPLACE(SUBSTRING(isbn.value FROM $$^\S+$$), '-', '') ) AS isbn,
327         ARRAY_ACCUM( DISTINCT REGEXP_REPLACE(issn.value, E'^\\S*(\\d{4})[-\\s](\\d{3,4}x?)', E'\\1 \\2') ) AS issn,
328         ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '650' AND subfield = 'a' AND record = r.id)) AS topic_subject,
329         ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '651' AND subfield = 'a' AND record = r.id)) AS geographic_subject,
330         ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '655' AND subfield = 'a' AND record = r.id)) AS genre,
331         ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '600' AND subfield = 'a' AND record = r.id)) AS name_subject,
332         ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '610' AND subfield = 'a' AND record = r.id)) AS corporate_subject,
333         ARRAY((SELECT value FROM metabib.full_rec WHERE tag = '856' AND subfield IN ('3','y','u') AND record = r.id ORDER BY CASE WHEN subfield IN ('3','y') THEN 0 ELSE 1 END)) AS external_uri
334   FROM  biblio.record_entry r
335         JOIN metabib.metarecord_source_map s ON (s.source = r.id)
336         LEFT JOIN metabib.full_rec uniform_title ON (r.id = uniform_title.record AND uniform_title.tag = '240' AND uniform_title.subfield = 'a')
337         LEFT JOIN metabib.full_rec title ON (r.id = title.record AND title.tag = '245' AND title.subfield = 'a')
338         LEFT JOIN metabib.full_rec author ON (r.id = author.record AND author.tag = '100' AND author.subfield = 'a')
339         LEFT JOIN metabib.full_rec publisher ON (r.id = publisher.record AND publisher.tag = '260' AND publisher.subfield = 'b')
340         LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND pubdate.tag = '260' AND pubdate.subfield = 'c')
341         LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
342         LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
343         LEFT JOIN metabib.full_rec series_title ON (r.id = series_title.record AND series_title.tag IN ('830','440') AND series_title.subfield = 'a')
344         LEFT JOIN metabib.full_rec series_statement ON (r.id = series_statement.record AND series_statement.tag = '490' AND series_statement.subfield = 'a')
345         LEFT JOIN metabib.full_rec summary ON (r.id = summary.record AND summary.tag = '520' AND summary.subfield = 'a')
346   GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14;
347
348 CREATE OR REPLACE VIEW reporter.old_super_simple_record AS
349 SELECT  r.id,
350     r.fingerprint,
351     r.quality,
352     r.tcn_source,
353     r.tcn_value,
354     FIRST(title.value) AS title,
355     FIRST(author.value) AS author,
356     ARRAY_TO_STRING(ARRAY_ACCUM( DISTINCT publisher.value), ', ') AS publisher,
357     ARRAY_TO_STRING(ARRAY_ACCUM( DISTINCT SUBSTRING(pubdate.value FROM $$\d+$$) ), ', ') AS pubdate,
358     ARRAY_ACCUM( DISTINCT REPLACE(SUBSTRING(isbn.value FROM $$^\S+$$), '-', '') ) AS isbn,
359     ARRAY_ACCUM( DISTINCT REGEXP_REPLACE(issn.value, E'^\\S*(\\d{4})[-\\s](\\d{3,4}x?)', E'\\1 \\2') ) AS issn
360   FROM  biblio.record_entry r
361     LEFT JOIN metabib.full_rec title ON (r.id = title.record AND title.tag = '245' AND title.subfield = 'a')
362     LEFT JOIN metabib.full_rec author ON (r.id = author.record AND author.tag IN ('100','110','111') AND author.subfield = 'a')
363     LEFT JOIN metabib.full_rec publisher ON (r.id = publisher.record AND publisher.tag = '260' AND publisher.subfield = 'b')
364     LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND pubdate.tag = '260' AND pubdate.subfield = 'c')
365     LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
366     LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
367   GROUP BY 1,2,3,4,5;
368
369 -- Update reporter.materialized_simple_record with normalized ISBN values
370 -- This might not get all of them, but most ISBNs will have more than one hyphen
371 DELETE FROM reporter.materialized_simple_record WHERE id IN (
372     SELECT record FROM metabib.full_rec WHERE tag = '020' AND subfield IN ('a', 'z') AND value LIKE '%-%-%'
373 );
374
375 INSERT INTO reporter.materialized_simple_record
376     SELECT DISTINCT rossr.* FROM reporter.old_super_simple_record rossr INNER JOIN metabib.full_rec mfr ON mfr.record = rossr.id
377         WHERE mfr.tag = '020' AND mfr.subfield IN ('a', 'z') AND mfr.value LIKE '%-%-%'
378 ;
379
380 INSERT INTO config.upgrade_log (version) VALUES ('0488'); -- dbs
381
382 CREATE OR REPLACE FUNCTION maintain_901 () RETURNS TRIGGER AS $func$
383 DECLARE
384     use_id_for_tcn BOOLEAN;
385 BEGIN
386     -- Remove any existing 901 fields before we insert the authoritative one
387     NEW.marc := REGEXP_REPLACE(NEW.marc, E'<datafield\s*[^<>]*?\s*tag="901".+?</datafield>', '', 'g');
388
389     IF TG_TABLE_SCHEMA = 'biblio' THEN
390         -- Set TCN value to record ID?
391         SELECT enabled FROM config.global_flag INTO use_id_for_tcn
392             WHERE name = 'cat.bib.use_id_for_tcn';
393
394         IF use_id_for_tcn = 't' THEN
395             NEW.tcn_value := NEW.id;
396         END IF;
397
398         NEW.marc := REGEXP_REPLACE(
399             NEW.marc,
400             E'(</(?:[^:]*?:)?record>)',
401             E'<datafield tag="901" ind1=" " ind2=" ">' ||
402                 '<subfield code="a">' || NEW.tcn_value || E'</subfield>' ||
403                 '<subfield code="b">' || NEW.tcn_source || E'</subfield>' ||
404                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
405                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
406                 CASE WHEN NEW.owner IS NOT NULL THEN '<subfield code="o">' || NEW.owner || E'</subfield>' ELSE '' END ||
407                 CASE WHEN NEW.share_depth IS NOT NULL THEN '<subfield code="d">' || NEW.share_depth || E'</subfield>' ELSE '' END ||
408              E'</datafield>\\1'
409         );
410     ELSIF TG_TABLE_SCHEMA = 'authority' THEN
411         NEW.marc := REGEXP_REPLACE(
412             NEW.marc,
413             E'(</(?:[^:]*?:)?record>)',
414             E'<datafield tag="901" ind1=" " ind2=" ">' ||
415                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
416                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
417              E'</datafield>\\1'
418         );
419     ELSIF TG_TABLE_SCHEMA = 'serial' THEN
420         NEW.marc := REGEXP_REPLACE(
421             NEW.marc,
422             E'(</(?:[^:]*?:)?record>)',
423             E'<datafield tag="901" ind1=" " ind2=" ">' ||
424                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
425                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
426                 '<subfield code="o">' || NEW.owning_lib || E'</subfield>' ||
427                 CASE WHEN NEW.record IS NOT NULL THEN '<subfield code="r">' || NEW.record || E'</subfield>' ELSE '' END ||
428              E'</datafield>\\1'
429         );
430     ELSE
431         NEW.marc := REGEXP_REPLACE(
432             NEW.marc,
433             E'(</(?:[^:]*?:)?record>)',
434             E'<datafield tag="901" ind1=" " ind2=" ">' ||
435                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
436                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
437              E'</datafield>\\1'
438         );
439     END IF;
440
441     RETURN NEW;
442 END;
443 $func$ LANGUAGE PLPGSQL;
444
445 COMMIT;