m_insert_tag for kmig
[migration-tools.git] / kmig.d / sql / init / 030-marc_functions.sql
1
2 -- pass it the biblionumber, the position of the character to start in the leader starting at 0 
3 -- and the text to replace, single characer or multiple 
4 DROP FUNCTION IF EXISTS m_update_leader;
5 DELIMITER $
6 CREATE FUNCTION
7    m_update_leader(bnumber INTEGER, ldr_position SMALLINT, new_value TEXT)
8    RETURNS BOOLEAN
9    DETERMINISTIC
10     BEGIN
11         DECLARE ldr TEXT COLLATE utf8mb4_unicode_ci DEFAULT NULL;
12         DECLARE new_value_length SMALLINT DEFAULT 1;
13         SET ldr_position = ldr_position + 1;
14         SET new_value_length = LENGTH(new_value);
15         
16         SELECT ExtractValue(metadata, '//leader') INTO ldr FROM biblio_metadata WHERE biblionumber = bnumber;
17         SET ldr = INSERT(ldr,ldr_position,new_value_length,new_value);
18         SET ldr = CONCAT('<leader>',ldr,'</leader>');
19
20         UPDATE biblio_metadata SET metadata = UpdateXML(metadata, '//leader', ldr) where biblionumber = bnumber;
21         RETURN TRUE;
22         
23     END
24 $
25 DELIMITER ;
26
27 -- pass it the biblionumber and the 003 value (MARC org code) and it'll set the 003
28 -- to the passed value for the referenced bib
29 DROP FUNCTION IF EXISTS m_update_003;
30 DELIMITER $
31 CREATE FUNCTION
32    m_update_003(bnumber INTEGER, marc_org_code TEXT COLLATE utf8mb4_unicode_ci)
33    RETURNS BOOLEAN
34    DETERMINISTIC
35     BEGIN
36         DECLARE ldr TEXT COLLATE utf8mb4_unicode_ci DEFAULT NULL;
37         DECLARE tag003_count INT DEFAULT NULL;
38         DECLARE marcxml TEXT COLLATE utf8mb4_unicode_ci DEFAULT NULL;
39
40         SELECT metadata INTO marcxml FROM biblio_metadata WHERE biblionumber = bnumber;
41         SELECT ExtractValue(metadata,'//leader') INTO ldr FROM biblio_metadata WHERE biblionumber = bnumber;
42         SELECT ExtractValue(metadata,'count(//controlfield[@tag="003"])') INTO tag003_count FROM biblio_metadata WHERE biblionumber = bnumber;
43
44         IF NULLIF(ldr,'') IS NULL THEN -- we need a leader
45             RETURN FALSE;
46         END IF;
47
48         IF tag003_count > 1 THEN -- we need one or zero of these; it shouldn't be repeatable
49             RETURN FALSE;
50         END IF;
51
52         -- handle 003 (insert or edit)
53         IF tag003_count = 0 THEN
54             SET marcxml = UpdateXML(
55                 marcxml,
56                 '//leader',
57                 CONCAT(
58                     '<leader>',ldr,'</leader>\n',
59                     '  <controlfield tag="003">',marc_org_code,'</controlfield>'
60                 )
61             );
62         ELSE
63             SET marcxml = UpdateXML(
64                 marcxml,
65                 '//controlfield[@tag="003"]',
66                 CONCAT(
67                     '<controlfield tag="003">',marc_org_code,'</controlfield>'
68                 )
69             );
70         END IF;
71
72         UPDATE biblio_metadata SET metadata = marcxml where biblionumber = bnumber;
73         RETURN TRUE;
74
75     END
76 $
77 DELIMITER ;
78
79 -- Pass it the biblionumber, tag number, subfield, value and it'll add a MARC field to the end of the record accordingly
80 -- Be sure to escape the value if needed
81 -- Example: SELECT m_insert_tag(1,'909','a','foo');
82 DROP FUNCTION IF EXISTS m_insert_tag;
83 DELIMITER $
84 CREATE FUNCTION
85    m_insert_tag(bnumber INTEGER, tag TEXT COLLATE utf8mb4_unicode_ci, subfield TEXT COLLATE utf8mb4_unicode_ci, value TEXT COLLATE utf8mb4_unicode_ci)
86    RETURNS BOOLEAN
87    DETERMINISTIC
88     BEGIN
89         DECLARE marcxml TEXT COLLATE utf8mb4_unicode_ci DEFAULT NULL;
90
91         SELECT metadata INTO marcxml FROM biblio_metadata WHERE biblionumber = bnumber;
92
93         IF NULLIF(marcxml,'') IS NULL THEN -- whaaa?
94             RETURN FALSE;
95         END IF;
96
97         SET marcxml = replace(marcxml,'</record>',
98             CONCAT(
99                  '  <datafield tag="'
100                 ,tag
101                 ,'">\n    <subfield code="'
102                 ,subfield
103                 ,'">'
104                 ,value
105                 ,'</subfield>\n  </datafield>\n'
106                 ,'</record>'
107             )
108         );
109
110         UPDATE biblio_metadata SET metadata = marcxml where biblionumber = bnumber;
111         RETURN TRUE;
112
113     END
114 $
115 DELIMITER ;