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 1610-1616 CREATE TABLE `oai_sets_biblios` ( Link Here
1610
  `biblionumber` int(11) NOT NULL,
1610
  `biblionumber` int(11) NOT NULL,
1611
  `set_id` int(11) NOT NULL,
1611
  `set_id` int(11) NOT NULL,
1612
  PRIMARY KEY (`biblionumber`, `set_id`),
1612
  PRIMARY KEY (`biblionumber`, `set_id`),
1613
  CONSTRAINT `oai_sets_biblios_ibfk_1` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1614
  CONSTRAINT `oai_sets_biblios_ibfk_2` FOREIGN KEY (`set_id`) REFERENCES `oai_sets` (`id`) 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
1615
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1614
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1616
1615
(-)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 152-158 sub new { Link Here
152
        MaxCount            => C4::Context->preference("OAI-PMH:MaxCount"),
152
        MaxCount            => C4::Context->preference("OAI-PMH:MaxCount"),
153
        granularity         => 'YYYY-MM-DD',
153
        granularity         => 'YYYY-MM-DD',
154
        earliestDatestamp   => '0001-01-01',
154
        earliestDatestamp   => '0001-01-01',
155
        deletedRecord       => 'no',
155
        deletedRecord       => C4::Context->preference("OAI-PMH:DeletedRecord") || 'no',
156
    );
156
    );
157
157
158
    # FIXME - alas, the description element is not so simple; to validate
158
    # FIXME - alas, the description element is not so simple; to validate
