Koha-clms/Koha/MetadataRecord/Authority.pm

203 lines
6.2 KiB
Perl

package Koha::MetadataRecord::Authority;
# Copyright 2012 C & P Bibliography Services
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
=head1 NAME
Koha::MetadataRecord::Authority - class to encapsulate authority records in Koha
=head1 SYNOPSIS
Object-oriented class that encapsulates authority records in Koha.
=head1 DESCRIPTION
Authority data.
=cut
use strict;
use warnings;
use Carp;
use C4::Context;
use MARC::Record;
use MARC::File::XML;
use C4::Charset;
use Koha::Util::MARC;
use base qw(Koha::MetadataRecord);
__PACKAGE__->mk_accessors(qw( authid authtypecode ));
=head2 new
my $auth = Koha::MetadataRecord::Authority->new($record);
Create a new Koha::MetadataRecord::Authority object based on the provided record.
=cut
sub new {
my ( $class, $record, $params ) = @_;
$params //= {};
my $self = $class->SUPER::new(
{
'record' => $record,
'schema' => lc C4::Context->preference("marcflavour"),
%$params,
}
);
bless $self, $class;
return $self;
}
=head2 get_from_authid
my $auth = Koha::MetadataRecord::Authority->get_from_authid($authid);
Create the Koha::MetadataRecord::Authority object associated with the provided authid.
Note that this routine currently retrieves a MARC record because
authorities in Koha are MARC records by definition. This is an
unfortunate but unavoidable fact.
=cut
sub get_from_authid {
my $class = shift;
my $authid = shift;
my $marcflavour = lc C4::Context->preference("marcflavour");
my $dbh=C4::Context->dbh;
my $sth=$dbh->prepare("select authtypecode, marcxml from auth_header where authid=?");
$sth->execute($authid);
my ($authtypecode, $marcxml) = $sth->fetchrow;
my $record=eval {MARC::Record->new_from_xml(StripNonXmlChars($marcxml),'UTF-8',
(C4::Context->preference("marcflavour") eq "UNIMARC"?"UNIMARCAUTH":C4::Context->preference("marcflavour")))};
return if ($@);
$record->encoding('UTF-8');
my $self = $class->SUPER::new( { authid => $authid,
authtypecode => $authtypecode,
schema => $marcflavour,
record => $record });
bless $self, $class;
return $self;
}
=head2 get_from_breeding
my $auth = Koha::MetadataRecord::Authority->get_from_authid($authid);
Create the Koha::MetadataRecord::Authority object associated with the provided authid.
=cut
sub get_from_breeding {
my $class = shift;
my $import_record_id = shift;
my $marcflavour = lc C4::Context->preference("marcflavour");
my $dbh=C4::Context->dbh;
my $sth=$dbh->prepare("select marcxml from import_records where import_record_id=? and record_type='auth';");
$sth->execute($import_record_id);
my $marcxml = $sth->fetchrow;
my $record=eval {MARC::Record->new_from_xml(StripNonXmlChars($marcxml),'UTF-8',
(C4::Context->preference("marcflavour") eq "UNIMARC"?"UNIMARCAUTH":C4::Context->preference("marcflavour")))};
return if ($@);
$record->encoding('UTF-8');
# NOTE: GuessAuthTypeCode has no business in Koha::MetadataRecord::Authority, which is an
# object-oriented class. Eventually perhaps there will be utility
# classes in the Koha:: namespace, but there are not at the moment,
# so this shim seems like the best option all-around.
require C4::AuthoritiesMarc;
my $authtypecode = C4::AuthoritiesMarc::GuessAuthTypeCode($record);
my $self = $class->SUPER::new( {
schema => $marcflavour,
authtypecode => $authtypecode,
record => $record });
bless $self, $class;
return $self;
}
sub authorized_heading {
my ($self) = @_;
if ($self->schema =~ m/marc/) {
return Koha::Util::MARC::getAuthorityAuthorizedHeading($self->record, $self->schema);
}
return;
}
=head2 get_all_authorities_iterator
my $it = Koha::MetadataRecord::Authority->get_all_authorities_iterator();
This will provide an iterator object that will, one by one, provide the
Koha::MetadataRecord::Authority of each authority.
The iterator is a Koha::MetadataIterator object.
=cut
sub get_all_authorities_iterator {
my $database = Koha::Database->new();
my $schema = $database->schema();
my $rs =
$schema->resultset('AuthHeader')->search( { marcxml => { '!=', undef } },
{ columns => [qw/ authid authtypecode marcxml /] } );
my $next_func = sub {
my $row = $rs->next();
return if !$row;
my $authid = $row->authid;
my $authtypecode = $row->authtypecode;
my $marcxml = $row->marcxml;
my $record = eval {
MARC::Record->new_from_xml(
StripNonXmlChars($marcxml),
'UTF-8',
(
C4::Context->preference("marcflavour") eq "UNIMARC"
? "UNIMARCAUTH"
: C4::Context->preference("marcflavour")
)
);
};
confess "$@" if ($@);
$record->encoding('UTF-8');
# I'm not sure why we don't use the authtypecode from the database,
# but this is how the original code does it.
require C4::AuthoritiesMarc;
$authtypecode = C4::AuthoritiesMarc::GuessAuthTypeCode($record);
my $auth = __PACKAGE__->new( $record, { authid => $authid, id => $authid, authtypecode => $authtypecode } );
return $auth;
};
return Koha::MetadataIterator->new($next_func);
}
1;