# Keep a count of the loaded records. my $count = 0; # We are now ready to process the downloaded MARC file. # my $marc_file = MARC::File::USMARC->in($fname); # For reals. my $marc_file = MARC::File::USMARC->in("/home/jason/safari/FULL-2011-05-18.mrc"); # For development. while (my $record = $marc_file->next()) { $count++; # Get the record status to determine what to do with it. my $status = substr($record->leader(), 5, 1); # Do our configured transformations: unless ($status eq 'd') { my $transforms = $config->find("/config/marc/*"); foreach my $trans ($transforms->get_nodelist()) { next unless ($trans->isa('XML::XPath::Node::Element')); # Currently, we only support a replace specification. I # plan to add a delete and an add specification in the # future. if ($trans->getLocalName() eq 'replace') { my $tag = $trans->getAttribute('tag'); next unless($tag); my $ind1 = $trans->getAttribute('ind1'); my $ind2 = $trans->getAttribute('ind2'); my $subs = $config->find('subfield', $trans); if ($subs->size()) { foreach my $sub ($subs->get_nodelist) { my $code = $sub->getAttribute('code'); next unless ($code); my $match = $config->findvalue('match', $sub)->value(); my $with = $config->findvalue('with', $sub)->value(); foreach my $field ($record->field($tag)) { next if ($ind1 && $field->indicator(1) ne $ind1); next if ($ind2 && $field->indicator(2) ne $ind2); if ($match) { my $value = $field->subfield($code); if ($value) { $value =~ s/$match/$with/; $field->update($code => $value); } } else { $field->update($code => $with) if ($field->subfield($code)); } } } } else { # This isn't implemented, yet, but should be. } } } } # If updating, overlay matching records by deleting them first. if ($download_type eq 'update') { # This still needs to be implemented. It needs to match # records based on some criteria and then delete, replace, or # overlay existing records. } # Insert our new record. unless ($status eq 'd') { print("$count "); # Convert the record to marcxml. (my $xml = $record->as_xml_record()) =~ s/\n//sog; $xml =~ s/^<\?xml.+\?\s*>//go; $xml =~ s/>\s+entityize($xml); $xml =~ s/[\x00-\x1f]//go; my $r = OpenILS::Application::AppUtils->simplereq('open-ils.cat', 'open-ils.cat.biblio.record.xml.create', $authtoken, $xml, $source->id); if (ref($r) eq 'HASH') { print($r->{textcode} . "\n"); } elsif (ref($r) eq 'Fieldmapper::biblio::record_entry') { print($r->id . ' ' . $r->source . "\n"); } else { print("$r\n"); } } }