Browse Source

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 <crc@liblime.com>
Signed-off-by: Joshua Ferraro <jmf@liblime.com>
3.0.x
Galen Charlton 17 years ago
committed by Joshua Ferraro
parent
commit
93beb943c0
  1. 732
      misc/migration_tools/rebuild_zebra.pl

732
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";
}

Loading…
Cancel
Save