1 use strict; use warnings;
2 package OpenILS::Application::Cat;
3 use OpenILS::Application::AppUtils;
4 use OpenSRF::Application;
5 use OpenILS::Application::Cat::Utils;
6 use base qw/OpenSRF::Application/;
7 use Time::HiRes qw(time);
8 use OpenSRF::EX qw(:try);
10 use OpenILS::Utils::Fieldmapper;
12 my $utils = "OpenILS::Application::Cat::Utils";
16 OpenSRF::Application->method_lookup( "blah" );
18 warn "Child Init Failed: " . shift() . "\n";
23 __PACKAGE__->register_method(
24 method => "biblio_record_tree_retrieve",
25 api_name => "open-ils.cat.biblio.record.tree.retrieve",
27 note => "Returns the tree associated with the nodeset of the given doc id"
30 sub biblio_record_tree_retrieve {
32 my( $self, $client, $recordid ) = @_;
34 my $name = "open-ils.storage.biblio.record_marc.retrieve";
35 my $session = OpenSRF::AppSession->create( "open-ils.storage" );
36 my $request = $session->request( $name, $recordid );
37 my $response = $request->recv();
38 warn "got response from storage in retrieve for $recordid\n";
41 throw OpenSRF::EX::ERROR ("No record in database with id $recordid");
44 if( $response->isa("OpenSRF::EX")) {
45 throw $response ($response->stringify);
48 warn "grabbing content in retrieve\n";
49 my $marcxml = $response->content;
52 throw OpenSRF::EX::ERROR
53 ("No record in database with id $recordid");
57 $session->disconnect();
60 warn "turning into nodeset\n";
61 my $nodes = OpenILS::Utils::FlatXML->new()->xml_to_nodeset( $marcxml->marc );
62 warn "turning nodeset into tree\n";
63 my $tree = $utils->nodeset2tree( $nodes->nodeset );
65 $tree->owner_doc( $marcxml->id() );
67 warn "returning tree\n";
72 __PACKAGE__->register_method(
73 method => "biblio_record_tree_commit",
74 api_name => "open-ils.cat.biblio.record.tree.commit",
75 argc => 3, #(session_id, biblio_tree )
76 note => "Walks the tree and commits any changed nodes " .
77 "adds any new nodes, and deletes any deleted nodes",
80 sub biblio_record_tree_commit {
82 my( $self, $client, $user_session, $tree ) = @_;
83 new Fieldmapper::biblio::record_node ($tree);
85 throw OpenSRF::EX::InvalidArg
86 ("Not enough args to to open-ils.cat.biblio.record.tree.commit")
87 unless ( $user_session and $client and $tree );
90 OpenILS::Application::AppUtils->check_user_session( $user_session ); #throws EX on error
92 $client->respond("keepalive");
95 my $docid = $tree->owner_doc();
97 # turn the tree into a nodeset
98 my $nodeset = $utils->tree2nodeset($tree);
99 $nodeset = $utils->clean_nodeset( $nodeset );
101 if(!defined($docid)) { # be sure
102 for my $node (@$nodeset) {
103 $docid = $node->owner_doc();
104 last if defined($docid);
108 # turn the nodeset into a doc
109 my $marcxml = OpenILS::Utils::FlatXML->new()->nodeset_to_xml( $nodeset );
111 my $biblio = Fieldmapper::biblio::record_marc->new();
112 $biblio->id( $docid );
113 $biblio->marc( $marcxml->toString() );
115 warn "Starting db session\n";
116 my $session = OpenILS::Application::AppUtils->start_db_session();
118 my $x = _update_record_metadata( $session, { user => $user_obj, docid => $docid } );
119 OpenILS::Application::AppUtils->rollback_db_session($session) unless $x;
120 $client->respond("keepalive");
123 warn "Sending updated doc $docid to db\n";
124 my $req = $session->request( "open-ils.storage.biblio.record_marc.update", $biblio );
126 my $status = $req->recv();
127 if( !$status || $status->isa("Error") || ! $status->content) {
128 OpenILS::Application::AppUtils->rollback_db_session($session);
129 if($status->isa("Error")) { throw $status ($status); }
130 throw OpenSRF::EX::ERROR ("Error updating biblio record");
134 # Send the doc to the wormer for wormizing
135 warn "Starting worm session\n";
136 my $wses = OpenSRF::AppSession->create("open-ils.worm");
142 my $wreq = $wses->request(
143 "open-ils.worm.wormize.marc", $docid, $marcxml->toString );
144 $wresp = $wreq->recv();
146 if( $wresp && $wresp->can("content") and $wresp->content ) {
152 warn "Looping in worm call\n";
159 if($wresp and $wresp->isa("Error") ) {
162 throw $wresp ($wresp->stringify);
168 OpenILS::Application::AppUtils->rollback_db_session($session);
174 $client->respond("keepalive");
179 warn "committing db session\n";
180 OpenILS::Application::AppUtils->commit_db_session( $session );
182 my $method = $self->method_lookup( "open-ils.cat.biblio.record.tree.retrieve" );
185 throw OpenSRF::EX::PANIC
186 ("Unable to find method open-ils.cat.biblio.record.tree.retrieve"); }
188 my ($ans) = $method->run( $docid );
190 warn "Returning from commit\n";
197 __PACKAGE__->register_method(
198 method => "biblio_record_record_metadata",
199 api_name => "open-ils.cat.biblio.record.metadata.retrieve",
200 argc => 1, #(session_id, biblio_tree )
201 note => "Walks the tree and commits any changed nodes " .
202 "adds any new nodes, and deletes any deleted nodes",
205 sub biblio_record_record_metadata {
206 my( $self, $client, @ids ) = @_;
208 if(!@ids){return undef;}
210 my $session = OpenSRF::AppSession->create("open-ils.storage");
211 my $request = $session->request(
212 "open-ils.storage.biblio.record_entry.batch.retrieve", @ids );
216 while( my $response = $request->recv() ) {
219 throw OpenSRF::EX::ERROR ("No Response from Storage");
221 if($response->isa("Error")) {
222 throw $response ($response->stringify);
225 my $record_entry = $response->content;
227 my $creator = $record_entry->creator;
228 my $editor = $record_entry->editor;
230 ($creator, $editor) = _get_userid_by_id($creator, $editor) || ("","");
232 $record_entry->creator( $creator );
233 $record_entry->editor( $editor );
235 push @$results, $record_entry;
239 $session->disconnect();
247 sub _get_userid_by_id {
252 my $session = OpenSRF::AppSession->create( "open-ils.storage" );
253 my $request = $session->request(
254 "open-ils.storage.actor.user.batch.retrieve", @ids );
256 my $response = $request->recv();
257 if(!$response) { return undef; }
259 if($response->isa("Error")){
260 throw $response ($response);
263 for my $u (@{$response->content}) {
265 push @users, $u->usrid;
269 $session->disconnect;
275 # open-ils.storage.actor.user.search.usrid
277 sub _get_id_by_userid {
282 my $session = OpenSRF::AppSession->create( "open-ils.storage" );
283 my $request = $session->request(
284 "open-ils.storage.actor.user.search.usrid", @users );
286 my $response = $request->recv();
287 if(!$response) { return undef; }
289 if($response->isa("Error")){
290 throw $response ($response);
293 for my $u (@{$response->content}) {
299 $session->disconnect;
306 # commits metadata objects to the db
307 sub _update_record_metadata {
309 my ($session, @docs ) = @_;
311 for my $doc (@docs) {
313 my $user_obj = $doc->{user};
314 my $docid = $doc->{docid};
316 warn "Updating metata for doc $docid\n";
318 # ----------------------------------------
319 # grab the meta information and update it
320 my $user_session = OpenSRF::AppSession->create("open-ils.storage");
321 my $user_request = $user_session->request(
322 "open-ils.storage.biblio.record_entry.retrieve", $docid );
323 my $meta = $user_request->recv();
326 throw OpenSRF::EX::ERROR ("No meta info returned for biblio $docid");
328 if($meta->isa("Error")) {
329 throw $meta ($meta->stringify);
332 $meta = $meta->content;
333 my ($id) = _get_id_by_userid($user_obj->usrid);
334 warn "got $id from _get_id_by_userid\n";
337 $user_request->finish;
338 $user_session->disconnect;
339 $user_session->kill_me;
340 # -------------------------------------
342 warn "Grabbed the record, updating and moving on\n";
344 my $request = $session->request(
345 "open-ils.storage.biblio.record_entry.update", $meta );
347 my $response = $request->recv();
349 throw OpenSRF::EX::ERROR
350 ("Error commit record metadata for " . $meta->id);
353 if($response->isa("Error")){
354 throw $response ($response->stringify);
360 warn "committing metarecord update\n";