backporting 16544: in the SIP server plugin, don't connect and start a transaction...
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 1 Jun 2010 20:40:25 +0000 (20:40 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 1 Jun 2010 20:40:25 +0000 (20:40 +0000)
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
Open-ILS/src/perlmods/OpenILS/SIP/Patron.pm
Open-ILS/src/perlmods/OpenILS/Utils/CStoreEditor.pm

index 20fcaa0..c10311a 100644 (file)
@@ -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)
index 933ec17..5267623 100644 (file)
@@ -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;
 }
 
index d649b86..66345b0 100644 (file)
@@ -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;