#!/usr/bin/perl use OpenILS::Utils::Cronscript; use MARC::File::XML; use MARC::Record; use UNIVERSAL qw/isa/; use Data::Dumper; my $script = OpenILS::Utils::Cronscript->new(); my $query = { 'select' => { 'mfr' => [ 'record', 'value', { 'column' => 'value', 'alias' => 'length', 'transform' => 'character_length' } ], 'bre' => [ 'create_date' ] }, 'from' => { 'mfr' => { 'bre' => { 'filter' => { 'deleted' => 'f' } } } }, 'where' => { 'tag' => '008', '-or' => { 'value' => { '!~' => '^([0-9]{6}| {6}|\|{6})' }, 'value'=> { '<>' => { 'transform' => 'character_length', 'value' => 40 } } } } }; my $editor = $script->editor(); my $results = $editor->json_query($query); if ($results) { foreach my $row (@$results) { fix_row($row); } } else { print STDERR Dumper $editor->event; } $editor->finish(); sub fix_row { my $row = shift; if ($row->{length} == 34 || $row->{length} == 38 || $row->{length} == 40) { my $yr = substr($row->{create_date}, 2,2); my $mo = substr($row->{create_date}, 5,2); my $da = substr($row->{create_date}, 8,2); my $e = $script->editor(xact=>1); my $bre = $e->retrieve_biblio_record_entry($row->{record}); my $marc = MARC::Record->new_from_xml($bre->marc, 'UTF-8'); my $field = $marc->field('008'); my $value = $field->data(); if ($row->{length} == 34) { $value = $yr . $mo . $da . $value; } elsif ($row->{length} == 38) { $value .= " "; } elsif ($row->{length} == 40) { $value = substr($value, 6); $value = $yr . $mo . $da . $value; } $field->update($value); $bre->marc(clean_marc($marc)); if ($e->update_biblio_record_entry($bre)) { print STDERR "Updated " . $row->{record} . "\n"; } else { print STDERR "Failed to update " . $row->{record} . "\n"; } $e->finish; } else { print $row->{record} . "\n"; } } # Cleans up a MARC::Record or MARCXML string for storage in the # Open-ILS database. # # Takes either a MARC::Record or a string of MARCXML. # # Returns a string of MARCXML as Open-ILS likes to store it. # # Assumes input is already in UTF-8. sub clean_marc { my $input = shift; my $xml = (isa $input, 'MARC::Record') ? $input->as_xml_record() : $input; $xml =~ s/\n//sog; $xml =~ s/^<\?xml.+\?\s*>//go; $xml =~ s/>\s+entityize($xml); $xml =~ s/[\x00-\x1f]//go; return $xml; }