From 644d3aeb5d4ab5313fdcdea420b2104413f1fb32 Mon Sep 17 00:00:00 2001 From: Jason Etheridge Date: Mon, 13 May 2019 08:23:35 -0400 Subject: [PATCH] another 856$9 munger Signed-off-by: Jason Etheridge --- sql/base/base.sql | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 60 insertions(+), 0 deletions(-) diff --git a/sql/base/base.sql b/sql/base/base.sql index 97a4760..ed89709 100644 --- a/sql/base/base.sql +++ b/sql/base/base.sql @@ -4340,6 +4340,66 @@ return $marc_xml->as_xml_record(); $function$; +DROP FUNCTION IF EXISTS migration_tools.owner_change_sf9_substring_match(TEXT,TEXT,TEXT); +CREATE OR REPLACE FUNCTION migration_tools.owner_change_sf9_substring_match (marc_xml TEXT, substring_old_value TEXT, new_value TEXT, fix_indicators TEXT) + RETURNS TEXT + LANGUAGE plperlu +AS $function$ +use strict; +use warnings; + +use MARC::Record; +use MARC::File::XML (BinaryEncoding => 'utf8'); + +binmode(STDERR, ':bytes'); +binmode(STDOUT, ':utf8'); +binmode(STDERR, ':utf8'); + +my $marc_xml = shift; +my $substring_old_value = shift; +my $new_value = shift; +my $fix_indicators = shift; + +$marc_xml =~ s/(.........)./${1}a/; + +eval { + $marc_xml = MARC::Record->new_from_xml($marc_xml); +}; +if ($@) { + #elog("could not parse $bibid: $@\n"); + import MARC::File::XML (BinaryEncoding => 'utf8'); + return $marc_xml; +} + +my @uris = $marc_xml->field('856'); +return $marc_xml->as_xml_record() unless @uris; + +foreach my $field (@uris) { + my $ind1 = $field->indicator('1'); + if (defined $ind1) { + if ($ind1 ne '1' && $ind1 ne '4' && $fix_indicators eq 'true') { + $field->set_indicator(1,'4'); + } + } + my $ind2 = $field->indicator('2'); + if (defined $ind2) { + if ($ind2 ne '0' && $ind2 ne '1' && $fix_indicators eq 'true') { + $field->set_indicator(2,'0'); + } + } + if ($field->as_string('9') =~ qr/$substring_old_value/) { + $field->delete_subfield('9'); + $field->add_subfields( '9' => $new_value ); + } + $marc_xml->delete_field($field); # -- we're going to dedup and add them back +} + +my %hash = (map { ($_->as_usmarc => $_) } @uris); -- courtesy of an old Mike Rylander post :-) +$marc_xml->insert_fields_ordered( values( %hash ) ); + +return $marc_xml->as_xml_record(); + +$function$; -- strip marc tag DROP FUNCTION IF EXISTS migration_tools.strip_tag(TEXT,TEXT); CREATE OR REPLACE FUNCTION migration_tools.strip_tag(marc TEXT, tag TEXT) -- 1.7.2.5