Lines 140-146
sub new {
Link Here
|
140 |
MaxCount => C4::Context->preference("OAI-PMH:MaxCount"), |
140 |
MaxCount => C4::Context->preference("OAI-PMH:MaxCount"), |
141 |
granularity => 'YYYY-MM-DD', |
141 |
granularity => 'YYYY-MM-DD', |
142 |
earliestDatestamp => '0001-01-01', |
142 |
earliestDatestamp => '0001-01-01', |
143 |
deletedRecord => 'no', |
143 |
deletedRecord => C4::Context->preference("OAI-PMH:DeletedRecord") || 'no', |
144 |
); |
144 |
); |
145 |
|
145 |
|
146 |
# FIXME - alas, the description element is not so simple; to validate |
146 |
# FIXME - alas, the description element is not so simple; to validate |
Lines 240-245
sub new {
Link Here
|
240 |
|
240 |
|
241 |
# __END__ C4::OAI::Record |
241 |
# __END__ C4::OAI::Record |
242 |
|
242 |
|
|
|
243 |
package C4::OAI::DeletedRecord; |
244 |
|
245 |
use strict; |
246 |
use warnings; |
247 |
use HTTP::OAI; |
248 |
use HTTP::OAI::Metadata::OAI_DC; |
249 |
|
250 |
use base ("HTTP::OAI::Record"); |
251 |
|
252 |
sub new { |
253 |
my ($class, $timestamp, $setSpecs, %args) = @_; |
254 |
|
255 |
my $self = $class->SUPER::new(%args); |
256 |
|
257 |
$timestamp =~ s/ /T/, $timestamp .= 'Z'; |
258 |
$self->header( new HTTP::OAI::Header( |
259 |
status => 'deleted', |
260 |
identifier => $args{identifier}, |
261 |
datestamp => $timestamp, |
262 |
) ); |
263 |
|
264 |
foreach my $setSpec (@$setSpecs) { |
265 |
$self->header->setSpec($setSpec); |
266 |
} |
267 |
|
268 |
return $self; |
269 |
} |
270 |
|
271 |
# __END__ C4::OAI::DeletedRecord |
272 |
|
243 |
|
273 |
|
244 |
|
274 |
|
245 |
package C4::OAI::GetRecord; |
275 |
package C4::OAI::GetRecord; |
Lines 266-272
sub new {
Link Here
|
266 |
my ($biblionumber) = $args{identifier} =~ /^$prefix(.*)/; |
296 |
my ($biblionumber) = $args{identifier} =~ /^$prefix(.*)/; |
267 |
$sth->execute( $biblionumber ); |
297 |
$sth->execute( $biblionumber ); |
268 |
my ($marcxml, $timestamp); |
298 |
my ($marcxml, $timestamp); |
|
|
299 |
my $deleted = 0; |
269 |
unless ( ($marcxml, $timestamp) = $sth->fetchrow ) { |
300 |
unless ( ($marcxml, $timestamp) = $sth->fetchrow ) { |
|
|
301 |
$sth = $dbh->prepare(" |
302 |
SELECT biblionumber, timestamp |
303 |
FROM deletedbiblio |
304 |
WHERE biblionumber=? " ); |
305 |
$sth->execute( $biblionumber ); |
306 |
|
307 |
unless ( ($marcxml, $timestamp) = $sth->fetchrow ) { |
308 |
|
270 |
return HTTP::OAI::Response->new( |
309 |
return HTTP::OAI::Response->new( |
271 |
requestURL => $repository->self_url(), |
310 |
requestURL => $repository->self_url(), |
272 |
errors => [ new HTTP::OAI::Error( |
311 |
errors => [ new HTTP::OAI::Error( |
Lines 274-281
sub new {
Link Here
|
274 |
message => "There is no biblio record with this identifier", |
313 |
message => "There is no biblio record with this identifier", |
275 |
) ] , |
314 |
) ] , |
276 |
); |
315 |
); |
|
|
316 |
} else { |
317 |
$deleted = 1; |
318 |
} |
277 |
} |
319 |
} |
278 |
|
|
|
279 |
my $oai_sets = GetOAISetsBiblio($biblionumber); |
320 |
my $oai_sets = GetOAISetsBiblio($biblionumber); |
280 |
my @setSpecs; |
321 |
my @setSpecs; |
281 |
foreach (@$oai_sets) { |
322 |
foreach (@$oai_sets) { |
Lines 283-291
sub new {
Link Here
|
283 |
} |
324 |
} |
284 |
|
325 |
|
285 |
#$self->header( HTTP::OAI::Header->new( identifier => $args{identifier} ) ); |
326 |
#$self->header( HTTP::OAI::Header->new( identifier => $args{identifier} ) ); |
286 |
$self->record( C4::OAI::Record->new( |
327 |
($deleted == 1) ? $self->record( C4::OAI::DeletedRecord->new( |
|
|
328 |
$timestamp, \@setSpecs, %args ) ) |
329 |
: $self->record( C4::OAI::Record->new( |
287 |
$repository, $marcxml, $timestamp, \@setSpecs, %args ) ); |
330 |
$repository, $marcxml, $timestamp, \@setSpecs, %args ) ); |
288 |
|
|
|
289 |
return $self; |
331 |
return $self; |
290 |
} |
332 |
} |
291 |
|
333 |
|
Lines 316-334
sub new {
Link Here
|
316 |
} |
358 |
} |
317 |
my $max = $repository->{koha_max_count}; |
359 |
my $max = $repository->{koha_max_count}; |
318 |
my $sql = " |
360 |
my $sql = " |
319 |
SELECT biblioitems.biblionumber, biblioitems.timestamp |
361 |
(SELECT biblioitems.biblionumber, timestamp |
320 |
FROM biblioitems |
362 |
FROM biblioitems |
321 |
"; |
363 |
"; |
322 |
$sql .= " JOIN oai_sets_biblios ON biblioitems.biblionumber = oai_sets_biblios.biblionumber " if defined $set; |
364 |
$sql .= " JOIN oai_sets_biblios ON biblioitems.biblionumber = oai_sets_biblios.biblionumber " if defined $set; |
323 |
$sql .= " WHERE DATE(timestamp) >= ? AND DATE(timestamp) <= ? "; |
365 |
$sql .= " WHERE DATE(timestamp) >= ? AND DATE(timestamp) <= ? "; |
324 |
$sql .= " AND oai_sets_biblios.set_id = ? " if defined $set; |
366 |
$sql .= " AND oai_sets_biblios.set_id = ? " if defined $set; |
325 |
$sql .= " |
367 |
$sql .= ") UNION |
|
|
368 |
(SELECT deletedbiblio.biblionumber, timestamp FROM deletedbiblio"; |
369 |
$sql .= " JOIN oai_sets_biblios ON deletedbiblio.biblionumber = oai_sets_biblios.biblionumber " if defined $set; |
370 |
$sql .= " WHERE DATE(timestamp) >= ? AND DATE(timestamp) <= ? "; |
371 |
$sql .= " AND oai_sets_biblios.set_id = ? " if defined $set; |
372 |
|
373 |
$sql .= ") ORDER BY biblionumber |
326 |
LIMIT " . ($max+1) . " |
374 |
LIMIT " . ($max+1) . " |
327 |
OFFSET $token->{offset} |
375 |
OFFSET $token->{offset} |
328 |
"; |
376 |
"; |
329 |
my $sth = $dbh->prepare( $sql ); |
377 |
my $sth = $dbh->prepare( $sql ); |
330 |
my @bind_params = ($token->{'from'}, $token->{'until'}); |
378 |
my @bind_params = ($token->{'from'}, $token->{'until'}); |
331 |
push @bind_params, $set->{'id'} if defined $set; |
379 |
push @bind_params, $set->{'id'} if defined $set; |
|
|
380 |
push @bind_params, ($token->{'from'}, $token->{'until'}); |
381 |
push @bind_params, $set->{'id'} if defined $set; |
332 |
$sth->execute( @bind_params ); |
382 |
$sth->execute( @bind_params ); |
333 |
|
383 |
|
334 |
my $count = 0; |
384 |
my $count = 0; |
Lines 473-492
sub new {
Link Here
|
473 |
} |
523 |
} |
474 |
my $max = $repository->{koha_max_count}; |
524 |
my $max = $repository->{koha_max_count}; |
475 |
my $sql = " |
525 |
my $sql = " |
476 |
SELECT biblioitems.biblionumber, biblioitems.marcxml, biblioitems.timestamp |
526 |
(SELECT biblioitems.biblionumber, marcxml, timestamp |
477 |
FROM biblioitems |
527 |
FROM biblioitems |
478 |
"; |
528 |
"; |
479 |
$sql .= " JOIN oai_sets_biblios ON biblioitems.biblionumber = oai_sets_biblios.biblionumber " if defined $set; |
529 |
$sql .= " JOIN oai_sets_biblios ON biblioitems.biblionumber = oai_sets_biblios.biblionumber " if defined $set; |
480 |
$sql .= " WHERE DATE(timestamp) >= ? AND DATE(timestamp) <= ? "; |
530 |
$sql .= " WHERE DATE(timestamp) >= ? AND DATE(timestamp) <= ? "; |
481 |
$sql .= " AND oai_sets_biblios.set_id = ? " if defined $set; |
531 |
$sql .= " AND oai_sets_biblios.set_id = ? " if defined $set; |
482 |
$sql .= " |
532 |
$sql .= ") UNION |
|
|
533 |
(SELECT deletedbiblio.biblionumber, null as marcxml, timestamp FROM deletedbiblio"; |
534 |
$sql .= " JOIN oai_sets_biblios ON deletedbiblio.biblionumber = oai_sets_biblios.biblionumber " if defined $set; |
535 |
$sql .= " WHERE DATE(timestamp) >= ? AND DATE(timestamp) <= ? "; |
536 |
$sql .= " AND oai_sets_biblios.set_id = ? " if defined $set; |
537 |
|
538 |
$sql .= ") ORDER BY biblionumber |
483 |
LIMIT " . ($max + 1) . " |
539 |
LIMIT " . ($max + 1) . " |
484 |
OFFSET $token->{offset} |
540 |
OFFSET $token->{offset} |
485 |
"; |
541 |
"; |
486 |
|
|
|
487 |
my $sth = $dbh->prepare( $sql ); |
542 |
my $sth = $dbh->prepare( $sql ); |
488 |
my @bind_params = ($token->{'from'}, $token->{'until'}); |
543 |
my @bind_params = ($token->{'from'}, $token->{'until'}); |
489 |
push @bind_params, $set->{'id'} if defined $set; |
544 |
push @bind_params, $set->{'id'} if defined $set; |
|
|
545 |
push @bind_params, ($token->{'from'}, $token->{'until'}); |
546 |
push @bind_params, $set->{'id'} if defined $set; |
490 |
$sth->execute( @bind_params ); |
547 |
$sth->execute( @bind_params ); |
491 |
|
548 |
|
492 |
my $count = 0; |
549 |
my $count = 0; |
Lines 509-519
sub new {
Link Here
|
509 |
foreach (@$oai_sets) { |
566 |
foreach (@$oai_sets) { |
510 |
push @setSpecs, $_->{spec}; |
567 |
push @setSpecs, $_->{spec}; |
511 |
} |
568 |
} |
512 |
$self->record( C4::OAI::Record->new( |
569 |
if ($marcxml) { |
513 |
$repository, $marcxml, $timestamp, \@setSpecs, |
570 |
$self->record( C4::OAI::Record->new( |
514 |
identifier => $repository->{ koha_identifier } . ':' . $biblionumber, |
571 |
$repository, $marcxml, $timestamp, \@setSpecs, |
515 |
metadataPrefix => $token->{metadata_prefix} |
572 |
identifier => $repository->{ koha_identifier } . ':' . $biblionumber, |
516 |
) ); |
573 |
metadataPrefix => $token->{metadata_prefix} |
|
|
574 |
) ); |
575 |
} else { |
576 |
$self->record( C4::OAI::DeletedRecord->new( |
577 |
$timestamp, \@setSpecs, identifier => $repository->{ koha_identifier } . ':' . $biblionumber ) ); |
578 |
} |
517 |
} |
579 |
} |
518 |
|
580 |
|
519 |
return $self; |
581 |
return $self; |
520 |
- |
|
|