From c4f2ca8ed704e4864f1c7d1eb42fe82424516124 Mon Sep 17 00:00:00 2001 From: erickson Date: Tue, 1 Jun 2010 20:40:25 +0000 Subject: [PATCH] backporting 16544: in the SIP server plugin, don't connect and start a transaction by default with every cstore handle. only connect/begin when necessary. also, making use of new CStoreEditor::init() call for setting up the editor environment when initial load was done before the IDL was available. Also, back-porting Joe A's CStoreEditor cleanup changes, namely the new init() routine. git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_1_6@16551 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/src/perlmods/OpenILS/SIP.pm | 22 ++----- Open-ILS/src/perlmods/OpenILS/SIP/Patron.pm | 12 ++-- .../src/perlmods/OpenILS/Utils/CStoreEditor.pm | 67 +++++++++------------- 3 files changed, 38 insertions(+), 63 deletions(-) diff --git a/Open-ILS/src/perlmods/OpenILS/SIP.pm b/Open-ILS/src/perlmods/OpenILS/SIP.pm index 20fcaa00fb..c10311a87d 100644 --- a/Open-ILS/src/perlmods/OpenILS/SIP.pm +++ b/Open-ILS/src/perlmods/OpenILS/SIP.pm @@ -78,34 +78,20 @@ sub to_bool { } sub editor { - return $editor - if $editor and $editor->{session} - and $editor->session->connected; return $editor = make_editor(); } -sub reset_editor { - $editor = undef; - return editor(); -} - sub config { return $config; } # Creates the global editor object +my $cstore_init = 1; # call init on first use sub make_editor { - require OpenILS::Utils::CStoreEditor; - my $e = OpenILS::Utils::CStoreEditor->new(xact => 1); - # gnarly cstore hack to re-gen autogen methods after IDL is loaded - if(!UNIVERSAL::can($e, 'search_actor_card')) { - syslog("LOG_WARNING", "OILS: Reloading CStoreEditor..."); - delete $INC{'OpenILS/Utils/CStoreEditor.pm'}; - require OpenILS::Utils::CStoreEditor; - $e = OpenILS::Utils::CStoreEditor->new(xact =>1); - } - return $e; + OpenILS::Utils::CStoreEditor::init() if $cstore_init; + $cstore_init = 0; + return OpenILS::Utils::CStoreEditor->new; } =head2 clean_text(scalar) diff --git a/Open-ILS/src/perlmods/OpenILS/SIP/Patron.pm b/Open-ILS/src/perlmods/OpenILS/SIP/Patron.pm index 933ec17e83..5267623299 100644 --- a/Open-ILS/src/perlmods/OpenILS/SIP/Patron.pm +++ b/Open-ILS/src/perlmods/OpenILS/SIP/Patron.pm @@ -509,17 +509,20 @@ sub unavail_holds { sub block { my ($self, $card_retained, $blocked_card_msg) = @_; + my $e = $self->{editor}; my $u = $self->{user}; - my $e = $self->{editor} = OpenILS::SIP->reset_editor(); syslog('LOG_INFO', "OILS: Blocking user %s", $u->card->barcode ); return $self if $u->card->active eq 'f'; + # connect and start a new transaction + $e->xact_begin; + $u->card->active('f'); if( ! $e->update_actor_card($u->card) ) { syslog('LOG_ERR', "OILS: Block card update failed: %s", $e->event->{textcode}); - $e->xact_rollback; + $e->rollback; # rollback + disconnect return $self; } @@ -532,15 +535,14 @@ sub block { if( ! $e->update_actor_user($u) ) { syslog('LOG_ERR', "OILS: Block: patron alert update failed: %s", $e->event->{textcode}); - $e->xact_rollback; + $e->rollback; # rollback + disconnect return $self; } # stay in synch $self->{user}->alert_message( $note ); - $e->commit; # commits and resets - $self->{editor} = OpenILS::SIP->reset_editor(); + $e->commit; # commits and disconnects return $self; } diff --git a/Open-ILS/src/perlmods/OpenILS/Utils/CStoreEditor.pm b/Open-ILS/src/perlmods/OpenILS/Utils/CStoreEditor.pm index d649b863c0..66345b0dfc 100644 --- a/Open-ILS/src/perlmods/OpenILS/Utils/CStoreEditor.pm +++ b/Open-ILS/src/perlmods/OpenILS/Utils/CStoreEditor.pm @@ -361,7 +361,7 @@ sub request { $self->log(D,"running in substream mode"); $val = []; while( my $resp = $req->recv(timeout => $self->timeout) ) { - push(@$val, $resp->content) if $resp->content; + push(@$val, $resp->content) if $resp->content and not $self->discard; } } else { @@ -391,6 +391,16 @@ sub substream { return $self->{substream}; } +# ----------------------------------------------------------------------------- +# discard response data instead of returning it to the caller. currently only +# works in conjunction with substream mode. +# ----------------------------------------------------------------------------- +sub discard { + my( $self, $bool ) = @_; + $self->{discard} = $bool if defined $bool; + return $self->{discard}; +} + # ----------------------------------------------------------------------------- # Sets / Returns the requestor object. This is set when checkauth succeeds. @@ -661,6 +671,7 @@ sub runmethod { $method =~ s/\.atomic$//o if $self->substream($$options{substream} || 0); $self->timeout($$options{timeout}); + $self->discard($$options{discard}); # remove any stale events $self->clear_event; @@ -767,47 +778,22 @@ sub __fm2meth { # ------------------------------------------------------------- # Load up the methods from the FM classes # ------------------------------------------------------------- -my $map = $Fieldmapper::fieldmap; -for my $object (keys %$map) { - my $obj = __fm2meth($object,'_'); - my $type = __fm2meth($object, '.'); - - my $update = "update_$obj"; - my $updatef = - "sub $update {return shift()->runmethod('update', '$type', \@_);}"; - eval $updatef; - - my $retrieve = "retrieve_$obj"; - my $retrievef = - "sub $retrieve {return shift()->runmethod('retrieve', '$type', \@_);}"; - eval $retrievef; - - my $search = "search_$obj"; - my $searchf = - "sub $search {return shift()->runmethod('search', '$type', \@_);}"; - eval $searchf; - - my $create = "create_$obj"; - my $createf = - "sub $create {return shift()->runmethod('create', '$type', \@_);}"; - eval $createf; - - my $delete = "delete_$obj"; - my $deletef = - "sub $delete {return shift()->runmethod('delete', '$type', \@_);}"; - eval $deletef; - - my $bretrieve = "batch_retrieve_$obj"; - my $bretrievef = - "sub $bretrieve {return shift()->runmethod('batch_retrieve', '$type', \@_);}"; - eval $bretrievef; - - my $retrieveall = "retrieve_all_$obj"; - my $retrieveallf = - "sub $retrieveall {return shift()->runmethod('retrieve_all', '$type', \@_);}"; - eval $retrieveallf; + +sub init { + no warnings; # Here we potentially redefine subs via eval + my $map = $Fieldmapper::fieldmap; + for my $object (keys %$map) { + my $obj = __fm2meth($object, '_'); + my $type = __fm2meth($object, '.'); + foreach my $command (qw/ update retrieve search create delete batch_retrieve retrieve_all /) { + eval "sub ${command}_$obj {return shift()->runmethod('$command', '$type', \@_);}\n"; + } + # TODO: performance test against concatenating a big string of all the subs and eval'ing only ONCE. + } } +init(); # Add very many subs to this namespace + sub json_query { my( $self, $arg, $options ) = @_; $options ||= {}; @@ -816,6 +802,7 @@ sub json_query { $method =~ s/\.atomic$//o if $self->substream($$options{substream} || 0); $self->timeout($$options{timeout}); + $self->discard($$options{discard}); $self->clear_event; my $obj; my $err; -- 2.11.0