Bug 17050: Do not kick the session out when accessing the REST API
[koha.git] / Koha / BiblioUtils.pm
1 package Koha::BiblioUtils;
2
3 # This contains functions to do with managing biblio records.
4
5 # Copyright 2014 Catalyst IT
6 #
7 # This file is part of Koha.
8 #
9 # Koha is free software; you can redistribute it and/or modify it under the
10 # terms of the GNU General Public License as published by the Free Software
11 # Foundation; either version 3 of the License, or (at your option) any later
12 # version.
13 #
14 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
15 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
16 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License along
19 # with Koha; if not, write to the Free Software Foundation, Inc.,
20 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21
22 =head1 NAME
23
24 Koha::BiblioUtils - contains fundamental biblio-related functions
25
26 =head1 DESCRIPTION
27
28 This contains functions for normal operations on biblio records.
29
30 Note: really, C4::Biblio does the main functions, but the Koha namespace is
31 the new thing that should be used.
32
33 =cut
34
35 use C4::Biblio; # EmbedItemsInMarcBiblio
36 use Koha::MetadataIterator;
37 use Koha::Database;
38 use Modern::Perl;
39
40 use Data::Dumper; # TODO remove
41
42 use base qw(Koha::MetadataRecord);
43
44 __PACKAGE__->mk_accessors(qw( record schema id datatype ));
45
46 =head1 FUNCTIONS
47
48 =head2 new
49
50     my $biblio = Koha::BiblioUtils->new($marc_record, [$biblionumber]);
51
52 Creates an instance of C<Koha::BiblioUtils> based on the marc record. If known,
53 the biblionumber can be provided too.
54
55 =cut
56
57 sub new {
58     my $class = shift;
59     my $record = shift;
60     my $biblionumber = shift;
61
62     my $self = $class->SUPER::new(
63         {
64             'record'   => $record,
65             'schema'   => lc C4::Context->preference("marcflavour"),
66             'id'       => $biblionumber,
67             'datatype' => 'biblio',
68         }
69     );
70     bless $self, $class;
71     return $self;
72 }
73
74 =head2 get_from_biblionumber
75
76     my $biblio = Koha::BiblioUtils->get_from_biblionumber($biblionumber, %options);
77
78 This will give you an instance of L<Koha::BiblioUtils> that is the biblio that
79 you requested.
80
81 Options are:
82
83 =over 4
84
85 =item C<$item_data>
86
87 If true, then the item data will be merged into the record when it's loaded.
88
89 =back
90
91 It will return C<undef> if the biblio doesn't exist.
92
93 =cut
94
95 sub get_from_biblionumber {
96     my ($class, $bibnum, %options) = @_;
97
98     my $marc = $class->get_marc_biblio($bibnum, %options);
99     return $class->new($marc, $bibnum);
100 }
101
102 =head2 get_all_biblios_iterator
103
104     my $it = Koha::BiblioUtils->get_all_biblios_iterator();
105
106 This will provide an iterator object that will, one by one, provide the
107 Koha::BiblioUtils of each biblio. This will include the item data.
108
109 The iterator is a Koha::MetadataIterator object.
110
111 =cut
112
113 sub get_all_biblios_iterator {
114     my $database = Koha::Database->new();
115     my $schema   = $database->schema();
116     my $rs =
117       $schema->resultset('Biblio')->search( {},
118         { columns => [qw/ biblionumber /] } );
119     my $next_func = sub {
120         # Warn and skip bad records, otherwise we break the loop
121         while (1) {
122             my $row = $rs->next();
123             return if !$row;
124             my $marc = C4::Biblio::GetMarcBiblio( $row->biblionumber, 1 );
125             my $next = eval {
126                 __PACKAGE__->new($marc, $row->biblionumber);
127             };
128             if ($@) {
129                 warn "Something went wrong reading record for biblio $row->biblionumber: $@\n";
130                 next;
131             }
132             return $next;
133         }
134     };
135     return Koha::MetadataIterator->new($next_func);
136 }
137
138 =head2 get_marc_biblio
139
140     my $marc = Koha::BiblioUtils->get_marc_biblio($bibnum, %options);
141
142 This non-class function fetches the MARC::Record for the given biblio number.
143 Nothing is returned if the biblionumber couldn't be found (or it somehow has no
144 MARC data.)
145
146 Options are:
147
148 =over 4
149
150 =item item_data
151
152 If set to true, item data is embedded in the record. Default is to not do this.
153
154 =back
155
156 =cut
157
158 sub get_marc_biblio {
159     my ($class, $bibnum, %options) = @_;
160
161     return C4::Biblio::GetMarcBiblio( $bibnum, ($options{item_data} ? 1 : 0 ) );
162 }
163
164 1;