LP 1502152: Improve marc_export warnings.
authorJason Stephenson <jstephenson@mvlc.org>
Mon, 5 Oct 2015 16:35:37 +0000 (12:35 -0400)
committerGalen Charlton <gmc@esilibrary.com>
Wed, 4 Nov 2015 21:51:35 +0000 (21:51 +0000)
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 <jstephenson@mvlc.org>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
Open-ILS/src/support-scripts/marc_export.in

index 70a659f..ef841e1 100755 (executable)
@@ -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();
                 }
             }