|
Line 0
Link Here
|
| 0 |
- |
1 |
#!/usr/bin/perl |
|
|
2 |
use 5.10.0; |
| 3 |
use strict; |
| 4 |
use warnings; |
| 5 |
use Getopt::Long; |
| 6 |
use C4::Context; |
| 7 |
use C4::Biblio; |
| 8 |
use C4::Items; |
| 9 |
use MARC::Record; |
| 10 |
use MARC::Field; |
| 11 |
use Data::Dumper; |
| 12 |
use Time::HiRes qw(gettimeofday); |
| 13 |
use Pod::Usage; |
| 14 |
|
| 15 |
=head1 NAME |
| 16 |
|
| 17 |
batchRebuildBiblioTables.pl - rebuilds the non-MARC DB items table from the MARC values |
| 18 |
|
| 19 |
You can/must use it when you change items mapping. |
| 20 |
|
| 21 |
=head1 SYNOPSIS |
| 22 |
|
| 23 |
batchRebuildItemsTables.pl [ -h ][ -c ][ -t ][ --where ] |
| 24 |
|
| 25 |
Options: |
| 26 |
-h --help (or without arguments) shows this help message |
| 27 |
-c Confirm: rebuild non marc DB (may be long) |
| 28 |
-t test only, change nothing in DB |
| 29 |
--where add where condition on default query (eg. --where 'biblio.biblionumber<100') |
| 30 |
|
| 31 |
=cut |
| 32 |
|
| 33 |
|
| 34 |
my $count = 0; |
| 35 |
my $errorcount = 0; |
| 36 |
my $starttime = gettimeofday; |
| 37 |
my @errors; |
| 38 |
my %opt; |
| 39 |
my ($confirm, $help, $test_parameter, $where); |
| 40 |
GetOptions( |
| 41 |
'c' => \$confirm, |
| 42 |
'help|h' => \$help, |
| 43 |
't' => \$test_parameter, |
| 44 |
'where:s' => \$where, |
| 45 |
) or pod2usage(2); |
| 46 |
|
| 47 |
pod2usage(1) if ($help || (!$confirm)); |
| 48 |
print "### Database will not be modified ###\n" if $test_parameter; |
| 49 |
#dbh |
| 50 |
my $dbh = C4::Context->dbh; |
| 51 |
$dbh->{AutoCommit} = 0; |
| 52 |
#sysprefs |
| 53 |
C4::Context->disable_syspref_cache() if ( defined( C4::Context->disable_syspref_cache() ) ); |
| 54 |
my $CataloguingLog = C4::Context->preference('CataloguingLog'); |
| 55 |
my $dontmerge = C4::Context->preference('dontmerge'); |
| 56 |
$dontmerge="0" unless defnonull($dontmerge); |
| 57 |
$dbh->do("UPDATE systempreferences SET value=0 WHERE variable='CataloguingLog'"); |
| 58 |
$dbh->do("UPDATE systempreferences SET value=1 where variable='dontmerge'"); |
| 59 |
$dbh->commit() unless $test_parameter; |
| 60 |
my ($itemfield,$itemnumbersubfield) = &GetMarcFromKohaField("items.itemnumber",''); |
| 61 |
#dbh query init |
| 62 |
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}; |
| 63 |
$query.=qq{ WHERE $where } if ($where); |
| 64 |
|
| 65 |
my $sth = $dbh->prepare($query); |
| 66 |
$sth->execute(); |
| 67 |
while ( my ( $biblionumber, $biblioitemnumber, $frameworkcode ) = $sth->fetchrow ) |
| 68 |
{ |
| 69 |
$count++; |
| 70 |
warn $count unless $count %1000; |
| 71 |
my $extkey; |
| 72 |
my $record = GetMarcBiblio($biblionumber,1); |
| 73 |
unless ($record){ push @errors, "bad record biblionumber $biblionumber"; next; } |
| 74 |
my ($tmptestfields,$tmptestdirectory,$reclen,$tmptestbaseaddress) = MARC::File::USMARC::_build_tag_directory($record); |
| 75 |
if ($reclen > 99999) { push @errors, "bad record length for biblionumber $biblionumber (length : $reclen) "; next; } |
| 76 |
#print "\n################################ record before ##################################\n".$record->as_formatted;#!test |
| 77 |
unless ($test_parameter) { |
| 78 |
my $rqitemnumber=$dbh->prepare("SELECT itemnumber, biblionumber from items where itemnumber = ? and biblionumber = ?"); |
| 79 |
foreach my $itemfield ($record->field($itemfield)){ |
| 80 |
my $marcitem=MARC::Record->new(); |
| 81 |
$marcitem->encoding('UTF-8'); |
| 82 |
$marcitem->append_fields($itemfield); |
| 83 |
my $itemnum; my @itemnumbers = $itemfield->subfield($itemnumbersubfield); |
| 84 |
foreach my $itemnumber ( @itemnumbers ){ |
| 85 |
$rqitemnumber->execute($itemnumber, $biblionumber); |
| 86 |
if( my $row = $rqitemnumber->fetchrow_hashref ){ $itemnum = $row->{itemnumber};} |
| 87 |
} |
| 88 |
eval{ if($itemnum){ ModItemFromMarc($marcitem,$biblionumber,$itemnum) }else{ die("$biblionumber"); } }; |
| 89 |
if ($@){ warn "Problem with : $biblionumber : $@"; warn $record->as_formatted; } |
| 90 |
} |
| 91 |
} |
| 92 |
unless ($test_parameter) { |
| 93 |
$dbh->commit() unless $count %1000; |
| 94 |
} |
| 95 |
} |
| 96 |
|
| 97 |
$dbh->do("UPDATE systempreferences SET value=$CataloguingLog WHERE variable='CataloguingLog'"); |
| 98 |
$dbh->do("UPDATE systempreferences SET value=$dontmerge where variable='dontmerge'"); |
| 99 |
$dbh->commit() unless $test_parameter; |
| 100 |
my $timeneeded = time() - $starttime; |
| 101 |
print "$count MARC record done in $timeneeded seconds\n"; |
| 102 |
if (scalar(@errors) > 0) { |
| 103 |
print "Some biblionumber could not be processed though: ", join(" ", @errors); |
| 104 |
} |
| 105 |
|
| 106 |
sub defnonull { my $var = shift; defined $var and $var ne "" } |
| 107 |
__END__ |