From ce849240ad67131ead68f4339f49e861c6719882 Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Wed, 20 Apr 2011 17:34:47 -0400 Subject: [PATCH] bug 5579: tweaks to bulkmarcimport.pl Fixes bug where a bib record imported by bulkmarcimport.pl could become unindexable by ensuring that ModBiblioMarc() is always called by bulkmarcimport.pl to finalize saving the bib record (as it was initially created by AddBiblio with the defer_marc_save option). Also introduces a utility routine, C4::Biblio::_strip_item_fields. Signed-off-by: Galen Charlton Signed-off-by: Chris Cormack --- C4/Biblio.pm | 41 +++++++++++++++++--------- misc/migration_tools/bulkmarcimport.pl | 3 ++ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/C4/Biblio.pm b/C4/Biblio.pm index 9c7ec848eb..0ac9ffd520 100755 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -304,15 +304,7 @@ sub ModBiblio { $frameworkcode = "" unless $frameworkcode; - # get the items before and append them to the biblio before updating the record, atm we just have the biblio - my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode ); - - # delete any item fields from incoming record to avoid - # duplication or incorrect data - use AddItem() or ModItem() - # to change items - foreach my $field ( $record->field($itemtag) ) { - $record->delete_field($field); - } + _strip_item_fields($record, $frameworkcode); foreach my $field ($record->fields()) { if (! $field->is_control_field()) { @@ -346,6 +338,29 @@ sub ModBiblio { return 1; } +=head2 _strip_item_fields + + _strip_item_fields($record, $frameworkcode) + +Utility routine to remove item tags from a +MARC bib. + +=cut + +sub _strip_item_fields { + my $record = shift; + my $frameworkcode = shift; + # get the items before and append them to the biblio before updating the record, atm we just have the biblio + my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode ); + + # delete any item fields from incoming record to avoid + # duplication or incorrect data - use AddItem() or ModItem() + # to change items + foreach my $field ( $record->field($itemtag) ) { + $record->delete_field($field); + } +} + =head2 ModBiblioframework ModBiblioframework($biblionumber,$frameworkcode); @@ -2650,17 +2665,15 @@ per the bib's MARC framework. sub EmbedItemsInMarcBiblio { my ($marc, $biblionumber) = @_; - my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField('items.itemnumber', GetFrameworkCode($biblionumber)); - # delete any fields already in the record that use the item tag - foreach my $field ( $marc->field($itemtag) ) { - $marc->delete_field($field); - } + my $frameworkcode = GetFrameworkCode($biblionumber); + _strip_item_fields($marc, $frameworkcode); # ... and embed the current items my $dbh = C4::Context->dbh; my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ?"); $sth->execute($biblionumber); my @item_fields; + my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode ); while (my ($itemnumber) = $sth->fetchrow_array) { my $item_marc = C4::Items::GetMarcItem($biblionumber, $itemnumber); push @item_fields, $item_marc->field($itemtag); diff --git a/misc/migration_tools/bulkmarcimport.pl b/misc/migration_tools/bulkmarcimport.pl index ddfa5e0a96..4f738e896d 100755 --- a/misc/migration_tools/bulkmarcimport.pl +++ b/misc/migration_tools/bulkmarcimport.pl @@ -323,10 +323,13 @@ RECORD: while ( ) { printlog({id=>$id||$originalid||$biblionumber, op=>"insertitem",status=>"ERROR"}) if ($logfile); # if we failed because of an exception, assume that # the MARC columns in biblioitems were not set. + C4::Biblio::_strip_item_fields($record, ''); ModBiblioMarc( $record, $biblionumber, '' ); next RECORD; } else{ + C4::Biblio::_strip_item_fields($record, ''); + ModBiblioMarc( $record, $biblionumber, '' ); # need to call because of defer_marc_save printlog({id=>$id||$originalid||$biblionumber, op=>"insert",status=>"ok"}) if ($logfile); } if ($#{ $errors_ref } > -1) { -- 2.39.2