Main Koha release repository https://koha-community.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

238 lines
6.9 KiB

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, see <http://www.gnu.org/licenses>.
=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(%options);
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.
Possible options are:
=over 4
=item C<slice>
slice may be defined as a hash of two values: index and count. index
is the slice number to process and count is total number of slices.
With this information the iterator returns just the given slice of
records instead of all.
=back
=cut
sub get_all_authorities_iterator {
my ($self, %options) = @_;
my $search_terms = {
marcxml => { '!=', undef }
};
my ($slice_modulo, $slice_count);
if ($options{slice}) {
$slice_count = $options{slice}->{count};
$slice_modulo = $options{slice}->{index};
$search_terms = {
'-and' => [
%{$search_terms},
\[ 'mod(authid, ?) = ?', $slice_count, $slice_modulo ]
]
};
}
my $search_options->{columns} = [qw/ authid authtypecode marcxml /];
if ($options{desc}) {
$search_options->{order_by} = { -desc => 'authid' };
}
my $database = Koha::Database->new();
my $schema = $database->schema();
my $rs =
$schema->resultset('AuthHeader')->search(
$search_terms,
$search_options);
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;