Lines 252-257 sub new { Link Here
252
252
253
# __END__ C4::OAI::Record
253
# __END__ C4::OAI::Record
254
254
255
package C4::OAI::DeletedRecord;
256
257
use strict;
258
use warnings;
259
use HTTP::OAI;
260
use HTTP::OAI::Metadata::OAI_DC;
261
262
use base ("HTTP::OAI::Record");
263
264
sub new {
265
    my ($class, $timestamp, $setSpecs, %args) = @_;
266
267
    my $self = $class->SUPER::new(%args);
268
269
    $timestamp =~ s/ /T/, $timestamp .= 'Z';
270
    $self->header( new HTTP::OAI::Header(
271
        status      => 'deleted',
272
        identifier  => $args{identifier},
273
        datestamp   => $timestamp,
274
    ) );
275
276
    foreach my $setSpec (@$setSpecs) {
277
        $self->header->setSpec($setSpec);
278
    }
279
280
    return $self;
281
}
282
283
# __END__ C4::OAI::DeletedRecord
284
255
285
256
286
257
package C4::OAI::GetRecord;
287
package C4::OAI::GetRecord;
Lines 278-284 sub new { Link Here
278
    my ($biblionumber) = $args{identifier} =~ /^$prefix(.*)/;
308
    my ($biblionumber) = $args{identifier} =~ /^$prefix(.*)/;
279
    $sth->execute( $biblionumber );
309
    $sth->execute( $biblionumber );
280
    my ($marcxml, $timestamp);
310
    my ($marcxml, $timestamp);
311
    my $deleted = 0;
281
    unless ( ($marcxml, $timestamp) = $sth->fetchrow ) {
312
    unless ( ($marcxml, $timestamp) = $sth->fetchrow ) {
313
      $sth = $dbh->prepare("
314
        SELECT biblionumber, timestamp
315
        FROM deletedbiblio
316
        WHERE biblionumber=? " );
317
      $sth->execute( $biblionumber );
318
319
      unless ( ($marcxml, $timestamp) = $sth->fetchrow ) {
320
282
        return HTTP::OAI::Response->new(
321
        return HTTP::OAI::Response->new(
283
            requestURL  => $repository->self_url(),
322
            requestURL  => $repository->self_url(),
284
            errors      => [ new HTTP::OAI::Error(
323
            errors      => [ new HTTP::OAI::Error(
Lines 286-293 sub new { Link Here
286
                message => "There is no biblio record with this identifier",
325
                message => "There is no biblio record with this identifier",
287
                ) ] ,
326
                ) ] ,
288
        );
327
        );
328
      } else {
329
        $deleted = 1;
330
      }
289
    }
331
    }
290
291
    my $oai_sets = GetOAISetsBiblio($biblionumber);
332
    my $oai_sets = GetOAISetsBiblio($biblionumber);
292
    my @setSpecs;
333
    my @setSpecs;
293
    foreach (@$oai_sets) {
334
    foreach (@$oai_sets) {
Lines 295-303 sub new { Link Here
295
    }
336
    }
296
337
297
    #$self->header( HTTP::OAI::Header->new( identifier  => $args{identifier} ) );
338
    #$self->header( HTTP::OAI::Header->new( identifier  => $args{identifier} ) );
298
    $self->record( C4::OAI::Record->new(
339
    ($deleted == 1) ? $self->record( C4::OAI::DeletedRecord->new(
340
        $timestamp, \@setSpecs, %args ) )
341
        : $self->record( C4::OAI::Record->new(
299
        $repository, $marcxml, $timestamp, \@setSpecs, %args ) );
342
        $repository, $marcxml, $timestamp, \@setSpecs, %args ) );
300
301
    return $self;
343
    return $self;
302
}
344
}
303
345
Lines 328-346 sub new { Link Here
328
    }
370
    }
329
    my $max = $repository->{koha_max_count};
371
    my $max = $repository->{koha_max_count};
330
    my $sql = "
372
    my $sql = "
331
        SELECT biblioitems.biblionumber, biblioitems.timestamp
373
        (SELECT biblioitems.biblionumber, timestamp
332
        FROM biblioitems
374
        FROM biblioitems
333
    ";
375
    ";
334
    $sql .= " JOIN oai_sets_biblios ON biblioitems.biblionumber = oai_sets_biblios.biblionumber " if defined $set;
376
    $sql .= " JOIN oai_sets_biblios ON biblioitems.biblionumber = oai_sets_biblios.biblionumber " if defined $set;
335
    $sql .= " WHERE timestamp >= ? AND timestamp <= ? ";
377
    $sql .= " WHERE timestamp >= ? AND timestamp <= ? ";
336
    $sql .= " AND oai_sets_biblios.set_id = ? " if defined $set;
378
    $sql .= " AND oai_sets_biblios.set_id = ? " if defined $set;
337
    $sql .= "
379
    $sql .= ") UNION
380
        (SELECT deletedbiblio.biblionumber, timestamp FROM deletedbiblio";
381
    $sql .= " JOIN oai_sets_biblios ON deletedbiblio.biblionumber = oai_sets_biblios.biblionumber " if defined $set;
382
    $sql .= " WHERE DATE(timestamp) >= ? AND DATE(timestamp) <= ? ";
383
    $sql .= " AND oai_sets_biblios.set_id = ? " if defined $set;
384
385
    $sql .= ") ORDER BY biblionumber
338
        LIMIT " . ($max+1) . "
386
        LIMIT " . ($max+1) . "
339
        OFFSET $token->{offset}
387
        OFFSET $token->{offset}
340
    ";
388
    ";
341
    my $sth = $dbh->prepare( $sql );
389
    my $sth = $dbh->prepare( $sql );
342
    my @bind_params = ($token->{'from_arg'}, $token->{'until_arg'});
390
    my @bind_params = ($token->{'from_arg'}, $token->{'until_arg'});
343
    push @bind_params, $set->{'id'} if defined $set;
391
    push @bind_params, $set->{'id'} if defined $set;
392
    push @bind_params, ($token->{'from'}, $token->{'until'});
393
    push @bind_params, $set->{'id'} if defined $set;
344
    $sth->execute( @bind_params );
394
    $sth->execute( @bind_params );
345
395
346
    my $count = 0;
396
    my $count = 0;
Lines 485-504 sub new { Link Here
485
    }
535
    }
486
    my $max = $repository->{koha_max_count};
536
    my $max = $repository->{koha_max_count};
487
    my $sql = "
537
    my $sql = "
488
        SELECT biblioitems.biblionumber, biblioitems.marcxml, biblioitems.timestamp
538
        (SELECT biblioitems.biblionumber, marcxml, timestamp
489
        FROM biblioitems
539
        FROM biblioitems
490
    ";
540
    ";
491
    $sql .= " JOIN oai_sets_biblios ON biblioitems.biblionumber = oai_sets_biblios.biblionumber " if defined $set;
541
    $sql .= " JOIN oai_sets_biblios ON biblioitems.biblionumber = oai_sets_biblios.biblionumber " if defined $set;
492
    $sql .= " WHERE timestamp >= ? AND timestamp <= ? ";
542
    $sql .= " WHERE timestamp >= ? AND timestamp <= ? ";
493
    $sql .= " AND oai_sets_biblios.set_id = ? " if defined $set;
543
    $sql .= " AND oai_sets_biblios.set_id = ? " if defined $set;
494
    $sql .= "
544
    $sql .= ") UNION
545
        (SELECT deletedbiblio.biblionumber, null as marcxml, timestamp FROM deletedbiblio";
546
    $sql .= " JOIN oai_sets_biblios ON deletedbiblio.biblionumber = oai_sets_biblios.biblionumber " if defined $set;
547
    $sql .= " WHERE DATE(timestamp) >= ? AND DATE(timestamp) <= ? ";
548
    $sql .= " AND oai_sets_biblios.set_id = ? " if defined $set;
549
550
    $sql .= ") ORDER BY biblionumber
495
        LIMIT " . ($max + 1) . "
551
        LIMIT " . ($max + 1) . "
496
        OFFSET $token->{offset}
552
        OFFSET $token->{offset}
497
    ";
553
    ";
498
499
    my $sth = $dbh->prepare( $sql );
554
    my $sth = $dbh->prepare( $sql );
500
    my @bind_params = ($token->{'from_arg'}, $token->{'until_arg'});
555
    my @bind_params = ($token->{'from_arg'}, $token->{'until_arg'});
501
    push @bind_params, $set->{'id'} if defined $set;
556
    push @bind_params, $set->{'id'} if defined $set;
557
    push @bind_params, ($token->{'from'}, $token->{'until'});
558
    push @bind_params, $set->{'id'} if defined $set;
502
    $sth->execute( @bind_params );
559
    $sth->execute( @bind_params );
503
560
504
    my $count = 0;
561
    my $count = 0;
Lines 521-531 sub new { Link Here
521
        foreach (@$oai_sets) {
578
        foreach (@$oai_sets) {
522
            push @setSpecs, $_->{spec};
579
            push @setSpecs, $_->{spec};
523
        }
580
        }
524
        $self->record( C4::OAI::Record->new(
581
        if ($marcxml) {
525
            $repository, $marcxml, $timestamp, \@setSpecs,
582
          $self->record( C4::OAI::Record->new(
526
            identifier      => $repository->{ koha_identifier } . ':' . $biblionumber,
583
              $repository, $marcxml, $timestamp, \@setSpecs,
527
            metadataPrefix  => $token->{metadata_prefix}
584
              identifier      => $repository->{ koha_identifier } . ':' . $biblionumber,
528
        ) );
585
              metadataPrefix  => $token->{metadata_prefix}
586
          ) );
587
        } else {
588
          $self->record( C4::OAI::DeletedRecord->new(
589
          $timestamp, \@setSpecs, identifier => $repository->{ koha_identifier } . ':' . $biblionumber ) );
590
        }
529
    }
591
    }
530
592
531
    return $self;
593
    return $self;
532
- 

Return to bug 3206