Koha/misc/marc_into_authority.pl

140 lines
No EOL
5 KiB
Perl

#!/usr/bin/perl
# script that populates the authorities table with marc
# Written by TG on 10/04/2006
use strict;
# Koha modules used
use C4::Context;
use MARC::Record;
use MARC::File::USMARC;
use MARC::File::XML;
use C4::AuthoritiesMarc;
use Time::HiRes qw(gettimeofday);
my $timeneeded;
my $starttime = gettimeofday;
my $dbh = C4::Context->dbh;
my $sthcols=$dbh->prepare("show columns from auth_header");
$sthcols->execute();
my %columns;
while (( my $cols)=$sthcols->fetchrow){
$columns{$cols}=1;
}
##Update the database if missing fields;
$dbh->do("LOCK TABLES auth_header WRITE, auth_subfield_structure WRITE , auth_subfield_table READ");
unless ($columns{'linkid'}){
my $sth=$dbh->prepare("ALTER TABLE auth_header ADD COLUMN `linkid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 ");
$sth->execute();
}
unless ($columns{'marc'}){
my $sth=$dbh->prepare("ALTER TABLE auth_header ADD COLUMN `marc` BLOB NOT NULL DEFAULT 0 ");
$sth->execute();
}
###Chechk auth_subfield_structure as well. User may have forgotten to update database
my $sthcols=$dbh->prepare("show columns from auth_subfield_structure");
$sthcols->execute();
my %columns;
while (( my $cols)=$sthcols->fetchrow){
$columns{$cols}=1;
}
##Update the database if missing fields;
$dbh->do("LOCK TABLES auth_header WRITE, auth_subfield_structure WRITE , auth_subfield_table READ");
unless ($columns{'link'}){
my $sth=$dbh->prepare("ALTER TABLE auth_subfield_structure ADD COLUMN `link` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 ");
$sth->execute();
}
unless ($columns{'isurl'}){
my $sth=$dbh->prepare("ALTER TABLE auth_subfield_structure ADD COLUMN `isurl` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 ");
$sth->execute();
}
unless ($columns{'hidden'}){
my $sth=$dbh->prepare("ALTER TABLE auth_subfield_structure ADD COLUMN `hidden` TINYINT(3) UNSIGNED NOT NULL ZEROFILL DEFAULT 000 ");
$sth->execute();
}
unless ($columns{'kohafield'}){
my $sth=$dbh->prepare("ALTER TABLE auth_subfield_structure ADD COLUMN `kohafield` VARCHAR(45) NOT NULL ");
$sth->execute();
}
my $sth=$dbh->prepare("select authid,authtypecode from auth_header ");
$sth->execute();
my $i=0;
my $sth2 = $dbh->prepare("UPDATE auth_header set marc=? where authid=?" );
while (my ($authid,$authtypecode)=$sth->fetchrow ){
my $record = AUTHgetauthorityold($dbh,$authid);
##Add authid and authtypecode to record. Old records did not have these fields
my ($authidfield,$authidsubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.authid",$authtypecode);
my ($authidfield,$authtypesubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.authtypecode",$authtypecode);
##Both authid and authtypecode is expected to be in the same field. Modify if other requirements arise
$record->add_fields($authidfield,'','',$authidsubfield=>$authid,$authtypesubfield=>$authtypecode);
$sth2->execute($record->as_usmarc,$authid);
$timeneeded = gettimeofday - $starttime unless ($i % 1000);
print "$i in $timeneeded s\n" unless ($i % 1000);
print "." unless ($i % 500);
$i++;
}
$dbh->do("UNLOCK TABLES ");
sub AUTHgetauthorityold {
# Returns MARC::Record of the biblio passed in parameter.
my ($dbh,$authid)=@_;
my $record = MARC::Record->new();
#---- TODO : the leader is missing
$record->leader(' ');
my $sth3=$dbh->prepare("select authid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue
from auth_subfield_table
where authid=? order by tag,tagorder,subfieldorder
");
$sth3->execute($authid);
my $prevtagorder=1;
my $prevtag='XXX';
my $previndicator;
my $field; # for >=10 tags
my $prevvalue; # for <10 tags
while (my $row=$sth3->fetchrow_hashref) {
if ($row->{tagorder} ne $prevtagorder || $row->{tag} ne $prevtag) {
$previndicator.=" ";
if ($prevtag <10) {
$record->add_fields((sprintf "%03s",$prevtag),$prevvalue) unless $prevtag eq "XXX"; # ignore the 1st loop
} else {
$record->add_fields($field) unless $prevtag eq "XXX";
}
undef $field;
$prevtagorder=$row->{tagorder};
$prevtag = $row->{tag};
$previndicator=$row->{tag_indicator};
if ($row->{tag}<10) {
$prevvalue = $row->{subfieldvalue};
} else {
$field = MARC::Field->new((sprintf "%03s",$prevtag), substr($row->{tag_indicator}.' ',0,1), substr($row->{tag_indicator}.' ',1,1), $row->{'subfieldcode'}, $row->{'subfieldvalue'} );
}
} else {
if ($row->{tag} <10) {
$record->add_fields((sprintf "%03s",$row->{tag}), $row->{'subfieldvalue'});
} else {
$field->add_subfields($row->{'subfieldcode'}, $row->{'subfieldvalue'} );
}
$prevtag= $row->{tag};
$previndicator=$row->{tag_indicator};
}
}
# the last has not been included inside the loop... do it now !
if ($prevtag ne "XXX") { # check that we have found something. Otherwise, prevtag is still XXX and we
# must return an empty record, not make MARC::Record fail because we try to
# create a record with XXX as field :-(
if ($prevtag <10) {
$record->add_fields($prevtag,$prevvalue);
} else {
# my $field = MARC::Field->new( $prevtag, "", "", %subfieldlist);
$record->add_fields($field);
}
}
return $record;
}
END;