]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0726.schema.fix_maintain_901_regex.sql
LP#1842940: Improve Alert
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0726.schema.fix_maintain_901_regex.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0726', :eg_version); -- denials
4
5 CREATE OR REPLACE FUNCTION evergreen.maintain_901 () RETURNS TRIGGER AS $func$
6 use strict;
7 use MARC::Record;
8 use MARC::File::XML (BinaryEncoding => 'UTF-8');
9 use MARC::Charset;
10 use Encode;
11 use Unicode::Normalize;
12
13 MARC::Charset->assume_unicode(1);
14
15 my $schema = $_TD->{table_schema};
16 my $marc = MARC::Record->new_from_xml($_TD->{new}{marc});
17
18 my @old901s = $marc->field('901');
19 $marc->delete_fields(@old901s);
20
21 if ($schema eq 'biblio') {
22     my $tcn_value = $_TD->{new}{tcn_value};
23
24     # Set TCN value to record ID?
25     my $id_as_tcn = spi_exec_query("
26         SELECT enabled
27         FROM config.global_flag
28         WHERE name = 'cat.bib.use_id_for_tcn'
29     ");
30     if (($id_as_tcn->{processed}) && $id_as_tcn->{rows}[0]->{enabled} eq 't') {
31         $tcn_value = $_TD->{new}{id}; 
32     }
33
34     my $new_901 = MARC::Field->new("901", " ", " ",
35         "a" => $tcn_value,
36         "b" => $_TD->{new}{tcn_source},
37         "c" => $_TD->{new}{id},
38         "t" => $schema
39     );
40
41     if ($_TD->{new}{owner}) {
42         $new_901->add_subfields("o" => $_TD->{new}{owner});
43     }
44
45     if ($_TD->{new}{share_depth}) {
46         $new_901->add_subfields("d" => $_TD->{new}{share_depth});
47     }
48
49     $marc->append_fields($new_901);
50 } elsif ($schema eq 'authority') {
51     my $new_901 = MARC::Field->new("901", " ", " ",
52         "c" => $_TD->{new}{id},
53         "t" => $schema,
54     );
55     $marc->append_fields($new_901);
56 } elsif ($schema eq 'serial') {
57     my $new_901 = MARC::Field->new("901", " ", " ",
58         "c" => $_TD->{new}{id},
59         "t" => $schema,
60         "o" => $_TD->{new}{owning_lib},
61     );
62
63     if ($_TD->{new}{record}) {
64         $new_901->add_subfields("r" => $_TD->{new}{record});
65     }
66
67     $marc->append_fields($new_901);
68 } else {
69     my $new_901 = MARC::Field->new("901", " ", " ",
70         "c" => $_TD->{new}{id},
71         "t" => $schema,
72     );
73     $marc->append_fields($new_901);
74 }
75
76 my $xml = $marc->as_xml_record();
77 $xml =~ s/\n//sgo;
78 $xml =~ s/^<\?xml.+\?\s*>//go;
79 $xml =~ s/>\s+</></go;
80 $xml =~ s/\p{Cc}//go;
81
82 # Embed a version of OpenILS::Application::AppUtils->entityize()
83 # to avoid having to set PERL5LIB for PostgreSQL as well
84
85 # If we are going to convert non-ASCII characters to XML entities,
86 # we had better be dealing with a UTF8 string to begin with
87 $xml = decode_utf8($xml);
88
89 $xml = NFC($xml);
90
91 # Convert raw ampersands to entities
92 $xml =~ s/&(?!\S+;)/&amp;/gso;
93
94 # Convert Unicode characters to entities
95 $xml =~ s/([\x{0080}-\x{fffd}])/sprintf('&#x%X;',ord($1))/sgoe;
96
97 $xml =~ s/[\x00-\x1f]//go;
98 $_TD->{new}{marc} = $xml;
99
100 return "MODIFY";
101 $func$ LANGUAGE PLPERLU;
102
103 COMMIT;