From 93beb943c0a247925f01ec609ff6c86d67ba0d02 Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Thu, 20 Dec 2007 17:13:16 -0600 Subject: [PATCH] bug 1661: rebuild_zebra.pl changes [1] Use File::Temp to create and manage export directory if -d is not specified. [2] Added usage message. [3] Code that attempts to fix up Zebra configuration files changed so that it is invoked only if --munge-config option is supplied; this code will ultimately either be removed or moved to a separate script -- the sorts of errors that it tries to fix should no longer be appearing in a standard install. [4] Fixed Win32 portability problem when removing temporary directory. Signed-off-by: Chris Cormack Signed-off-by: Joshua Ferraro --- misc/migration_tools/rebuild_zebra.pl | 732 +++++++++++++++----------- 1 file changed, 410 insertions(+), 322 deletions(-) diff --git a/misc/migration_tools/rebuild_zebra.pl b/misc/migration_tools/rebuild_zebra.pl index 02f50b7b30..82f6a05c5f 100755 --- a/misc/migration_tools/rebuild_zebra.pl +++ b/misc/migration_tools/rebuild_zebra.pl @@ -1,11 +1,14 @@ #!/usr/bin/perl +use strict; + use C4::Context; use Getopt::Long; +use File::Temp; +use File::Path; use C4::Biblio; use C4::AuthoritiesMarc; -use strict; # # script that checks zebradir structure & create directories & mandatory files if needed # @@ -22,17 +25,37 @@ my $reset; my $biblios; my $authorities; my $noxml; -GetOptions( +my $do_munge; +my $want_help; +my $result = GetOptions( 'd:s' => \$directory, 'reset' => \$reset, 's' => \$skip_export, 'k' => \$keep_export, 'b' => \$biblios, 'noxml' => \$noxml, + 'munge-config' => \$do_munge, 'a' => \$authorities, - ); + 'h|help' => \$want_help, +); + + +if (not $result or $want_help) { + print_usage(); + exit 0; +} -$directory = "export" unless $directory; +if (not $biblios and not $authorities) { + my $msg = "Must specify -b or -a to reindex bibs or authorites\n"; + $msg .= "Please do '$0 --help' to see usage.\n"; + die $msg; +} + +my $use_tempdir = 0; +unless ($directory) { + $use_tempdir = 1; + $directory = File::Temp->newdir(CLEANUP => ($keep_export ? 0 : 1)); +} my $biblioserverdir = C4::Context->zebraconfig('biblioserver')->{directory}; @@ -43,14 +66,383 @@ my $dbh = C4::Context->dbh; my ($biblionumbertagfield,$biblionumbertagsubfield) = &GetMarcFromKohaField("biblio.biblionumber",""); my ($biblioitemnumbertagfield,$biblioitemnumbertagsubfield) = &GetMarcFromKohaField("biblioitems.biblioitemnumber",""); -print "some informations\n"; -print "=================\n"; -print "Zebra biblio directory =>$biblioserverdir\n"; -print "Zebra authorities directory =>$authorityserverdir\n"; -print "Koha directory =>$kohadir\n"; -print "BIBLIONUMBER in : $biblionumbertagfield\$$biblionumbertagsubfield\n"; +print "Zebra configuration information\n"; +print "================================\n"; +print "Zebra biblio directory = $biblioserverdir\n"; +print "Zebra authorities directory = $authorityserverdir\n"; +print "Koha directory = $kohadir\n"; +print "BIBLIONUMBER in : $biblionumbertagfield\$$biblionumbertagsubfield\n"; print "BIBLIOITEMNUMBER in : $biblioitemnumbertagfield\$$biblioitemnumbertagsubfield\n"; -print "=================\n"; +print "================================\n"; + +if ($do_munge) { + munge_config(); +} + +if ($authorities) { + # + # exporting authorities + # + if ($skip_export) { + print "====================\n"; + print "SKIPPING authorities export\n"; + print "====================\n"; + } else { + print "====================\n"; + print "exporting authorities\n"; + print "====================\n"; + mkdir "$directory" unless (-d $directory); + mkdir "$directory/authorities" unless (-d "$directory/authorities"); + open(OUT,">:utf8","$directory/authorities/authorities.iso2709") or die $!; + my $dbh=C4::Context->dbh; + my $sth; + $sth=$dbh->prepare("select authid,marc from auth_header $limit"); + $sth->execute(); + my $i=0; + while (my ($authid,$record) = $sth->fetchrow) { + # FIXME : we retrieve the iso2709 record. if the GetAuthority (that uses the XML) fails + # due to some MARC::File::XML failure, then try the iso2709, + # (add authid & authtype if needed) + my $record; + eval { + $record = GetAuthority($authid); + }; + next unless $record; + # force authid in case it's not here, otherwise, zebra will die on this authority + unless ($record->field('001')->data() eq $authid){ + print "$authid don't exist for this authority :".$record->as_formatted; + $record->delete_field($record->field('001')); + $record->insert_fields_ordered(MARC::Field->new('001',$authid)); + } + if($@){ + print " There was some pb getting authority : ".$authid."\n"; + next; + } + + print "."; + print "\r$i" unless ($i++ %100); +# # remove leader length, that could be wrong, it will be calculated automatically by as_usmarc +# # otherwise, if it's wron, zebra will fail miserabily (and never index what is after the failing record) + my $leader=$record->leader; + substr($leader,0,5)=' '; + substr($leader,10,7)='22 '; + $record->leader(substr($leader,0,24)); + print OUT $record->as_usmarc; + } + close(OUT); + } + + # + # and reindexing everything + # + print "====================\n"; + print "REINDEXING zebra\n"; + print "====================\n"; + system("zebraidx -c ".C4::Context->zebraconfig('authorityserver')->{config}." -g iso2709 -d authorities init") if ($reset); + system("zebraidx -c ".C4::Context->zebraconfig('authorityserver')->{config}." -g iso2709 -d authorities update $directory/authorities"); + system("zebraidx -c ".C4::Context->zebraconfig('authorityserver')->{config}." -g iso2709 -d authorities commit"); +} else { + print "skipping authorities\n"; +} +################################################################################################################# +# BIBLIOS +################################################################################################################# + +if ($biblios) { + # die; + # + # exporting biblios + # + if ($skip_export) { + print "====================\n"; + print "SKIPPING biblio export\n"; + print "====================\n"; + } else { + print "====================\n"; + print "exporting biblios\n"; + print "====================\n"; + mkdir "$directory" unless (-d $directory); + mkdir "$directory/biblios" unless (-d "$directory/biblios"); + open(OUT,">:utf8 ","$directory/biblios/export") or die $!; + my $dbh=C4::Context->dbh; + my $sth; + if ($noxml){ + $sth=$dbh->prepare("select biblionumber,marc from biblioitems order by biblionumber $limit"); + $sth->execute(); + my $i=0; + while (my ($biblionumber,$marc) = $sth->fetchrow) { + my $record; + $record=MARC::Record->new_from_usmarc($marc); + my $record_correct=1; + # skip uncorrect records : isn't this bogus, as just after we reintroduce biblionumber if it's missing ? + # FIXME next unless $record->field($biblionumbertagfield); + # check if biblionumber is present, otherwise, add it on the fly + if ($biblionumbertagfield eq '001') { + unless ($record->field($biblionumbertagfield)->data()) { + $record_correct=0; + my $field; + # if the field where biblionumber is already exist, just update it, otherwise create it + if ($record->field($biblionumbertagfield)) { + $field = $record->field($biblionumbertagfield); + $field->update($biblionumber); + } else { + my $newfield; + $newfield = MARC::Field->new( $biblionumbertagfield, $biblionumber); + $record->append_fields($newfield); + } + } + } else { + unless ($record->subfield($biblionumbertagfield,$biblionumbertagsubfield)) { + $record_correct=0; + my $field; + # if the field where biblionumber is already exist, just update it, otherwise create it + if ($record->field($biblionumbertagfield)) { + $field = $record->field($biblionumbertagfield); + $field->add_subfields($biblionumbertagsubfield => $biblionumber); + } else { + my $newfield; + $newfield = MARC::Field->new( $biblionumbertagfield,'','', $biblionumbertagsubfield => $biblionumber); + $record->append_fields($newfield); + } + } + # warn "FIXED BIBLIONUMBER".$record->as_formatted; + } + unless ($record->subfield($biblioitemnumbertagfield,$biblioitemnumbertagsubfield)) { + $record_correct=0; + # warn "INCORRECT BIBLIOITEMNUMBER :".$record->as_formatted; + my $field; + # if the field where biblionumber is already exist, just update it, otherwise create it + if ($record->field($biblioitemnumbertagfield)) { + $field = $record->field($biblioitemnumbertagfield); + if ($biblioitemnumbertagfield <10) { + $field->update($biblionumber); + } else { + $field->add_subfields($biblioitemnumbertagsubfield => $biblionumber); + } + } else { + my $newfield; + if ($biblioitemnumbertagfield <10) { + $newfield = MARC::Field->new( $biblioitemnumbertagfield, $biblionumber); + } else { + $newfield = MARC::Field->new( $biblioitemnumbertagfield,'','', $biblioitemnumbertagsubfield => $biblionumber); + } + $record->insert_grouped_field($newfield); + } + # warn "FIXED BIBLIOITEMNUMBER".$record->as_formatted; + } + my $leader=$record->leader; + substr($leader,0,5)=' '; + substr($leader,10,7)='22 '; + $record->leader(substr($leader,0,24)); + print OUT $record->as_usmarc(); + } + close (OUT); + } else { + $sth=$dbh->prepare("SELECT biblionumber FROM biblioitems ORDER BY biblionumber $limit"); + $sth->execute(); + my $i=0; + while (my ($biblionumber) = $sth->fetchrow) { + print "."; + print "\r$i" unless ($i++ %100); + my $record; + eval { + $record = GetMarcBiblio($biblionumber); + }; + if($@){ + print " There was some pb getting biblio : #".$biblionumber."\n"; + next; + } + next unless $record; +# die if $record->subfield('090','9') eq 11; + # print $record; + # check that biblionumber & biblioitemnumber are stored in the MARC record, otherwise, add them & update the biblioitems.marcxml data. + my $record_correct=1; + # skip uncorrect records : isn't this bogus, as just after we reintroduce biblionumber if it's missing ? + # FIXME next unless $record->field($biblionumbertagfield); + # + # + # CHECK biblionumber + # + # + if ($biblionumbertagfield eq '001') { + unless ($record->field($biblionumbertagfield) && $record->field($biblionumbertagfield)->data()) { + $record_correct=0; + my $field; + # if the field where biblionumber is already exist, just update it, otherwise create it + if ($record->field($biblionumbertagfield)) { + $field = $record->field($biblionumbertagfield); + $field->update($biblionumber); + } else { + my $newfield; + $newfield = MARC::Field->new( $biblionumbertagfield, $biblionumber); + $record->append_fields($newfield); + } + } + } else { + unless ($record->subfield($biblionumbertagfield,$biblionumbertagsubfield)) { +# warn "fixing biblionumber for $biblionumbertagfield,$biblionumbertagsubfield = $biblionumber"; + $record_correct=0; + my $field; + # if the field where biblionumber is already exist, just update it, otherwise create it + if ($record->field($biblionumbertagfield)) { + $field = $record->field($biblionumbertagfield); + $field->add_subfields($biblionumbertagsubfield => $biblionumber); + } else { + my $newfield; + $newfield = MARC::Field->new( $biblionumbertagfield,'','', $biblionumbertagsubfield => $biblionumber); + $record->append_fields($newfield); + } + } +# warn "FIXED BIBLIONUMBER".$record->as_formatted; + } + # + # + # CHECK BIBLIOITEMNUMBER + # + # + unless ($record->subfield($biblioitemnumbertagfield,$biblioitemnumbertagsubfield)) { +# warn "fixing biblioitemnumber for $biblioitemnumbertagfield,$biblioitemnumbertagsubfield = $biblionumber"; + $record_correct=0; + my $field; + # if the field where biblionumber is already exist, just update it, otherwise create it + if ($record->field($biblioitemnumbertagfield)) { + $field = $record->field($biblioitemnumbertagfield); + if ($biblioitemnumbertagfield <10) { + $field->update($biblionumber); + } else { + $field->add_subfields($biblioitemnumbertagsubfield => $biblionumber); + } + } else { + my $newfield; + if ($biblioitemnumbertagfield <10) { + $newfield = MARC::Field->new( $biblioitemnumbertagfield, $biblionumber); + } else { + $newfield = MARC::Field->new( $biblioitemnumbertagfield,'','', $biblioitemnumbertagsubfield => $biblionumber); + } + $record->insert_grouped_field($newfield); + } + # warn "FIXED BIBLIOITEMNUMBER".$record->as_formatted; + } + # + # + # CHECK FIELD 100 + # + # + my $encoding = C4::Context->preference("marcflavour"); + # deal with UNIMARC field 100 (encoding) : create it if needed & set encoding to unicode + if ( $encoding eq "UNIMARC" ) { + my $string; + if ( length($record->subfield( 100, "a" )) == 35 ) { + $string = $record->subfield( 100, "a" ); + my $f100 = $record->field(100); + $record->delete_field($f100); + } + else { + $string = POSIX::strftime( "%Y%m%d", localtime ); + $string =~ s/\-//g; + $string = sprintf( "%-*s", 35, $string ); + } + substr( $string, 22, 6, "frey50" ); + unless ( length($record->subfield( 100, "a" )) == 35 ) { + $record->delete_field($record->field(100)); + $record->insert_grouped_field( + MARC::Field->new( 100, "", "", "a" => $string ) ); + } + } + unless ($record_correct) { + my $update_xml = $dbh->prepare("update biblioitems set marcxml=? where biblionumber=?"); + warn "UPDATING $biblionumber (missing biblionumber or biblioitemnumber in MARC record : ".$record->as_xml; + $update_xml->execute($record->as_xml,$biblionumber); + } + # remove leader length, that could be wrong, it will be calculated automatically by as_usmarc + # otherwise, if it's wron, zebra will fail miserabily (and never index what is after the failing record) + my $leader=$record->leader; + substr($leader,0,5)=' '; + substr($leader,10,7)='22 '; + $record->leader(substr($leader,0,24)); + print OUT $record->as_usmarc(); + } + close(OUT); + } + } + + # + # and reindexing everything + # + print "====================\n"; + print "REINDEXING zebra\n"; + print "====================\n"; + system("zebraidx -g iso2709 -c ".C4::Context->zebraconfig('biblioserver')->{config}." -d biblios init") if ($reset); + system("zebraidx -g iso2709 -c ".C4::Context->zebraconfig('biblioserver')->{config}." -d biblios update $directory/biblios"); + system("zebraidx -g iso2709 -c ".C4::Context->zebraconfig('biblioserver')->{config}." -d biblios commit"); +} else { + print "skipping biblios\n"; +} + +print "====================\n"; +print "CLEANING\n"; +print "====================\n"; +if ($keep_export) { + print "NOTHING cleaned : the export $directory has been kept.\n"; + print "You can re-run this script with the -s "; + if ($use_tempdir) { + print " and -d $directory parameters"; + } else { + print "parameter"; + } + print "\n"; + print "if you just want to rebuild zebra after changing the record.abs\n"; + print "or another zebra config file\n"; +} else { + unless ($use_tempdir) { + # if we're using a temporary directory + # created by File::Temp, it will be removed + # automatically. + rmtree($directory, 0, 1); + print "directory $directory deleted\n"; + } +} + +sub print_usage { + print <<_USAGE_; +$0: reindex MARC bibs and/or authorities in Zebra. + +Use this batch job to reindex all biblio or authority +records in your Koha database. This job is useful +only if you are using Zebra; if you are using the 'NoZebra' +mode, this job should not be used. + +Parameters: + -b index bibliographic records + -a index authority records + -r clear Zebra index before + adding records to index + + -d Temporary directory for indexing. + If not specified, one is automatically + created. The export directory + is automatically deleted unless + you supply the -k switch. + -k Do not delete export directory. + -s Skip export. Used if you have + already exported the records + in a previous run. + + -noxml index from ISO MARC blob + instead of MARC XML. This + option is recommended only + for advanced user. + -munge-config Deprecated option to try + to fix Zebra config files. + --help or -h show this message. +_USAGE_ +} + +# FIXME: the following routines are deprecated and +# will be removed once it is determined whether +# a script to fix Zebra configuration files is +# actually needed. +sub munge_config { # # creating zebra-biblios.cfg depending on system # @@ -261,83 +653,16 @@ memMax: 40M rank:rank-1 "; print "Info: creating zebra-authorities.cfg\n"; - $created_dir_or_file++; - } - - if ($created_dir_or_file) { - print "Info: created : $created_dir_or_file directories & files\n"; - } else { - print "Info: file & directories OK\n"; - } - - # - # exporting authorities - # - if ($skip_export) { - print "====================\n"; - print "SKIPPING authorities export\n"; - print "====================\n"; - } else { - print "====================\n"; - print "exporting authorities\n"; - print "====================\n"; - mkdir "$directory" unless (-d $directory); - mkdir "$directory/authorities" unless (-d "$directory/authorities"); - open(OUT,">:utf8","$directory/authorities/authorities.iso2709") or die $!; - my $dbh=C4::Context->dbh; - my $sth; - $sth=$dbh->prepare("select authid,marc from auth_header $limit"); - $sth->execute(); - my $i=0; - while (my ($authid,$record) = $sth->fetchrow) { - # FIXME : we retrieve the iso2709 record. if the GetAuthority (that uses the XML) fails - # due to some MARC::File::XML failure, then try the iso2709, - # (add authid & authtype if needed) - my $record; - eval { - $record = GetAuthority($authid); - }; - next unless $record; - # force authid in case it's not here, otherwise, zebra will die on this authority - unless ($record->field('001')->data() eq $authid){ - print "$authid don't exist for this authority :".$record->as_formatted; - $record->delete_field($record->field('001')); - $record->insert_fields_ordered(MARC::Field->new('001',$authid)); - } - if($@){ - print " There was some pb getting authority : ".$authid."\n"; - next; - } - - print "."; - print "\r$i" unless ($i++ %100); -# # remove leader length, that could be wrong, it will be calculated automatically by as_usmarc -# # otherwise, if it's wron, zebra will fail miserabily (and never index what is after the failing record) - my $leader=$record->leader; - substr($leader,0,5)=' '; - substr($leader,10,7)='22 '; - $record->leader(substr($leader,0,24)); - print OUT $record->as_usmarc; - } - close(OUT); + $created_dir_or_file++; + } + + if ($created_dir_or_file) { + print "Info: created : $created_dir_or_file directories & files\n"; + } else { + print "Info: file & directories OK\n"; } - # - # and reindexing everything - # - print "====================\n"; - print "REINDEXING zebra\n"; - print "====================\n"; - system("zebraidx -c ".C4::Context->zebraconfig('authorityserver')->{config}." -g iso2709 -d authorities init") if ($reset); - system("zebraidx -c ".C4::Context->zebraconfig('authorityserver')->{config}." -g iso2709 -d authorities update $directory/authorities"); - system("zebraidx -c ".C4::Context->zebraconfig('authorityserver')->{config}." -g iso2709 -d authorities commit"); -} else { - print "skipping authorities\n"; } -################################################################################################################# -# BIBLIOS -################################################################################################################# - if ($biblios) { print "====================\n"; print "checking directories & files for biblios\n"; @@ -480,242 +805,5 @@ rank:rank-1 print "Info: file & directories OK\n"; } - # die; - # - # exporting biblios - # - if ($skip_export) { - print "====================\n"; - print "SKIPPING biblio export\n"; - print "====================\n"; - } else { - print "====================\n"; - print "exporting biblios\n"; - print "====================\n"; - mkdir "$directory" unless (-d $directory); - mkdir "$directory/biblios" unless (-d "$directory/biblios"); - open(OUT,">:utf8 ","$directory/biblios/export") or die $!; - my $dbh=C4::Context->dbh; - my $sth; - if ($noxml){ - $sth=$dbh->prepare("select biblionumber,marc from biblioitems order by biblionumber $limit"); - $sth->execute(); - my $i=0; - while (my ($biblionumber,$marc) = $sth->fetchrow) { - my $record; - $record=MARC::Record->new_from_usmarc($marc); - my $record_correct=1; - # skip uncorrect records : isn't this bogus, as just after we reintroduce biblionumber if it's missing ? - # FIXME next unless $record->field($biblionumbertagfield); - # check if biblionumber is present, otherwise, add it on the fly - if ($biblionumbertagfield eq '001') { - unless ($record->field($biblionumbertagfield)->data()) { - $record_correct=0; - my $field; - # if the field where biblionumber is already exist, just update it, otherwise create it - if ($record->field($biblionumbertagfield)) { - $field = $record->field($biblionumbertagfield); - $field->update($biblionumber); - } else { - my $newfield; - $newfield = MARC::Field->new( $biblionumbertagfield, $biblionumber); - $record->append_fields($newfield); - } - } - } else { - unless ($record->subfield($biblionumbertagfield,$biblionumbertagsubfield)) { - $record_correct=0; - my $field; - # if the field where biblionumber is already exist, just update it, otherwise create it - if ($record->field($biblionumbertagfield)) { - $field = $record->field($biblionumbertagfield); - $field->add_subfields($biblionumbertagsubfield => $biblionumber); - } else { - my $newfield; - $newfield = MARC::Field->new( $biblionumbertagfield,'','', $biblionumbertagsubfield => $biblionumber); - $record->append_fields($newfield); - } - } - # warn "FIXED BIBLIONUMBER".$record->as_formatted; - } - unless ($record->subfield($biblioitemnumbertagfield,$biblioitemnumbertagsubfield)) { - $record_correct=0; - # warn "INCORRECT BIBLIOITEMNUMBER :".$record->as_formatted; - my $field; - # if the field where biblionumber is already exist, just update it, otherwise create it - if ($record->field($biblioitemnumbertagfield)) { - $field = $record->field($biblioitemnumbertagfield); - if ($biblioitemnumbertagfield <10) { - $field->update($biblionumber); - } else { - $field->add_subfields($biblioitemnumbertagsubfield => $biblionumber); - } - } else { - my $newfield; - if ($biblioitemnumbertagfield <10) { - $newfield = MARC::Field->new( $biblioitemnumbertagfield, $biblionumber); - } else { - $newfield = MARC::Field->new( $biblioitemnumbertagfield,'','', $biblioitemnumbertagsubfield => $biblionumber); - } - $record->insert_grouped_field($newfield); - } - # warn "FIXED BIBLIOITEMNUMBER".$record->as_formatted; - } - my $leader=$record->leader; - substr($leader,0,5)=' '; - substr($leader,10,7)='22 '; - $record->leader(substr($leader,0,24)); - print OUT $record->as_usmarc(); - } - close (OUT); - } else { - $sth=$dbh->prepare("SELECT biblionumber FROM biblioitems ORDER BY biblionumber $limit"); - $sth->execute(); - my $i=0; - while (my ($biblionumber) = $sth->fetchrow) { - print "."; - print "\r$i" unless ($i++ %100); - my $record; - eval { - $record = GetMarcBiblio($biblionumber); - }; - if($@){ - print " There was some pb getting biblio : #".$biblionumber."\n"; - next; - } - next unless $record; -# die if $record->subfield('090','9') eq 11; - # print $record; - # check that biblionumber & biblioitemnumber are stored in the MARC record, otherwise, add them & update the biblioitems.marcxml data. - my $record_correct=1; - # skip uncorrect records : isn't this bogus, as just after we reintroduce biblionumber if it's missing ? - # FIXME next unless $record->field($biblionumbertagfield); - # - # - # CHECK biblionumber - # - # - if ($biblionumbertagfield eq '001') { - unless ($record->field($biblionumbertagfield) && $record->field($biblionumbertagfield)->data()) { - $record_correct=0; - my $field; - # if the field where biblionumber is already exist, just update it, otherwise create it - if ($record->field($biblionumbertagfield)) { - $field = $record->field($biblionumbertagfield); - $field->update($biblionumber); - } else { - my $newfield; - $newfield = MARC::Field->new( $biblionumbertagfield, $biblionumber); - $record->append_fields($newfield); - } - } - } else { - unless ($record->subfield($biblionumbertagfield,$biblionumbertagsubfield)) { -# warn "fixing biblionumber for $biblionumbertagfield,$biblionumbertagsubfield = $biblionumber"; - $record_correct=0; - my $field; - # if the field where biblionumber is already exist, just update it, otherwise create it - if ($record->field($biblionumbertagfield)) { - $field = $record->field($biblionumbertagfield); - $field->add_subfields($biblionumbertagsubfield => $biblionumber); - } else { - my $newfield; - $newfield = MARC::Field->new( $biblionumbertagfield,'','', $biblionumbertagsubfield => $biblionumber); - $record->append_fields($newfield); - } - } -# warn "FIXED BIBLIONUMBER".$record->as_formatted; - } - # - # - # CHECK BIBLIOITEMNUMBER - # - # - unless ($record->subfield($biblioitemnumbertagfield,$biblioitemnumbertagsubfield)) { -# warn "fixing biblioitemnumber for $biblioitemnumbertagfield,$biblioitemnumbertagsubfield = $biblionumber"; - $record_correct=0; - my $field; - # if the field where biblionumber is already exist, just update it, otherwise create it - if ($record->field($biblioitemnumbertagfield)) { - $field = $record->field($biblioitemnumbertagfield); - if ($biblioitemnumbertagfield <10) { - $field->update($biblionumber); - } else { - $field->add_subfields($biblioitemnumbertagsubfield => $biblionumber); - } - } else { - my $newfield; - if ($biblioitemnumbertagfield <10) { - $newfield = MARC::Field->new( $biblioitemnumbertagfield, $biblionumber); - } else { - $newfield = MARC::Field->new( $biblioitemnumbertagfield,'','', $biblioitemnumbertagsubfield => $biblionumber); - } - $record->insert_grouped_field($newfield); - } - # warn "FIXED BIBLIOITEMNUMBER".$record->as_formatted; - } - # - # - # CHECK FIELD 100 - # - # - my $encoding = C4::Context->preference("marcflavour"); - # deal with UNIMARC field 100 (encoding) : create it if needed & set encoding to unicode - if ( $encoding eq "UNIMARC" ) { - my $string; - if ( length($record->subfield( 100, "a" )) == 35 ) { - $string = $record->subfield( 100, "a" ); - my $f100 = $record->field(100); - $record->delete_field($f100); - } - else { - $string = POSIX::strftime( "%Y%m%d", localtime ); - $string =~ s/\-//g; - $string = sprintf( "%-*s", 35, $string ); - } - substr( $string, 22, 6, "frey50" ); - unless ( length($record->subfield( 100, "a" )) == 35 ) { - $record->delete_field($record->field(100)); - $record->insert_grouped_field( - MARC::Field->new( 100, "", "", "a" => $string ) ); - } - } - unless ($record_correct) { - my $update_xml = $dbh->prepare("update biblioitems set marcxml=? where biblionumber=?"); - warn "UPDATING $biblionumber (missing biblionumber or biblioitemnumber in MARC record : ".$record->as_xml; - $update_xml->execute($record->as_xml,$biblionumber); - } - # remove leader length, that could be wrong, it will be calculated automatically by as_usmarc - # otherwise, if it's wron, zebra will fail miserabily (and never index what is after the failing record) - my $leader=$record->leader; - substr($leader,0,5)=' '; - substr($leader,10,7)='22 '; - $record->leader(substr($leader,0,24)); - print OUT $record->as_usmarc(); - } - close(OUT); - } - } - - # - # and reindexing everything - # - print "====================\n"; - print "REINDEXING zebra\n"; - print "====================\n"; - system("zebraidx -g iso2709 -c ".C4::Context->zebraconfig('biblioserver')->{config}." -d biblios init") if ($reset); - system("zebraidx -g iso2709 -c ".C4::Context->zebraconfig('biblioserver')->{config}." -d biblios update $directory/biblios"); - system("zebraidx -g iso2709 -c ".C4::Context->zebraconfig('biblioserver')->{config}." -d biblios commit"); -} else { - print "skipping biblios\n"; } - -print "====================\n"; -print "CLEANING\n"; -print "====================\n"; -if ($keep_export) { - print "NOTHING cleaned : the $directory has been kept. You can re-run this script with the -s parameter if you just want to rebuild zebra after changing the record.abs or another zebra config file\n"; -} else { - system("rm -rf $directory"); - print "directory $directory deleted\n"; } -- 2.39.5