From 2841f07758cc0ae000055d075e9092c1726fdb6c Mon Sep 17 00:00:00 2001 From: Robin Sheat Date: Wed, 14 May 2014 14:39:03 +1200 Subject: [PATCH] Bug 12252 - OAI-PMH result includes item data GetRecord for OAI-PMH was pulling the MARCXML directly from the database. Now it uses GetMarcBiblio and includes the item data with it, making it more generally useful. Test plan: * Run an OAI-PMH query, for example: http://koha/cgi-bin/koha/oai.pl?verb=GetRecord&identifier=KOHA-OAI-TEST:52&metadataPrefix=marcxml to fetch biblionumber 52 * Note that it doesn't include the 952 data * Apply the patch * Do the same thing, but this time see that the 952 data is at the bottom of the MARCXML. Note: * This patch also includes a small tidy-up in C4::Biblios to group things semantically a bit better, so I don't spend ages looking for a function that was staring me in the face all along again. Signed-off-by: David Cook Works as described. Simple yet useful patch. Signed-off-by: Jonathan Druart Signed-off-by: Frederic Demians 952/995 item fields are back in response to GetRecord OAI verb. Signed-off-by: Jonathan Druart --- C4/Biblio.pm | 16 ++++++++-------- opac/oai.pl | 61 +++++++++++++++++++++++++++++++++++------------------------- 2 files changed, 44 insertions(+), 33 deletions(-) diff --git a/C4/Biblio.pm b/C4/Biblio.pm index 7e0aa1f..b35778c 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -57,13 +57,14 @@ BEGIN { # to get something push @EXPORT, qw( - &GetBiblio - &GetBiblioData - &GetBiblioItemData - &GetBiblioItemInfosOf - &GetBiblioItemByBiblioNumber - &GetBiblioFromItemNumber - &GetBiblionumberFromItemnumber + GetBiblio + GetBiblioData + GetMarcBiblio + GetBiblioItemData + GetBiblioItemInfosOf + GetBiblioItemByBiblioNumber + GetBiblioFromItemNumber + GetBiblionumberFromItemnumber &GetRecordValue &GetFieldMapping @@ -77,7 +78,6 @@ BEGIN { &GetMarcISBN &GetMarcISSN &GetMarcSubjects - &GetMarcBiblio &GetMarcAuthors &GetMarcSeries &GetMarcHosts diff --git a/opac/oai.pl b/opac/oai.pl index ab56d79..c8fd69f 100755 --- a/opac/oai.pl +++ b/opac/oai.pl @@ -288,7 +288,9 @@ package C4::OAI::GetRecord; use strict; use warnings; use HTTP::OAI; +use C4::Biblio; use C4::OAI::Sets; +use MARC::File::XML; use base ("HTTP::OAI::GetRecord"); @@ -299,31 +301,39 @@ sub new { my $self = HTTP::OAI::GetRecord->new(%args); my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare(" + SELECT timestamp + FROM biblioitems + WHERE biblionumber=? " ); my $prefix = $repository->{koha_identifier} . ':'; my ($biblionumber) = $args{identifier} =~ /^$prefix(.*)/; - my ($marcxml, $timestamp); - my $deleted = 0; - unless ( ($marcxml, $timestamp) = $dbh->selectrow_array(q/ - SELECT marcxml, timestamp - FROM biblioitems - WHERE biblionumber=? /, undef, $biblionumber)) { - - unless ( ($marcxml, $timestamp) = $dbh->selectrow_array(q/ - SELECT biblionumber, timestamp - FROM deletedbiblio - WHERE biblionumber=? /, undef, $biblionumber )) { - - - return HTTP::OAI::Response->new( - requestURL => $repository->self_url(), - errors => [ new HTTP::OAI::Error( + $sth->execute( $biblionumber ); + my ($timestamp); + unless ( ($timestamp) = $sth->fetchrow ) { + unless ( ($timestamp) = $dbh->selectrow_array(q/ + SELECT timestamp + FROM deletedbiblio + WHERE biblionumber=? /, undef, $biblionumber )) + { + return HTTP::OAI::Response->new( + requestURL => $repository->self_url(), + errors => [ new HTTP::OAI::Error( code => 'idDoesNotExist', message => "There is no biblio record with this identifier", - ) ] , - ); - } else { - $deleted = 1; - } + ) ], + ); + } + else { + $deleted = 1; + } + } + + # We fetch it using this method, rather than the database directly, + # so it'll include the item data + my $marcxml; + unless ($deleted) { + my $record = GetMarcBiblio($biblionumber, 1); + $marcxml = $record->as_xml(); } my $oai_sets = GetOAISetsBiblio($biblionumber); my @setSpecs; @@ -332,10 +342,11 @@ sub new { } #$self->header( HTTP::OAI::Header->new( identifier => $args{identifier} ) ); - ($deleted == 1) ? $self->record( C4::OAI::DeletedRecord->new( - $timestamp, \@setSpecs, %args ) ) - : $self->record( C4::OAI::Record->new( - $repository, $marcxml, $timestamp, \@setSpecs, %args ) ); + $self->record( + $deleted + ? C4::OAI::DeletedRecord->new($timestamp, \@setSpecs, %args) + : C4::OAI::Record->new($repository, $marcxml, $timestamp, \@setSpecs, %args); + ); return $self; } -- 2.4.6