X-Git-Url: http://git.equinoxoli.org/?p=migration-tools.git;a=blobdiff_plain;f=sql%2Fbase%2Fbase.sql;h=0e6c24afffaf40f591a932c9d4e148b932602491;hp=f9fe57eeb1a5473aeb9cdf42ec8953175ff3c8c1;hb=2463e7151e631cb22c8032053ba246bcb7da59e7;hpb=7754bb8efebb2ffda7406f2d0d736b6377ba589b diff --git a/sql/base/base.sql b/sql/base/base.sql index f9fe57e..0e6c24a 100644 --- a/sql/base/base.sql +++ b/sql/base/base.sql @@ -3543,6 +3543,27 @@ CREATE OR REPLACE FUNCTION migration_tools.get_marc_tags (TEXT, TEXT, TEXT, TEXT return \@texts; $$ LANGUAGE PLPERLU STABLE; +CREATE OR REPLACE FUNCTION migration_tools.get_marc_tags_filtered (TEXT, TEXT, TEXT, TEXT, TEXT) RETURNS TEXT[] AS $$ + my ($marcxml, $tag, $subfield, $delimiter, $match) = @_; + + use MARC::Record; + use MARC::File::XML; + use MARC::Field; + + my @fields; + eval { + my $marc = MARC::Record->new_from_xml($marcxml, 'UTF-8'); + @fields = $marc->field($tag); + }; + my @texts; + foreach my $field (@fields) { + if ($field->as_string() =~ qr/$match/) { + push @texts, $field->as_string($subfield,$delimiter); + } + } + return \@texts; +$$ LANGUAGE PLPERLU STABLE; + CREATE OR REPLACE FUNCTION migration_tools.find_hold_matrix_matchpoint (INTEGER) RETURNS INTEGER AS $$ SELECT action.find_hold_matrix_matchpoint( (SELECT pickup_lib FROM action.hold_request WHERE id = $1), @@ -4340,7 +4361,7 @@ return $marc_xml->as_xml_record(); $function$; -DROP FUNCTION IF EXISTS migration_tools.owner_change_sf9_substring_match(TEXT,TEXT,TEXT); +DROP FUNCTION IF EXISTS migration_tools.owner_change_sf9_substring_match(TEXT,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 @@ -4400,6 +4421,75 @@ $marc_xml->insert_fields_ordered( values( %hash ) ); return $marc_xml->as_xml_record(); $function$; + +DROP FUNCTION IF EXISTS migration_tools.owner_change_sf9_substring_match2(TEXT,TEXT,TEXT,TEXT,TEXT); +CREATE OR REPLACE FUNCTION migration_tools.owner_change_sf9_substring_match2 (marc_xml TEXT, qualifying_match 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 $qualifying_match = 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 @unqualified_uris = $marc_xml->field('856'); +my @uris = (); +foreach my $field (@unqualified_uris) { + if ($field->as_string() =~ qr/$qualifying_match/) { + push @uris, $field; + } +} +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)