3 SELECT evergreen.upgrade_deps_block_check('0988', :eg_version);
5 CREATE OR REPLACE FUNCTION evergreen.maintain_901 () RETURNS TRIGGER AS $func$
8 use MARC::File::XML (BinaryEncoding => 'UTF-8');
11 use Unicode::Normalize;
13 MARC::Charset->assume_unicode(1);
15 my $schema = $_TD->{table_schema};
16 my $marc = MARC::Record->new_from_xml($_TD->{new}{marc});
18 my @old901s = $marc->field('901');
19 $marc->delete_fields(@old901s);
21 if ($schema eq 'biblio') {
22 my $tcn_value = $_TD->{new}{tcn_value};
24 # Set TCN value to record ID?
25 my $id_as_tcn = spi_exec_query("
27 FROM config.global_flag
28 WHERE name = 'cat.bib.use_id_for_tcn'
30 if (($id_as_tcn->{processed}) && $id_as_tcn->{rows}[0]->{enabled} eq 't') {
31 $tcn_value = $_TD->{new}{id};
32 $_TD->{new}{tcn_value} = $tcn_value;
35 my $new_901 = MARC::Field->new("901", " ", " ",
37 "b" => $_TD->{new}{tcn_source},
38 "c" => $_TD->{new}{id},
42 if ($_TD->{new}{owner}) {
43 $new_901->add_subfields("o" => $_TD->{new}{owner});
46 if ($_TD->{new}{share_depth}) {
47 $new_901->add_subfields("d" => $_TD->{new}{share_depth});
50 if ($_TD->{new}{source}) {
51 my $plan = spi_prepare('
53 FROM config.bib_source
57 spi_exec_prepared($plan, {limit => 1}, $_TD->{new}{source})->{rows}[0]{source};
59 $new_901->add_subfields("s" => $source_name) if $source_name;
62 $marc->append_fields($new_901);
63 } elsif ($schema eq 'authority') {
64 my $new_901 = MARC::Field->new("901", " ", " ",
65 "c" => $_TD->{new}{id},
68 $marc->append_fields($new_901);
69 } elsif ($schema eq 'serial') {
70 my $new_901 = MARC::Field->new("901", " ", " ",
71 "c" => $_TD->{new}{id},
73 "o" => $_TD->{new}{owning_lib},
76 if ($_TD->{new}{record}) {
77 $new_901->add_subfields("r" => $_TD->{new}{record});
80 $marc->append_fields($new_901);
82 my $new_901 = MARC::Field->new("901", " ", " ",
83 "c" => $_TD->{new}{id},
86 $marc->append_fields($new_901);
89 my $xml = $marc->as_xml_record();
91 $xml =~ s/^<\?xml.+\?\s*>//go;
92 $xml =~ s/>\s+</></go;
95 # Embed a version of OpenILS::Application::AppUtils->entityize()
96 # to avoid having to set PERL5LIB for PostgreSQL as well
100 # Convert raw ampersands to entities
101 $xml =~ s/&(?!\S+;)/&/gso;
103 # Convert Unicode characters to entities
104 $xml =~ s/([\x{0080}-\x{fffd}])/sprintf('&#x%X;',ord($1))/sgoe;
106 $xml =~ s/[\x00-\x1f]//go;
107 $_TD->{new}{marc} = $xml;
110 $func$ LANGUAGE PLPERLU;
114 \qecho Now running an update to set the 901$s for bibliographic
115 \qecho records that have a source set. This may take a while.
117 \qecho The update can be cancelled now \qecho and run later
118 \qecho using the following SQL statement:
120 \qecho UPDATE biblio.record_entry SET id = id WHERE source IS NOT NULL;
122 UPDATE biblio.record_entry SET id = id WHERE source IS NOT NULL;