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 (+3 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;
(-)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/installer/data/mysql/sysprefs.sql (-1 / +2 lines)
Lines 479-483 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
479
('XSLTDetailsDisplay','default','','Enable XSL stylesheet control over details page display on intranet','Free'),
479
('XSLTDetailsDisplay','default','','Enable XSL stylesheet control over details page display on intranet','Free'),
480
('XSLTResultsDisplay','default','','Enable XSL stylesheet control over results page display on intranet','Free'),
480
('XSLTResultsDisplay','default','','Enable XSL stylesheet control over results page display on intranet','Free'),
481
('z3950AuthorAuthFields','701,702,700',NULL,'Define the MARC biblio fields for Personal Name Authorities to fill biblio.author','free'),
481
('z3950AuthorAuthFields','701,702,700',NULL,'Define the MARC biblio fields for Personal Name Authorities to fill biblio.author','free'),
482
('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo')
482
('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo'),
483
('OAI-PMH:DeletedRecord','persistent','Koha\'s deletedbiblio table will never be deleted (persistent) or might be deleted (transient)','transient|persistent','Choice')
483
;
484
;
(-)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