Bug 24809: (QA follow-up) Add prefix to prevent disambiguity
[koha.git] / Koha / OAI / Server / GetRecord.pm
1 # Copyright Tamil s.a.r.l. 2008-2015
2 # Copyright Biblibre 2008-2015
3 #
4 # This file is part of Koha.
5 #
6 # Koha is free software; you can redistribute it and/or modify it
7 # under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # Koha is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with Koha; if not, see <http://www.gnu.org/licenses>.
18
19 package Koha::OAI::Server::GetRecord;
20
21 use Modern::Perl;
22 use HTTP::OAI;
23 use C4::Biblio;
24 use C4::OAI::Sets;
25 use MARC::File::XML;
26
27 use base ("HTTP::OAI::GetRecord");
28
29
30 sub new {
31     my ($class, $repository, %args) = @_;
32
33     my $self = HTTP::OAI::GetRecord->new(%args);
34
35     my $prefix = $repository->{koha_identifier} . ':';
36     my ($biblionumber) = $args{identifier} =~ /^$prefix(.*)/;
37     my $items_included = $repository->items_included( $args{metadataPrefix} );
38     my $dbh = C4::Context->dbh;
39     my $sql = "
40         SELECT timestamp
41         FROM   biblioitems
42         WHERE  biblionumber=?
43     ";
44     my @bind_params = ($biblionumber);
45     if ( $items_included ) {
46         # Take latest timestamp of biblio and any items
47         # Or timestamp of deleted items where bib not deleted
48         $sql .= "
49             UNION
50             SELECT deleteditems.timestamp FROM deleteditems JOIN biblio USING (biblionumber)
51             WHERE deleteditems.biblionumber=?
52             UNION
53             SELECT timestamp from items
54             WHERE biblionumber=?
55         ";
56         push @bind_params, $biblionumber;
57         push @bind_params, $biblionumber;
58         $sql = "
59             SELECT max(timestamp)
60             FROM ($sql) bib
61         ";
62     }
63
64     my $sth = $dbh->prepare( $sql ) || die( 'Could not prepare statement: ' . $dbh->errstr );
65     $sth->execute( @bind_params ) || die( 'Could not execute statement: ' . $sth->errstr );
66     my ($timestamp, $deleted);
67     unless ( ($timestamp = $sth->fetchrow) ) {
68         $sql = "
69             SELECT timestamp
70             FROM deletedbiblio
71             WHERE biblionumber=?
72         ";
73         @bind_params = ($biblionumber);
74
75         if ( $items_included ) {
76             # Take latest timestamp among biblio and items
77             $sql .= "
78                 UNION
79                 SELECT timestamp from deleteditems
80                 WHERE biblionumber=?
81             ";
82             push @bind_params, $biblionumber;
83             $sql = "
84                 SELECT max(timestamp)
85                 FROM ($sql) bib
86             ";
87         }
88
89         $sth = $dbh->prepare($sql) || die('Could not prepare statement: ' . $dbh->errstr);
90         $sth->execute( @bind_params ) || die('Could not execute statement: ' . $sth->errstr);
91         unless ( ($timestamp = $sth->fetchrow) )
92         {
93             return HTTP::OAI::Response->new(
94              requestURL  => $repository->self_url(),
95              errors      => [ new HTTP::OAI::Error(
96                 code    => 'idDoesNotExist',
97                 message => "There is no biblio record with this identifier",
98                 ) ],
99             );
100         }
101         $deleted = 1;
102     }
103
104     my $oai_sets = GetOAISetsBiblio($biblionumber);
105     my @setSpecs;
106     foreach (@$oai_sets) {
107         push @setSpecs, $_->{spec};
108     }
109
110     if ($deleted) {
111         $self->record(
112             Koha::OAI::Server::DeletedRecord->new($timestamp, \@setSpecs, %args)
113         );
114     } else {
115         # We fetch it using this method, rather than the database directly,
116         # so it'll include the item data
117         my $marcxml;
118         $marcxml = $repository->get_biblio_marcxml($biblionumber, $args{metadataPrefix})
119             unless $deleted;
120
121         $self->record(
122             Koha::OAI::Server::Record->new($repository, $marcxml, $timestamp, \@setSpecs, %args)
123         );
124     }
125     return $self;
126 }
127
128 1;