1 package OpenILS::Application::Vandelay;
2 use OpenILS::Application;
3 use base qw/OpenILS::Application/;
19 $stuff =~ s/([\x{0080}-\x{fffd}])/sprintf('&#x%X;',ord($1))/sgoe;
23 # --------------------------------------------------------------------------------
26 package OpenILS::Application::Vandelay::Biblio;
27 use base qw/OpenILS::Application::Vandelay/;
29 use Unicode::Normalize;
30 use OpenSRF::EX qw/:try/;
32 use OpenSRF::AppSession;
33 use OpenSRF::Utils::SettingsClient;
35 use OpenILS::Utils::Fieldmapper;
36 use OpenSRF::Utils::JSON;
40 use OpenILS::Utils::Fieldmapper;
42 use Time::HiRes qw(time);
44 use OpenSRF::Utils::Logger qw/:level/;
45 our $log = 'OpenSRF::Utils::Logger';
47 sub create_bib_queue {
53 sub rw_biblio_ingest_single_object {
58 my ($blob) = $self->method_lookup("open-ils.ingest.full.biblio.object.readonly")->run($bib);
59 return undef unless ($blob);
61 $bib->fingerprint( $blob->{fingerprint}->{fingerprint} );
62 $bib->quality( $blob->{fingerprint}->{quality} );
64 my $cstore = OpenSRF::AppSession->connect('open-ils.cstore');
66 my $xact = $cstore->request('open-ils.cstore.transaction.begin')->gather(1);
68 # update full_rec stuff ...
69 my $tmp = $cstore->request(
70 'open-ils.cstore.direct.metabib.full_rec.id_list.atomic',
71 { record => $bib->id }
74 $cstore->request( 'open-ils.cstore.direct.metabib.full_rec.delete' => $_ )->gather(1) for (@$tmp);
75 $cstore->request( 'open-ils.cstore.direct.metabib.full_rec.create' => $_ )->gather(1) for (@{ $blob->{full_rec} });
77 # update rec_descriptor stuff ...
78 $tmp = $cstore->request(
79 'open-ils.cstore.direct.metabib.record_descriptor.id_list.atomic',
80 { record => $bib->id }
83 $cstore->request( 'open-ils.cstore.direct.metabib.record_descriptor.delete' => $_ )->gather(1) for (@$tmp);
84 $cstore->request( 'open-ils.cstore.direct.metabib.record_descriptor.create' => $blob->{descriptor} )->gather(1);
86 # deal with classed fields...
87 for my $class ( qw/title author subject keyword series/ ) {
88 $tmp = $cstore->request(
89 "open-ils.cstore.direct.metabib.${class}_field_entry.id_list.atomic",
90 { source => $bib->id }
93 $cstore->request( "open-ils.cstore.direct.metabib.${class}_field_entry.delete" => $_ )->gather(1) for (@$tmp);
95 for my $obj ( @{ $blob->{field_entries} } ) {
96 my $class = $obj->class_name;
97 $class =~ s/^Fieldmapper:://o;
99 $cstore->request( "open-ils.cstore.direct.$class.create" => $obj )->gather(1);
104 $tmp = $cstore->request(
105 'open-ils.cstore.direct.metabib.metarecord_source_map.search.atomic',
106 { source => $bib->id }
109 $cstore->request( 'open-ils.cstore.direct.metabib.metarecord_source_map.delete' => $_->id )->gather(1) for (@$tmp);
112 my $old_mrs = $cstore->request(
113 'open-ils.cstore.direct.metabib.metarecord.search.atomic' => { id => [map { $_->metarecord } @$tmp] }
114 )->gather(1) if (@$tmp);
116 $old_mrs = [] if (!ref($old_mrs));
119 for my $m (@$old_mrs) {
120 if ($m->fingerprint eq $bib->fingerprint) {
123 my $others = $cstore->request(
124 'open-ils.cstore.direct.metabib.metarecord_source_map.id_list.atomic' => { metarecord => $m->id }
129 'open-ils.cstore.direct.metabib.metarecord.delete' => $m->id
139 # Get the matchin MR, if any.
140 $mr = $cstore->request(
141 'open-ils.cstore.direct.metabib.metarecord.search',
142 { fingerprint => $bib->fingerprint }
145 $holds = $cstore->request(
146 'open-ils.cstore.direct.action.hold_request.search.atomic',
147 { hold_type => 'M', target => [ map { $_->id } grep { $_->isdeleted } @$old_mrs ] }
148 )->gather(1) if (@$old_mrs);
151 for my $h (@$holds) {
153 $cstore->request( 'open-ils.cstore.direct.action.hold_request.update' => $h )->gather(1);
160 $mr = new Fieldmapper::metabib::metarecord;
161 $mr->fingerprint( $bib->fingerprint );
162 $mr->master_record( $bib->id );
165 "open-ils.cstore.direct.metabib.metarecord.create",
166 $mr => { quiet => 'true' }
170 for my $h (grep { !$_->ischanged } @$holds) {
172 $cstore->request( 'open-ils.cstore.direct.action.hold_request.update' => $h )->gather(1);
175 my $mrm = $cstore->request(
176 'open-ils.cstore.direct.metabib.metarecord_source_map.search.atomic',
177 { metarecord => $mr->id }
181 my $best = $cstore->request(
182 "open-ils.cstore.direct.biblio.record_entry.search",
183 { id => [ map { $_->source } @$mrm ] },
184 { 'select' => { bre => [ qw/id quality/ ] },
185 order_by => { bre => "quality desc" },
190 if ($best->quality > $bib->quality) {
191 $mr->master_record($best->id);
193 $mr->master_record($bib->id);
196 $mr->master_record($bib->id);
201 $cstore->request( 'open-ils.cstore.direct.metabib.metarecord.update' => $mr )->gather(1);
204 my $mrm = new Fieldmapper::metabib::metarecord_source_map;
205 $mrm->source($bib->id);
206 $mrm->metarecord($mr->id);
208 $cstore->request( 'open-ils.cstore.direct.metabib.metarecord_source_map.create' => $mrm )->gather(1);
209 $cstore->request( 'open-ils.cstore.direct.biblio.record_entry.update' => $bib )->gather(1);
211 $cstore->request( 'open-ils.cstore.transaction.commit' )->gather(1) || return undef;;
215 __PACKAGE__->register_method(
216 api_name => "open-ils.ingest.full.biblio.object",
217 method => "rw_biblio_ingest_single_object",
222 sub rw_biblio_ingest_single_record {
227 OpenILS::Application::Ingest->post_init();
228 my $cstore = OpenSRF::AppSession->connect( 'open-ils.cstore' );
229 $cstore->request('open-ils.cstore.transaction.begin')->gather(1);
231 my $r = $cstore->request( 'open-ils.cstore.direct.biblio.record_entry.retrieve' => $rec )->gather(1);
233 $cstore->request('open-ils.cstore.transaction.rollback')->gather(1);
236 return undef unless ($r and @$r);
238 return ($self->method_lookup("open-ils.ingest.full.biblio.object")->run($r))[0];
240 __PACKAGE__->register_method(
241 api_name => "open-ils.ingest.full.biblio.record",
242 method => "rw_biblio_ingest_single_record",
247 sub rw_biblio_ingest_record_list {
250 my @rec = ref($_[0]) ? @{ $_[0] } : @_ ;
252 OpenILS::Application::Ingest->post_init();
253 my $cstore = OpenSRF::AppSession->connect( 'open-ils.cstore' );
254 $cstore->request('open-ils.cstore.transaction.begin')->gather(1);
256 my $r = $cstore->request( 'open-ils.cstore.direct.biblio.record_entry.search.atomic' => { id => $rec } )->gather(1);
258 $cstore->request('open-ils.cstore.transaction.rollback')->gather(1);
261 return undef unless ($r and @$r);
264 $count += ($self->method_lookup("open-ils.ingest.full.biblio.object")->run($_))[0] for (@$r);
268 __PACKAGE__->register_method(
269 api_name => "open-ils.ingest.full.biblio.record_list",
270 method => "rw_biblio_ingest_record_list",
275 sub ro_biblio_ingest_single_object {
279 my $xml = OpenILS::Application::Ingest::entityize($bib->marc);
281 my $document = $parser->parse_string($xml);
283 my @mfr = $self->method_lookup("open-ils.ingest.flat_marc.biblio.xml")->run($document);
284 my @mXfe = $self->method_lookup("open-ils.ingest.extract.field_entry.all.xml")->run($document);
285 my ($fp) = $self->method_lookup("open-ils.ingest.fingerprint.xml")->run($xml);
286 my ($rd) = $self->method_lookup("open-ils.ingest.descriptor.xml")->run($xml);
288 $_->source($bib->id) for (@mXfe);
289 $_->record($bib->id) for (@mfr);
290 $rd->record($bib->id) if ($rd);
292 return { full_rec => \@mfr, field_entries => \@mXfe, fingerprint => $fp, descriptor => $rd };
294 __PACKAGE__->register_method(
295 api_name => "open-ils.ingest.full.biblio.object.readonly",
296 method => "ro_biblio_ingest_single_object",
301 sub ro_biblio_ingest_single_xml {
304 my $xml = OpenILS::Application::Ingest::entityize(shift);
306 my $document = $parser->parse_string($xml);
308 my @mfr = $self->method_lookup("open-ils.ingest.flat_marc.biblio.xml")->run($document);
309 my @mXfe = $self->method_lookup("open-ils.ingest.extract.field_entry.all.xml")->run($document);
310 my ($fp) = $self->method_lookup("open-ils.ingest.fingerprint.xml")->run($xml);
311 my ($rd) = $self->method_lookup("open-ils.ingest.descriptor.xml")->run($xml);
313 return { full_rec => \@mfr, field_entries => \@mXfe, fingerprint => $fp, descriptor => $rd };
315 __PACKAGE__->register_method(
316 api_name => "open-ils.ingest.full.biblio.xml.readonly",
317 method => "ro_biblio_ingest_single_xml",
322 sub ro_biblio_ingest_single_record {
327 OpenILS::Application::Ingest->post_init();
328 my $r = OpenSRF::AppSession
329 ->create('open-ils.cstore')
330 ->request( 'open-ils.cstore.direct.biblio.record_entry.retrieve' => $rec )
333 return undef unless ($r and @$r);
335 my ($res) = $self->method_lookup("open-ils.ingest.full.biblio.xml.readonly")->run($r->marc);
337 $_->source($rec) for (@{$res->{field_entries}});
338 $_->record($rec) for (@{$res->{full_rec}});
339 $res->{descriptor}->record($rec);
343 __PACKAGE__->register_method(
344 api_name => "open-ils.ingest.full.biblio.record.readonly",
345 method => "ro_biblio_ingest_single_record",
350 sub ro_biblio_ingest_stream_record {
354 OpenILS::Application::Ingest->post_init();
356 my $ses = OpenSRF::AppSession->create('open-ils.cstore');
358 while (my ($resp) = $client->recv( count => 1, timeout => 5 )) {
360 my $rec = $resp->content;
361 last unless (defined $rec);
363 $log->debug("Running open-ils.ingest.full.biblio.record.readonly ...");
364 my ($res) = $self->method_lookup("open-ils.ingest.full.biblio.record.readonly")->run($rec);
366 $_->source($rec) for (@{$res->{field_entries}});
367 $_->record($rec) for (@{$res->{full_rec}});
369 $client->respond( $res );
374 __PACKAGE__->register_method(
375 api_name => "open-ils.ingest.full.biblio.record_stream.readonly",
376 method => "ro_biblio_ingest_stream_record",
381 sub ro_biblio_ingest_stream_xml {
385 OpenILS::Application::Ingest->post_init();
387 my $ses = OpenSRF::AppSession->create('open-ils.cstore');
389 while (my ($resp) = $client->recv( count => 1, timeout => 5 )) {
391 my $xml = $resp->content;
392 last unless (defined $xml);
394 $log->debug("Running open-ils.ingest.full.biblio.xml.readonly ...");
395 my ($res) = $self->method_lookup("open-ils.ingest.full.biblio.xml.readonly")->run($xml);
397 $client->respond( $res );
402 __PACKAGE__->register_method(
403 api_name => "open-ils.ingest.full.biblio.xml_stream.readonly",
404 method => "ro_biblio_ingest_stream_xml",
409 sub rw_biblio_ingest_stream_import {
413 OpenILS::Application::Ingest->post_init();
415 my $ses = OpenSRF::AppSession->create('open-ils.cstore');
417 while (my ($resp) = $client->recv( count => 1, timeout => 5 )) {
419 my $bib = $resp->content;
420 last unless (defined $bib);
422 $log->debug("Running open-ils.ingest.full.biblio.xml.readonly ...");
423 my ($res) = $self->method_lookup("open-ils.ingest.full.biblio.xml.readonly")->run($bib->marc);
425 $_->source($bib->id) for (@{$res->{field_entries}});
426 $_->record($bib->id) for (@{$res->{full_rec}});
428 $client->respond( $res );
433 __PACKAGE__->register_method(
434 api_name => "open-ils.ingest.full.biblio.bib_stream.import",
435 method => "rw_biblio_ingest_stream_import",
441 # --------------------------------------------------------------------------------
444 package OpenILS::Application::Ingest::Authority;
445 use base qw/OpenILS::Application::Ingest/;
446 use Unicode::Normalize;
448 sub ro_authority_ingest_single_object {
452 my $xml = OpenILS::Application::Ingest::entityize($bib->marc);
454 my $document = $parser->parse_string($xml);
456 my @mfr = $self->method_lookup("open-ils.ingest.flat_marc.authority.xml")->run($document);
458 $_->record($bib->id) for (@mfr);
460 return { full_rec => \@mfr };
462 __PACKAGE__->register_method(
463 api_name => "open-ils.ingest.full.authority.object.readonly",
464 method => "ro_authority_ingest_single_object",
469 sub ro_authority_ingest_single_xml {
472 my $xml = OpenILS::Application::Ingest::entityize(shift);
474 my $document = $parser->parse_string($xml);
476 my @mfr = $self->method_lookup("open-ils.ingest.flat_marc.authority.xml")->run($document);
478 return { full_rec => \@mfr };
480 __PACKAGE__->register_method(
481 api_name => "open-ils.ingest.full.authority.xml.readonly",
482 method => "ro_authority_ingest_single_xml",
487 sub ro_authority_ingest_single_record {
492 OpenILS::Application::Ingest->post_init();
493 my $r = OpenSRF::AppSession
494 ->create('open-ils.cstore')
495 ->request( 'open-ils.cstore.direct.authority.record_entry.retrieve' => $rec )
498 return undef unless ($r and @$r);
500 my ($res) = $self->method_lookup("open-ils.ingest.full.authority.xml.readonly")->run($r->marc);
502 $_->record($rec) for (@{$res->{full_rec}});
503 $res->{descriptor}->record($rec);
507 __PACKAGE__->register_method(
508 api_name => "open-ils.ingest.full.authority.record.readonly",
509 method => "ro_authority_ingest_single_record",
514 sub ro_authority_ingest_stream_record {
518 OpenILS::Application::Ingest->post_init();
520 my $ses = OpenSRF::AppSession->create('open-ils.cstore');
522 while (my ($resp) = $client->recv( count => 1, timeout => 5 )) {
524 my $rec = $resp->content;
525 last unless (defined $rec);
527 $log->debug("Running open-ils.ingest.full.authority.record.readonly ...");
528 my ($res) = $self->method_lookup("open-ils.ingest.full.authority.record.readonly")->run($rec);
530 $_->record($rec) for (@{$res->{full_rec}});
532 $client->respond( $res );
537 __PACKAGE__->register_method(
538 api_name => "open-ils.ingest.full.authority.record_stream.readonly",
539 method => "ro_authority_ingest_stream_record",
544 sub ro_authority_ingest_stream_xml {
548 OpenILS::Application::Ingest->post_init();
550 my $ses = OpenSRF::AppSession->create('open-ils.cstore');
552 while (my ($resp) = $client->recv( count => 1, timeout => 5 )) {
554 my $xml = $resp->content;
555 last unless (defined $xml);
557 $log->debug("Running open-ils.ingest.full.authority.xml.readonly ...");
558 my ($res) = $self->method_lookup("open-ils.ingest.full.authority.xml.readonly")->run($xml);
560 $client->respond( $res );
565 __PACKAGE__->register_method(
566 api_name => "open-ils.ingest.full.authority.xml_stream.readonly",
567 method => "ro_authority_ingest_stream_xml",
572 sub rw_authority_ingest_stream_import {
576 OpenILS::Application::Ingest->post_init();
578 my $ses = OpenSRF::AppSession->create('open-ils.cstore');
580 while (my ($resp) = $client->recv( count => 1, timeout => 5 )) {
582 my $bib = $resp->content;
583 last unless (defined $bib);
585 $log->debug("Running open-ils.ingest.full.authority.xml.readonly ...");
586 my ($res) = $self->method_lookup("open-ils.ingest.full.authority.xml.readonly")->run($bib->marc);
588 $_->record($bib->id) for (@{$res->{full_rec}});
590 $client->respond( $res );
595 __PACKAGE__->register_method(
596 api_name => "open-ils.ingest.full.authority.bib_stream.import",
597 method => "rw_authority_ingest_stream_import",
603 # --------------------------------------------------------------------------------
604 # MARC index extraction
606 package OpenILS::Application::Ingest::XPATH;
607 use base qw/OpenILS::Application::Ingest/;
608 use Unicode::Normalize;
610 # give this an XML documentElement and an XPATH expression
611 sub xpath_to_string {
615 my $ns_prefix = shift;
618 $xml->setNamespace( $ns_uri, $ns_prefix, 1 ) if ($ns_uri && $ns_prefix);
622 # grab the set of matching nodes
623 my @nodes = $xml->findnodes( $xpath );
624 for my $value (@nodes) {
626 # grab all children of the node
627 my @children = $value->childNodes();
628 for my $child (@children) {
630 # add the childs content to the growing buffer
631 my $content = quotemeta($child->textContent);
632 next if ($unique && $string =~ /$content/); # uniquify the values
633 $string .= $child->textContent . " ";
636 $string .= $value->textContent . " ";
642 sub class_index_string_xml {
648 OpenILS::Application::Ingest->post_init();
649 $xml = $parser->parse_string(OpenILS::Application::Ingest::entityize($xml)) unless (ref $xml);
653 for my $class (@classes) {
654 my $class_constructor = "Fieldmapper::metabib::${class}_field_entry";
655 for my $type ( keys %{ $xpathset->{$class} } ) {
657 my $def = $xpathset->{$class}->{$type};
658 my $sf = $OpenILS::Application::Ingest::supported_formats{$def->{format}};
663 $document = $transform_cache{$def->{format}} || $sf->{xslt}->transform($xml);
664 $transform_cache{$def->{format}} = $document;
667 my $value = xpath_to_string(
668 $document->documentElement => $def->{xpath},
669 $sf->{ns} => $def->{format},
675 $value = NFD($value);
676 $value =~ s/\pM+//sgo;
677 $value =~ s/\pC+//sgo;
678 $value =~ s/\W+$//sgo;
680 $value =~ s/\b\.+\b//sgo;
683 my $fm = $class_constructor->new;
684 $fm->value( $value );
685 $fm->field( $xpathset->{$class}->{$type}->{id} );
686 $client->respond($fm);
691 __PACKAGE__->register_method(
692 api_name => "open-ils.ingest.field_entry.class.xml",
693 method => "class_index_string_xml",
699 sub class_index_string_record {
705 OpenILS::Application::Ingest->post_init();
706 my $r = OpenSRF::AppSession
707 ->create('open-ils.cstore')
708 ->request( 'open-ils.cstore.direct.authority.record_entry.retrieve' => $rec )
711 return undef unless ($r and @$r);
713 for my $fm ($self->method_lookup("open-ils.ingest.field_entry.class.xml")->run($r->marc, @classes)) {
715 $client->respond($fm);
719 __PACKAGE__->register_method(
720 api_name => "open-ils.ingest.field_entry.class.record",
721 method => "class_index_string_record",
727 sub all_index_string_xml {
732 for my $fm ($self->method_lookup("open-ils.ingest.field_entry.class.xml")->run($xml, keys(%$xpathset))) {
733 $client->respond($fm);
737 __PACKAGE__->register_method(
738 api_name => "open-ils.ingest.extract.field_entry.all.xml",
739 method => "all_index_string_xml",
745 sub all_index_string_record {
750 OpenILS::Application::Ingest->post_init();
751 my $r = OpenSRF::AppSession
752 ->create('open-ils.cstore')
753 ->request( 'open-ils.cstore.direct.biblio.record_entry.retrieve' => $rec )
756 return undef unless ($r and @$r);
758 for my $fm ($self->method_lookup("open-ils.ingest.field_entry.class.xml")->run($r->marc, keys(%$xpathset))) {
760 $client->respond($fm);
764 __PACKAGE__->register_method(
765 api_name => "open-ils.ingest.extract.field_entry.all.record",
766 method => "all_index_string_record",
772 # --------------------------------------------------------------------------------
775 package OpenILS::Application::Ingest::FlatMARC;
776 use base qw/OpenILS::Application::Ingest/;
777 use Unicode::Normalize;
780 sub _marcxml_to_full_rows {
783 my $xmltype = shift || 'metabib';
785 my $type = "Fieldmapper::${xmltype}::full_rec";
789 my ($root) = $marcxml->findnodes('//*[local-name()="record"]');
791 for my $tagline ( @{$root->getChildrenByTagName("leader")} ) {
792 next unless $tagline;
797 my $val = $tagline->textContent;
807 for my $tagline ( @{$root->getChildrenByTagName("controlfield")} ) {
808 next unless $tagline;
812 $ns->tag( $tagline->getAttribute( "tag" ) );
813 my $val = $tagline->textContent;
823 for my $tagline ( @{$root->getChildrenByTagName("datafield")} ) {
824 next unless $tagline;
826 my $tag = $tagline->getAttribute( "tag" );
827 my $ind1 = $tagline->getAttribute( "ind1" );
828 my $ind2 = $tagline->getAttribute( "ind2" );
830 for my $data ( @{$tagline->getChildrenByTagName('subfield')} ) {
838 $ns->subfield( $data->getAttribute( "code" ) );
839 my $val = $data->textContent;
844 $ns->value( lc($val) );
850 $log->debug("Returning ".scalar(@ns_list)." Fieldmapper nodes from $xmltype xml");
859 $log->debug("processing [$xml]");
861 $xml = $parser->parse_string(OpenILS::Application::Ingest::entityize($xml)) unless (ref $xml);
863 my $type = 'metabib';
864 $type = 'authority' if ($self->api_name =~ /authority/o);
866 OpenILS::Application::Ingest->post_init();
868 $client->respond($_) for (_marcxml_to_full_rows($xml, $type));
871 __PACKAGE__->register_method(
872 api_name => "open-ils.ingest.flat_marc.authority.xml",
873 method => "flat_marc_xml",
878 __PACKAGE__->register_method(
879 api_name => "open-ils.ingest.flat_marc.biblio.xml",
880 method => "flat_marc_xml",
886 sub flat_marc_record {
892 $type = 'authority' if ($self->api_name =~ /authority/o);
894 OpenILS::Application::Ingest->post_init();
895 my $r = OpenSRF::AppSession
896 ->create('open-ils.cstore')
897 ->request( "open-ils.cstore.direct.${type}.record_entry.retrieve" => $rec )
901 return undef unless ($r and $r->marc);
903 my @rows = $self->method_lookup("open-ils.ingest.flat_marc.$type.xml")->run($r->marc);
904 for my $row (@rows) {
905 $client->respond($row);
906 $log->debug(OpenSRF::Utils::JSON->perl2JSON($row), DEBUG);
910 __PACKAGE__->register_method(
911 api_name => "open-ils.ingest.flat_marc.biblio.record_entry",
912 method => "flat_marc_record",
917 __PACKAGE__->register_method(
918 api_name => "open-ils.ingest.flat_marc.authority.record_entry",
919 method => "flat_marc_record",
925 # --------------------------------------------------------------------------------
928 package OpenILS::Application::Ingest::Biblio::Fingerprint;
929 use base qw/OpenILS::Application::Ingest/;
930 use Unicode::Normalize;
931 use OpenSRF::EX qw/:try/;
933 sub biblio_fingerprint_record {
938 OpenILS::Application::Ingest->post_init();
940 my $r = OpenSRF::AppSession
941 ->create('open-ils.cstore')
942 ->request( 'open-ils.cstore.direct.biblio.record_entry.retrieve' => $rec )
945 return undef unless ($r and $r->marc);
947 my ($fp) = $self->method_lookup('open-ils.ingest.fingerprint.xml')->run($r->marc);
948 $log->debug("Returning [$fp] as fingerprint for record $rec", INFO);
949 $fp->{quality} = int($fp->{quality});
952 __PACKAGE__->register_method(
953 api_name => "open-ils.ingest.fingerprint.record",
954 method => "biblio_fingerprint_record",
960 sub biblio_fingerprint {
963 my $xml = OpenILS::Application::Ingest::entityize(shift);
965 $log->internal("Got MARC [$xml]");
968 my @pfx = ( "apps", "open-ils.ingest","app_settings" );
969 my $conf = OpenSRF::Utils::SettingsClient->new;
971 my $libs = $conf->config_value(@pfx, 'script_path');
972 my $script_file = $conf->config_value(@pfx, 'scripts', 'biblio_fingerprint');
973 my $script_libs = (ref($libs)) ? $libs : [$libs];
975 $log->debug("Loading script $script_file for biblio fingerprinting...");
977 $fp_script = new OpenILS::Utils::ScriptRunner
978 ( file => $script_file,
979 paths => $script_libs,
980 reset_count => 100 );
983 $fp_script->insert('environment' => {marc => $xml} => 1);
985 my $res = $fp_script->run || ($log->error( "Fingerprint script died! $@" ) && return undef);
986 $log->debug("Script for biblio fingerprinting completed successfully...");
990 __PACKAGE__->register_method(
991 api_name => "open-ils.ingest.fingerprint.xml",
992 method => "biblio_fingerprint",
998 sub biblio_descriptor {
1001 my $xml = OpenILS::Application::Ingest::entityize(shift);
1003 $log->internal("Got MARC [$xml]");
1006 my @pfx = ( "apps", "open-ils.ingest","app_settings" );
1007 my $conf = OpenSRF::Utils::SettingsClient->new;
1009 my $libs = $conf->config_value(@pfx, 'script_path');
1010 my $script_file = $conf->config_value(@pfx, 'scripts', 'biblio_descriptor');
1011 my $script_libs = (ref($libs)) ? $libs : [$libs];
1013 $log->debug("Loading script $script_file for biblio descriptor extraction...");
1015 $rd_script = new OpenILS::Utils::ScriptRunner
1016 ( file => $script_file,
1017 paths => $script_libs,
1018 reset_count => 100 );
1021 $log->debug("Setting up environment for descriptor extraction script...");
1022 $rd_script->insert('environment.marc' => $xml => 1);
1023 $log->debug("Environment building complete...");
1025 my $res = $rd_script->run || ($log->error( "Descriptor script died! $@" ) && return undef);
1026 $log->debug("Script for biblio descriptor extraction completed successfully");
1030 __PACKAGE__->register_method(
1031 api_name => "open-ils.ingest.descriptor.xml",
1032 method => "biblio_descriptor",