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

(-)a/misc/migration_tools/rebuild_zebra.pl (-1 / +31 lines)
Lines 680-685 sub get_raw_marc_record { Link Here
680
                warn "error retrieving biblio $record_number";
680
                warn "error retrieving biblio $record_number";
681
                return;
681
                return;
682
            }
682
            }
683
            _protectZebraFromTooManyItems($marc);
683
        }
684
        }
684
    } else {
685
    } else {
685
        eval { $marc = GetAuthority($record_number); };
686
        eval { $marc = GetAuthority($record_number); };
Lines 788-793 sub do_indexing { Link Here
788
789
789
}
790
}
790
791
792
=head2 _protectZebraFromTooManyItems
793
794
    _protectZebraFromTooManyItems($marcRecord);
795
796
Finds the repeatable items-field inside the given MARC::Record and drops all but the first handful of new items.
797
Zebra cannot index a record if it is over 1MB in size, and this limit can be reached by injecting the Item-data
798
to the MARC-Record.
799
For ex. serials have one MARC record with possibly thousands of items.
800
801
=cut
802
803
my ($itemsBarcodeFieldCode, $itemsBarcodeSubfieldCode, $serialFieldCode, $serialSubfieldCode);
804
sub _protectZebraFromTooManyItems {
805
    use Modern::Perl; #WTF this script doesn't even have warnings on. Goddamn
806
    my ($marc) = @_;
807
808
    my ($itemsBarcodeFieldCode, $itemsBarcodeSubfieldCode) = C4::Biblio::GetMarcFromKohaField('items.barcode','') unless $itemsBarcodeFieldCode;
809
    my ($serialFieldCode, $serialSubfieldCode) = C4::Biblio::GetMarcFromKohaField('biblio.serial','')             unless $serialFieldCode;
810
    if ($marc->subfield($serialFieldCode, $serialSubfieldCode)) { #Is a serial, has a subscription basically
811
        my $maxIndexedItems = 500; #in MARC mode we should be able to create a ISO-format MARC21 record with this many items. Record size limit is 99999 characters.
812
        my @fields = reverse $marc->field($itemsBarcodeFieldCode); #field actually returns fields
813
        my $fCnt = scalar(@fields)-1;
814
815
        if (scalar(@fields) > $maxIndexedItems) {
816
            my @deletable = @fields[$maxIndexedItems..$fCnt];
817
            $marc->delete_fields(@deletable); #Trim the rest of the items.
818
        }
819
    }
820
}
821
791
sub _flock {
822
sub _flock {
792
    # test if flock is present; if so, use it; if not, return true
823
    # test if flock is present; if so, use it; if not, return true
793
    # op refers to the official flock operations including LOCK_EX,
824
    # op refers to the official flock operations including LOCK_EX,
794
- 

Return to bug 15399