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