Bug 5683 follow-up: calls to ModBiblio can still fail

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>
(cherry picked from commit 5bbfb94f43)

Signed-off-by: Chris Nighswonger <chris.nighswonger@gmail.com>
This commit is contained in:
Jared Camins-Esakov 2011-04-06 08:58:07 -04:00 committed by Chris Nighswonger
parent 905d24a9e0
commit fae6bd6892
1 changed files with 10 additions and 8 deletions

View File

@ -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