From cf4410e4e6678e374ef716f708d6b6ac3567d0ab Mon Sep 17 00:00:00 2001 From: Jason Stephenson Date: Mon, 5 Oct 2015 12:35:37 -0400 Subject: [PATCH] LP 1502152: Improve marc_export warnings. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Trap warnings from MARC libraries in marc_export so we can report the id of the record that triggered the warning. Use warn to print our warnings, instead of print STDERR. This includes the existing errors, trapped by eval, that were being printed to STDERR. To test ------- [1] Ensure that a record has an error that would become apparent during export. An easy way to do this is to insert the "‡" character in the contents of a subfield, then use --encoding MARC8 when exporting the record. [2] Run the MARC export, e.g., cat id_list | marc_export -i > /tmp/bibs.mrc [3] Verify that a warning is reported, e.g., Warning from bibliographic record 1: no mapping found at position 0... Signed-off-by: Jason Stephenson Signed-off-by: Galen Charlton --- Open-ILS/src/support-scripts/marc_export.in | 56 +++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/Open-ILS/src/support-scripts/marc_export.in b/Open-ILS/src/support-scripts/marc_export.in index 70a659f8e8..ef841e1bcb 100755 --- a/Open-ILS/src/support-scripts/marc_export.in +++ b/Open-ILS/src/support-scripts/marc_export.in @@ -419,13 +419,17 @@ sub next { if ($Marque::config->option_value('mfhd') && $self->{mfhds} && @{$self->{mfhds}}) { $r = shift(@{$self->{mfhds}}); eval { + local $SIG{__WARN__} = sub { + my $message = "Warning from serial record " . $r->id() . ": " + . shift; + warn($message); + }; $marc = MARC::Record->new_from_xml($r->marc(), $Marque::config->option_value('encoding'), $Marque::config->option_value('format')); }; if ($@) { - print STDERR "Error in serial record " . $r->id() . "\n"; - print STDERR "$@\n"; + warn("Error in serial record " . $r->id() . ": $@"); import MARC::File::XML; # Reset SAX Parser. return $self->next(); } @@ -437,13 +441,17 @@ sub next { $output = OpenSRF::Utils::JSON->perl2JSON($r); } else { eval { + local $SIG{__WARN__} = sub { + my $message = "Warning from bibliographic record " . $r->id() . ": " + . shift; + warn($message); + }; $marc = MARC::Record->new_from_xml($r->marc(), $Marque::config->option_value('encoding'), $Marque::config->option_value('format')); }; if ($@) { - print STDERR "Error in bibliograpic record " . $r->id() . "\n"; - print STDERR "$@\n"; + warn("Error in bibliograpic record " . $r->id() . ": $@"); import MARC::File::XML; # Reset SAX Parser. return $self->next(); } @@ -510,21 +518,29 @@ sub next { } if ($Marque::config->option_value('format') eq 'XML') { eval { + local $SIG{__WARN__} = sub { + my $message = "Warning from bibliographic record " . $r->id() . ": " + . shift; + warn($message); + }; $output = $marc->as_xml_record; $output =~ s/^<\?.+?\?>$//mo; }; if ($@) { - print STDERR "Error in bibliograpic record " . $r->id() . "\n"; - print STDERR "$@\n"; + warn("Error in bibliograpic record " . $r->id() . ": $@"); return $self->next(); } } else { eval { + local $SIG{__WARN__} = sub { + my $message = "Warning from bibliographic record " . $r->id() . ": " + . shift; + warn($message); + }; $output = $marc->as_usmarc; }; if ($@) { - print STDERR "Error in bibliograpic record " . $r->id() . "\n"; - print STDERR "$@\n"; + warn("Error in bibliograpic record " . $r->id() . ": $@"); return $self->next(); } } @@ -730,13 +746,17 @@ sub next { } else { my $marc; eval { + local $SIG{__WARN__} = sub { + my $message = "Warning from authority record " . $r->id() . ": " + . shift; + warn($message); + }; $marc = MARC::Record->new_from_xml($r->marc(), $Marque::config->option_value('encoding'), $Marque::config->option_value('format')); }; if ($@) { - print STDERR "Error in authority record " . $r->id() . "\n"; - print STDERR "$@\n"; + warn("Error in authority record " . $r->id() . ": $@"); import MARC::File::XML; # Reset SAX Parser. return $self->next(); } @@ -770,21 +790,29 @@ sub next { } if ($Marque::config->option_value('format') eq 'XML') { eval { + local $SIG{__WARN__} = sub { + my $message = "Warning from authority record " . $r->id() . ": " + . shift; + warn($message); + }; $output = $marc->as_xml_record; $output =~ s/^<\?.+?\?>$//mo; }; if ($@) { - print STDERR "Error in authority record " . $r->id() . "\n"; - print STDERR "$@\n"; + warn("Error in authority record " . $r->id() . ": $@"); return $self->next(); } } else { eval { + local $SIG{__WARN__} = sub { + my $message = "Warning from authority record " . $r->id() . ": " + . shift; + warn($message); + }; $output = $marc->as_usmarc; }; if ($@) { - print STDERR "Error in authority record " . $r->id() . "\n"; - print STDERR "$@\n"; + warn("Error in authority record " . $r->id() . ": $@"); return $self->next(); } } -- 2.11.0