Bug 17447: Run perltidy on batchRebuildItemsTables.pl
[koha.git] / misc / batchRebuildItemsTables.pl
blobeb9ce08ef2f385124d13cecba63a7759fa613c1b
1 #!/usr/bin/perl
2 use Modern::Perl;
3 use Getopt::Long;
4 use C4::Context;
5 use C4::Biblio;
6 use C4::Items;
7 use MARC::Record;
8 use MARC::Field;
9 use Data::Dumper;
10 use Time::HiRes qw(gettimeofday);
11 use Pod::Usage;
13 =head1 NAME
15 batchRebuildBiblioTables.pl - rebuilds the non-MARC DB items table from the MARC values
17 You can/must use it when you change items mapping.
19 =head1 SYNOPSIS
21 batchRebuildItemsTables.pl [ -h ][ -c ][ -t ][ --where ]
23 Options:
24 -h --help (or without arguments) shows this help message
25 -c Confirm: rebuild non marc DB (may be long)
26 -t test only, change nothing in DB
27 --where add where condition on default query (eg. --where 'biblio.biblionumber<100')
29 =cut
31 my $count = 0;
32 my $errorcount = 0;
33 my $starttime = gettimeofday;
34 my @errors;
35 my %opt;
36 my ( $confirm, $help, $test_parameter, $where );
37 GetOptions(
38 'c' => \$confirm,
39 'help|h' => \$help,
40 't' => \$test_parameter,
41 'where:s' => \$where,
42 ) or pod2usage(2);
44 pod2usage(1) if ( $help || ( !$confirm ) );
45 print "### Database will not be modified ###\n" if $test_parameter;
47 #dbh
48 my $dbh = C4::Context->dbh;
49 $dbh->{AutoCommit} = 0;
51 #sysprefs
52 C4::Context->disable_syspref_cache() if ( defined( C4::Context->disable_syspref_cache() ) );
53 my $CataloguingLog = C4::Context->preference('CataloguingLog');
54 my $dontmerge = C4::Context->preference('dontmerge');
55 $dontmerge = "0" unless defnonull($dontmerge);
56 $dbh->do("UPDATE systempreferences SET value=0 WHERE variable='CataloguingLog'");
57 $dbh->do("UPDATE systempreferences SET value=1 where variable='dontmerge'");
58 $dbh->commit() unless $test_parameter;
59 my ( $itemfield, $itemnumbersubfield ) = &GetMarcFromKohaField( "items.itemnumber", '' );
61 #dbh query init
62 my $query =
63 qq{SELECT biblio.biblionumber AS biblionumber, biblioitems.biblioitemnumber AS biblioitemnumber, biblio.frameworkcode AS frameworkcode FROM biblio JOIN biblioitems ON biblio.biblionumber=biblioitems.biblionumber};
64 $query .= qq{ WHERE $where } if ($where);
66 my $sth = $dbh->prepare($query);
67 $sth->execute();
68 while ( my ( $biblionumber, $biblioitemnumber, $frameworkcode ) = $sth->fetchrow ) {
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);
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;
84 my @itemnumbers = $itemfield->subfield($itemnumbersubfield);
85 foreach my $itemnumber (@itemnumbers) {
86 $rqitemnumber->execute( $itemnumber, $biblionumber );
87 if ( my $row = $rqitemnumber->fetchrow_hashref ) { $itemnum = $row->{itemnumber}; }
89 eval {
90 if ($itemnum) { ModItemFromMarc( $marcitem, $biblionumber, $itemnum ) }
91 else { die("$biblionumber"); }
93 if ($@) { warn "Problem with : $biblionumber : $@"; warn $record->as_formatted; }
96 unless ($test_parameter) {
97 $dbh->commit() unless $count % 1000;
101 my $sthCataloguingLog = $dbh->prepare("UPDATE systempreferences SET value=? WHERE variable='CataloguingLog'");
102 $sthCataloguingLog->execute($CataloguingLog);
103 my $sthdontmerge = $dbh->prepare("UPDATE systempreferences SET value=? WHERE variable='dontmerge'");
104 $sthdontmerge->execute($dontmerge);
105 $dbh->commit() unless $test_parameter;
106 my $timeneeded = time() - $starttime;
107 print "$count MARC record done in $timeneeded seconds\n";
108 if ( scalar(@errors) > 0 ) {
109 print "Some biblionumber could not be processed though: ", join( " ", @errors );
112 sub defnonull { my $var = shift; defined $var and $var ne "" }
113 __END__