1 package Koha
::MetadataRecord
::Authority
;
3 # Copyright 2012 C & P Bibliography Services
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
22 Koha::MetadataRecord::Authority - class to encapsulate authority records in Koha
26 Object-oriented class that encapsulates authority records in Koha.
43 use base
qw(Koha::MetadataRecord);
45 __PACKAGE__
->mk_accessors(qw( authid authtypecode ));
49 my $auth = Koha::MetadataRecord::Authority->new($record);
51 Create a new Koha::MetadataRecord::Authority object based on the provided record.
56 my ( $class, $record, $params ) = @_;
59 my $self = $class->SUPER::new
(
62 'schema' => lc C4
::Context
->preference("marcflavour"),
72 =head2 get_from_authid
74 my $auth = Koha::MetadataRecord::Authority->get_from_authid($authid);
76 Create the Koha::MetadataRecord::Authority object associated with the provided authid.
77 Note that this routine currently retrieves a MARC record because
78 authorities in Koha are MARC records by definition. This is an
79 unfortunate but unavoidable fact.
86 my $marcflavour = lc C4
::Context
->preference("marcflavour");
88 my $dbh=C4
::Context
->dbh;
89 my $sth=$dbh->prepare("select authtypecode, marcxml from auth_header where authid=?");
90 $sth->execute($authid);
91 my ($authtypecode, $marcxml) = $sth->fetchrow;
92 my $record=eval {MARC
::Record
->new_from_xml(StripNonXmlChars
($marcxml),'UTF-8',
93 (C4
::Context
->preference("marcflavour") eq "UNIMARC"?
"UNIMARCAUTH":C4
::Context
->preference("marcflavour")))};
95 $record->encoding('UTF-8');
97 my $self = $class->SUPER::new
( { authid
=> $authid,
98 authtypecode
=> $authtypecode,
99 schema
=> $marcflavour,
100 record
=> $record });
106 =head2 get_from_breeding
108 my $auth = Koha::MetadataRecord::Authority->get_from_authid($authid);
110 Create the Koha::MetadataRecord::Authority object associated with the provided authid.
114 sub get_from_breeding
{
116 my $import_record_id = shift;
117 my $marcflavour = lc C4
::Context
->preference("marcflavour");
119 my $dbh=C4
::Context
->dbh;
120 my $sth=$dbh->prepare("select marcxml from import_records where import_record_id=? and record_type='auth';");
121 $sth->execute($import_record_id);
122 my $marcxml = $sth->fetchrow;
123 my $record=eval {MARC
::Record
->new_from_xml(StripNonXmlChars
($marcxml),'UTF-8',
124 (C4
::Context
->preference("marcflavour") eq "UNIMARC"?
"UNIMARCAUTH":C4
::Context
->preference("marcflavour")))};
126 $record->encoding('UTF-8');
128 # NOTE: GuessAuthTypeCode has no business in Koha::MetadataRecord::Authority, which is an
129 # object-oriented class. Eventually perhaps there will be utility
130 # classes in the Koha:: namespace, but there are not at the moment,
131 # so this shim seems like the best option all-around.
132 require C4
::AuthoritiesMarc
;
133 my $authtypecode = C4
::AuthoritiesMarc
::GuessAuthTypeCode
($record);
135 my $self = $class->SUPER::new
( {
136 schema
=> $marcflavour,
137 authtypecode
=> $authtypecode,
138 record
=> $record });
144 sub authorized_heading
{
146 if ($self->schema =~ m/marc/) {
147 return Koha
::Util
::MARC
::getAuthorityAuthorizedHeading
($self->record, $self->schema);
152 =head2 get_all_authorities_iterator
154 my $it = Koha::MetadataRecord::Authority->get_all_authorities_iterator(%options);
156 This will provide an iterator object that will, one by one, provide the
157 Koha::MetadataRecord::Authority of each authority.
159 The iterator is a Koha::MetadataIterator object.
161 Possible options are:
167 slice may be defined as a hash of two values: index and count. index
168 is the slice number to process and count is total number of slices.
169 With this information the iterator returns just the given slice of
170 records instead of all.
176 sub get_all_authorities_iterator
{
177 my ($self, %options) = @_;
180 marcxml
=> { '!=', undef }
182 my ($slice_modulo, $slice_count);
183 if ($options{slice
}) {
184 $slice_count = $options{slice
}->{count
};
185 $slice_modulo = $options{slice
}->{index};
189 \
[ 'mod(authid, ?) = ?', $slice_count, $slice_modulo ]
194 my $database = Koha
::Database
->new();
195 my $schema = $database->schema();
197 $schema->resultset('AuthHeader')->search(
199 { columns
=> [qw
/ authid authtypecode marcxml /] } );
200 my $next_func = sub {
201 my $row = $rs->next();
203 my $authid = $row->authid;
204 my $authtypecode = $row->authtypecode;
205 my $marcxml = $row->marcxml;
208 MARC
::Record
->new_from_xml(
209 StripNonXmlChars
($marcxml),
212 C4
::Context
->preference("marcflavour") eq "UNIMARC"
214 : C4
::Context
->preference("marcflavour")
218 confess
"$@" if ($@
);
219 $record->encoding('UTF-8');
221 # I'm not sure why we don't use the authtypecode from the database,
222 # but this is how the original code does it.
223 require C4
::AuthoritiesMarc
;
224 $authtypecode = C4
::AuthoritiesMarc
::GuessAuthTypeCode
($record);
226 my $auth = __PACKAGE__
->new( $record, { authid
=> $authid, id
=> $authid, authtypecode
=> $authtypecode } );
230 return Koha
::MetadataIterator
->new($next_func);