Koha/misc/batchRebuildItemsTables.pl
Marcel de Rooy f953cc26e6 Bug 9988: Remove further references to dontmerge
[1] The preference was sent to HEA. We can now send both AuthorityMergeMode
    as well as AuthorityMergeLimit.
[2] A comment in authorities/merge.pl is removed. Note that a subsequent
    patch will modify and test the cron job.
[3] Script misc/batchRebuildItemsTables.pl temporarily enabled dontmerge.
    This is equivalent to setting the mergelimit to zero.
    The function defnonull is no longer needed. (If the pref was NULL,
    we restore that value. Sub merge won't mind.)

Test plan:
[1] Run t/db_dependent/UsageStats.t
[2] Run misc/batchRebuildItemsTables.pl -t
    This just ensures you it still compiles; the changes speak for itself.
[3] Now git grep on dontmerge.
    You should only find hits in atomicupdate and misc/translator/po.

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>

Signed-off-by: Marc Véron <veron@veron.ch>
Signed-off-by: Jacek Ablewicz <abl@biblos.pk.edu.pl>
Signed-off-by: Julian Maurice <julian.maurice@biblibre.com>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
2017-04-13 08:53:47 -04:00

107 lines
3.9 KiB
Perl
Executable file

#!/usr/bin/perl
use Modern::Perl;
use Getopt::Long;
use MARC::Field;
use MARC::Record;
use Pod::Usage;
use Time::HiRes qw(gettimeofday);
use C4::Context;
use C4::Biblio;
use C4::Items;
=head1 NAME
batchRebuildBiblioTables.pl - rebuilds the non-MARC DB items table from the MARC values
You can/must use it when you change items mapping.
=head1 SYNOPSIS
batchRebuildItemsTables.pl [ -h ][ -c ][ -t ][ --where ]
Options:
-h --help (or without arguments) shows this help message
-c Confirm: rebuild non marc DB (may be long)
-t test only, change nothing in DB
--where add where condition on default query (eg. --where 'biblio.biblionumber<100')
=cut
my $count = 0;
my $errorcount = 0;
my $starttime = gettimeofday;
my @errors;
my ( $confirm, $help, $test_parameter, $where );
GetOptions(
'c' => \$confirm,
'help|h' => \$help,
't' => \$test_parameter,
'where:s' => \$where,
) or pod2usage(2);
pod2usage(1) if $help || ( !$confirm && !$test_parameter );
print "### Database will not be modified ###\n" if $test_parameter;
#dbh
my $dbh = C4::Context->dbh;
$dbh->{AutoCommit} = 0;
#sysprefs
C4::Context->disable_syspref_cache() if ( defined( C4::Context->disable_syspref_cache() ) );
my $CataloguingLog = C4::Context->preference('CataloguingLog');
my $mergelimit = C4::Context->preference('AuthorityMergeLimit');
$dbh->do("UPDATE systempreferences SET value=0 WHERE variable='CataloguingLog'");
$dbh->do("UPDATE systempreferences SET value=0 where variable='AuthorityMergeLimit'");
$dbh->commit() unless $test_parameter;
my ( $itemfield, $itemnumbersubfield ) = &GetMarcFromKohaField( "items.itemnumber", '' );
#dbh query init
my $query =
qq{SELECT biblio.biblionumber AS biblionumber, biblioitems.biblioitemnumber AS biblioitemnumber, biblio.frameworkcode AS frameworkcode FROM biblio JOIN biblioitems ON biblio.biblionumber=biblioitems.biblionumber};
$query .= qq{ WHERE $where } if ($where);
my $sth = $dbh->prepare($query);
$sth->execute();
while ( my ( $biblionumber, $biblioitemnumber, $frameworkcode ) = $sth->fetchrow ) {
$count++;
warn $count unless $count % 1000;
my $record = GetMarcBiblio( $biblionumber, 1 );
unless ($record) { push @errors, "bad record biblionumber $biblionumber"; next; }
unless ($test_parameter) {
my $rqitemnumber = $dbh->prepare("SELECT itemnumber, biblionumber from items where itemnumber = ? and biblionumber = ?");
foreach my $itemfield ( $record->field($itemfield) ) {
my $marcitem = MARC::Record->new();
$marcitem->encoding('UTF-8');
$marcitem->append_fields($itemfield);
my $itemnum;
my @itemnumbers = $itemfield->subfield($itemnumbersubfield);
foreach my $itemnumber (@itemnumbers) {
$rqitemnumber->execute( $itemnumber, $biblionumber );
if ( my $row = $rqitemnumber->fetchrow_hashref ) { $itemnum = $row->{itemnumber}; }
}
eval {
if ($itemnum) { ModItemFromMarc( $marcitem, $biblionumber, $itemnum ) }
else { die("$biblionumber"); }
};
if ($@) { warn "Problem with : $biblionumber : $@"; warn $record->as_formatted; }
}
}
unless ($test_parameter) {
$dbh->commit() unless $count % 1000;
}
}
my $sthCataloguingLog = $dbh->prepare("UPDATE systempreferences SET value=? WHERE variable='CataloguingLog'");
$sthCataloguingLog->execute($CataloguingLog);
my $sthmergelimit = $dbh->prepare("UPDATE systempreferences SET value=? WHERE variable='AuthorityMergeLimit'");
$sthmergelimit->execute($mergelimit);
$dbh->commit() unless $test_parameter;
my $timeneeded = time() - $starttime;
print "$count MARC record done in $timeneeded seconds\n";
if ( scalar(@errors) > 0 ) {
print "Some biblionumber could not be processed though: ", join( " ", @errors );
}