Bug 5683 follow-up: calls to ModBiblio can still fail
authorJared Camins-Esakov <jcamins@bywatersolutions.com>
Wed, 6 Apr 2011 12:58:07 +0000 (08:58 -0400)
committerChris Cormack <chrisc@catalyst.net.nz>
Wed, 1 Jun 2011 21:04:48 +0000 (09:04 +1200)
Because C4::Charset directly manipulates the MARC::Record object, bad data has
to be cleaned in ModBiblio before the call into C4::Charset. The corrupted
records can also break the Zebra index. After this fix has been applied, it
would probably be a good idea to run the misc/maintenance/touch_all_biblios.pl
script to ensure that this problem has been cleared up.

Signed-off-by: Jared Camins-Esakov <jcamins@bywatersolutions.com>
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
C4/Biblio.pm

index c9590c2..016b53d 100755 (executable)
@@ -299,6 +299,16 @@ sub ModBiblio {
         logaction( "CATALOGUING", "MODIFY", $biblionumber, "BEFORE=>" . $newrecord->as_formatted );
     }
 
+    # Cleaning up invalid fields must be done early or SetUTF8Flag is liable to
+    # throw an exception which probably won't be handled.
+    foreach my $field ($record->fields()) {
+        if (! $field->is_control_field()) {
+            if (scalar($field->subfields()) == 0 || (scalar($field->subfields()) == 1 && $field->subfield('9'))) {
+                $record->delete_field($field);
+            }
+        }
+    }
+
     SetUTF8Flag($record);
     my $dbh = C4::Context->dbh;
 
@@ -306,14 +316,6 @@ sub ModBiblio {
 
     _strip_item_fields($record, $frameworkcode);
 
-    foreach my $field ($record->fields()) {
-        if (! $field->is_control_field()) {
-            if (scalar($field->subfields()) == 0) {
-                $record->delete_fields($field);
-            }
-        }
-    }
-
     # update biblionumber and biblioitemnumber in MARC
     # FIXME - this is assuming a 1 to 1 relationship between
     # biblios and biblioitems