View | Details | Raw Unified | Return to bug 3206
Collapse All | Expand All

(-)a/installer/data/mysql/atomicupdate/bug_XXXX-add_OAI-PMH_DeletedRecord_syspref.sql (+4 lines)
Line 0 Link Here
1
INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
2
VALUES ('OAI-PMH:DeletedRecord','persistent','Koha\'s deletedbiblio table will never be deleted (persistent) or might be deleted (transient)','transient|persistent','Choice')
3
ALTER TABLE oai_sets_biblios DROP FOREIGN KEY oai_sets_biblios_ibfk_1;
4
(-)a/installer/data/mysql/kohastructure.sql (-1 lines)
Lines 1609-1615 CREATE TABLE `oai_sets_biblios` ( Link Here
1609
  `biblionumber` int(11) NOT NULL,
1609
  `biblionumber` int(11) NOT NULL,
1610
  `set_id` int(11) NOT NULL,
1610
  `set_id` int(11) NOT NULL,
1611
  PRIMARY KEY (`biblionumber`, `set_id`),
1611
  PRIMARY KEY (`biblionumber`, `set_id`),
1612
  CONSTRAINT `oai_sets_biblios_ibfk_1` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1613
  CONSTRAINT `oai_sets_biblios_ibfk_2` FOREIGN KEY (`set_id`) REFERENCES `oai_sets` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
1612
  CONSTRAINT `oai_sets_biblios_ibfk_2` FOREIGN KEY (`set_id`) REFERENCES `oai_sets` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
1614
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1613
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1615
1614
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/web_services.pref (+7 lines)
Lines 27-32 Web services: Link Here
27
                  yes: Enable
27
                  yes: Enable
28
                  no: Disable
28
                  no: Disable
29
            - automatic update of OAI-PMH sets when a bibliographic record is created or updated
29
            - automatic update of OAI-PMH sets when a bibliographic record is created or updated
30
        -
31
            - Koha's deletedbiblio table
32
            - pref: "OAI-PMH:DeletedRecord"
33
              choices:
34
                  persistent: will never be emptied or truncated (persistent)
35
                  transient: might be emptied or truncated at some point (transient)
36
            - "."
30
    ILS-DI:
37
    ILS-DI:
31
        -
38
        -
32
            - pref: ILS-DI
39
            - pref: ILS-DI
(-)a/opac/oai.pl (-15 / +76 lines)
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
- 

Return to bug 3206