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

(-)a/misc/bin/zebraqueue_daemon.pl (-3 / +97 lines)
Lines 227-236 sub process_update { Link Here
227
    my $marcxml;
227
    my $marcxml;
228
    if ($server eq "biblioserver") {
228
    if ($server eq "biblioserver") {
229
        my $marc = GetMarcBiblio($record_number);
229
        my $marc = GetMarcBiblio($record_number);
230
        $marcxml = $marc->as_xml_record() if $marc;
230
        if($marc) {
231
            fix_leader($marc);
232
            if(fix_biblio_ids($dbh, $marc, $record_number)) {
233
                fix_unimarc_100($marc) if C4::Context->preference("marcflavour") eq "UNIMARC";
234
                $marcxml = $marc->as_xml_record();
235
            }
236
        }
231
    } 
237
    } 
232
    elsif ($server eq "authorityserver") {
238
    elsif ($server eq "authorityserver") {
233
        $marcxml = C4::AuthoritiesMarc::GetAuthorityXML($record_number);
239
        my $marc = C4::AuthoritiesMarc::GetAuthority($record_number);
240
        if($marc) {
241
            fix_authority_id($marc, $record_number);
242
            fix_unimarc_100($marc) if C4::Context->preference("marcflavour") eq "UNIMARC";
243
            $marcxml = $marc->as_xml_record();
244
        }
234
    }
245
    }
235
    # check it's XML, just in case
246
    # check it's XML, just in case
236
    eval {
247
    eval {
Lines 442-447 sub get_zebra_connection { Link Here
442
    }
453
    }
443
}
454
}
444
455
456
sub fix_leader {
457
    # FIXME - this routine is suspect
458
    # It blanks the Leader/00-05 and Leader/12-16 to
459
    # force them to be recalculated correct when
460
    # the $marc->as_usmarc() or $marc->as_xml() is called.
461
    # But why is this necessary?  It would be a serious bug
462
    # in MARC::Record (definitely) and MARC::File::XML (arguably) 
463
    # if they are emitting incorrect leader values.
464
    my $marc = shift;
465
466
    my $leader = $marc->leader;
467
    substr($leader,  0, 5) = '     ';
468
    substr($leader, 10, 7) = '22     ';
469
    $marc->leader(substr($leader, 0, 24));
470
}
471
472
sub fix_biblio_ids {
473
    # FIXME - it is essential to ensure that the biblionumber is present,
474
    #         otherwise, Zebra will choke on the record.  However, this
475
    #         logic belongs in the relevant C4::Biblio APIs.
476
    my $dbh = shift;
477
    my $marc = shift;
478
    my $biblionumber = shift;
479
    my $biblioitemnumber;
480
    if (@_) {
481
        $biblioitemnumber = shift;
482
    } else {    
483
        my $sth = $dbh->prepare(
484
            "SELECT biblioitemnumber FROM biblioitems WHERE biblionumber=?");
485
        $sth->execute($biblionumber);
486
        ($biblioitemnumber) = $sth->fetchrow_array;
487
        $sth->finish;
488
        unless ($biblioitemnumber) {
489
            warn "failed to get biblioitemnumber for biblio $biblionumber";
490
            return 0;
491
        }
492
    }
493
494
    # FIXME - this is cheating on two levels
495
    # 1. C4::Biblio::_koha_marc_update_bib_ids is meant to be an internal function
496
    # 2. Making sure that the biblionumber and biblioitemnumber are correct and
497
    #    present in the MARC::Record object ought to be part of GetMarcBiblio.
498
    #
499
    # On the other hand, this better for now than what rebuild_zebra.pl used to
500
    # do, which was duplicate the code for inserting the biblionumber 
501
    # and biblioitemnumber
502
    C4::Biblio::_koha_marc_update_bib_ids($marc, '', $biblionumber, $biblioitemnumber);
503
504
    return 1;
505
}
506
507
sub fix_authority_id {
508
    # FIXME - as with fix_biblio_ids, the authid must be present
509
    #         for Zebra's sake.  However, this really belongs
510
    #         in C4::AuthoritiesMarc.
511
    my ($marc, $authid) = @_;
512
    unless ($marc->field('001') and $marc->field('001')->data() eq $authid){
513
        $marc->delete_field($marc->field('001'));
514
        $marc->insert_fields_ordered(MARC::Field->new('001',$authid));
515
    }
516
}
517
518
sub fix_unimarc_100 {
519
    # FIXME - again, if this is necessary, it belongs in C4::AuthoritiesMarc.
520
    my $marc = shift;
521
522
    my $string;
523
    if ( length($marc->subfield( 100, "a" )) == 35 ) {
524
        $string = $marc->subfield( 100, "a" );
525
        my $f100 = $marc->field(100);
526
        $marc->delete_field($f100);
527
    }
528
    else {
529
        $string = POSIX::strftime( "%Y%m%d", localtime );
530
        $string =~ s/\-//g;
531
        $string = sprintf( "%-*s", 35, $string );
532
    }
533
    substr( $string, 22, 6, "frey50" );
534
    unless ( length($marc->subfield( 100, "a" )) == 35 ) {
535
        $marc->delete_field($marc->field(100));
536
        $marc->insert_grouped_field(MARC::Field->new( 100, "", "", "a" => $string ));
537
    }
538
}
539
445
# given a ZOOM::Exception or
540
# given a ZOOM::Exception or
446
# ZOOM::Connection object, generate
541
# ZOOM::Connection object, generate
447
# a human-reaable error message
542
# a human-reaable error message
448
- 

Return to bug 5717