Koha/misc/rebuild_marc_newframework.pl
Galen Charlton b8a58c4934 installer: command-line scripts improve finding C4 modules
Command-line scripts now use a new SCRIPT_DIR/kohalib.pl
to put installed location of Koha's Perl modules
into @INC.
2007-12-17 09:13:54 -06:00

92 lines
2.6 KiB
Perl
Executable file

#!/usr/bin/perl
#-----------------------------------
# Script Name: rebuild_marc_newframework.pl
# Script Version: 0.1.0
# Date: 20/04/2006
##If you change your framework for marc mapping use this script to recreate marc records in your db
## Then drop the old framework and install the new one.New frameworks are being introduced with Koha3.0
##Re-export all your marc and recreate Zebra db.
##Writen by Tumer Garip tgarip@neu.edu.tr
use strict;
BEGIN {
# find Koha's Perl modules
# test carefully before changing this
use FindBin;
eval { require "$FindBin::Bin/kohalib.pl" };
}
use C4::Context;
use C4::Biblio;
use MARC::Record;
use MARC::File::USMARC;
use MARC::File::XML;
my $dbh=C4::Context->dbh;
use Time::HiRes qw(gettimeofday);
##Write the corresponding new mappings below. this one maps old 090$c$d to new 09o$c$d and 952 holdings of NEU to 95k values
##Adjust this mapping list to your own needs
my %mapping_list = (
'090cd' =>'09ocd',
'952abcdefpruvxyz'=>'95kkbcfazpw9d4ye',
);
my $starttime = gettimeofday;
my $sth=$dbh->prepare("SELECT biblionumber,marc FROM biblioitems ");
$sth->execute;
my $update=$dbh->prepare("update biblioitems set marc=?,marcxml=? where biblionumber=?");
my $b=0;
my $timeneeded;
while (my ($biblionumber, $marc) = $sth->fetchrow) {
my $record=MARC::File::USMARC::decode($marc);
foreach my $key (keys %mapping_list){
my $tag=substr($key,0,3);
my $newtag=substr($mapping_list{$key},0,3);
my @subf;
my @newsub;
for (my $i=3; $i<length($key); $i++){
push @subf,substr($key,$i,1);
push @newsub,substr($mapping_list{$key},$i,1);
}##
foreach my $field ($record->field($tag)){
my $notnew=1;
my $addedfield;
for (my $r=0; $r<@subf; $r++){
if ($field->subfield($subf[$r]) && $notnew){
$addedfield=MARC::Field->new($newtag,$field->indicator(1),$field->indicator(2),$newsub[$r]=>$field->subfield($subf[$r]));
$notnew=0;
}elsif ($field->subfield($subf[$r])){
$addedfield->update($newsub[$r]=>$field->subfield($subf[$r]));
}## a subfield exists
}## all subfields added
$record->delete_field($field);
$record->add_fields($addedfield);
}##foreach field found
##Now update-db
$update->execute($record->as_usmarc,$record->as_xml_record,$biblionumber);
}##foreach $key
$timeneeded = gettimeofday - $starttime unless ($b % 10000);
print "$b in $timeneeded s\n" unless ($b % 10000);
print "." unless ($b % 500);
$b++;
}##while biblionumber
##Dont forget to export all new marc records and build your zebra db
# $timeneeded = gettimeofday - $starttime unless ($i % 30000);
# print "$i in $timeneeded s\n" unless ($i % 30000);
# print "." unless ($i % 500);
# $i++;
$dbh->disconnect();