perl-modperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dave Boodman <d...@boodman.com>
Subject Re: some children not returning newly-inserted data
Date Mon, 03 May 2004 17:15:13 GMT
OK, here's some code:

     # systems
     my @statuses;
     my (@systems) = Lib::Systems->search( cid => $cid );
     unless (@systems) { $self->model->log('debug', "systems for '$cid' not 
found"); $self->context->throw( 'systems.not_found', 'Systems not found' ); };
     my $systems_profile = Lib::Profiles->system;
     foreach my $sys (@systems) {
         # reassign params from form names
         my %tmp = map { $_ => $params{$_.'_'.$sys->sysid} } 
Lib::Systems->columns;
         my ($data, $errors) = $self->model->validate($systems_profile, \%tmp);
         if (@$errors) {
             $self->context->throw( 'required', { fields => [@$errors] } );
         } else {
             my (@relen_ips, @add_ips);
             # establish status
             my $status = 1;
             if ($sys->cancel_date) { $status = 3; }
             if ($sys->stop_date) { $status = 9; }

             # process a change in status
             my $newstatus;
             if ($sys->cancel_date < 1 && $tmp{'cancel_date'}) {
                 $self->model->log('info', 'cancelling system '.$sys->sysid);
                 $newstatus = 3;
                 $status = 3;
             }
             if ($sys->stop_date < 1 && $tmp{'stop_date'}) {
                 $self->model->log('info', 'stopping system '.$sys->sysid);
                 $newstatus = 9;
                 $status = 9;
             }

             # store status so we can look at all and determine a cust status
             push @statuses, $status;

             # if status 9, add existing system's IPs to relen list
             if ($newstatus == 9) {
                 my @ipobj = Lib::Ipmap->search( sysid => $sys->sysid, 
status => 1 );
                 foreach (@ipobj) { push @relen_ips, $_->ip; }
             }

             $self->model->log('info', "updating values for system 
".$sys->sysid);
             while (my($key, $value) = each %$data) {
                 # we add this next line in case the client sends extra
                 # fields which we don't want to update. like the web
                 # client does
                 next unless ( Lib::Systems->find_column( $key ) );
                 $self->model->log('info', "setting $key to $value" );

                 eval { $sys->$key( $value ) };
                 if ($@) { $self->context->throw( 'set value', $@ ); }
             } # end while
             push @toupdate, $sys;

             # IPs
             # add new
             if ($params{'ip_'.$sys->sysid.'_new'}) {
                 my $assign_date = $self->model->{'time'}->ymd;
                 my $relen_date = 0;
     # REMOVE WHEN WE GO LIVE AND ALL 2nd SYSTEMS ARE ADDED TO RECORDS #
                 $assign_date = $sys->start_date;
     # END REMOVE #
                 # if stopping server at same time assigning new ips
                 # we assume they were supposed to be there all the time so 
we set
                 # assign date to sys start date. also, set relen_date
                 if ($newstatus == 9) { $assign_date = $sys->start_date; 
$relen_date = $self->model->{'time'}->ymd; }
                 push @toupdate, update_ip($self, $sys->sysid, $cid, 
$assign_date, $relen_date, split /[\s\,]/, $params{'ip_'.$sys->sysid.'_new'});
                 $self->model->set('ip_'.$sys->sysid.'_new','');
             } # end new ip if

             # get rid of ips
             my $relen_date = $self->model->{'time'}->ymd;
             push @relen_ips, $self->model->input('ip_'.$sys->sysid);
             push @toupdate, update_ip($self, $sys->sysid, $cid, undef, 
$relen_date, @relen_ips);
         } # end update sys else
     } # end sys foreach

---SNIP---

     # process updates
     foreach my $obj (@toupdate) {
         $self->model->log('info', "updating obj:");
         $self->model->log_dumper('info', $obj);
         eval { $obj->update };
         if ($@) {
             $self->model->log('info', 'update failed, rolling back');
             foreach my $o (@created) { $o->dbi_rollback; }
             $self->context->throw( 'update', $@ );
         } else {
             push @created, $obj;
         }
     }

     # if we made it this far, commit everything
     foreach my $obj (@toupdate) { $obj->dbi_commit; }

     $self->model->set('addsystem','');
     $self->model->set('addcontact','');
     $self->model->set('do_update','');
     return;

Thanks!
At 03:40 PM 5/1/2004, Perrin Harkins wrote:
>Dave Boodman wrote:
>>I'm seeing an issue where I do an insert and upon subsequent requests, 
>>certain children are not returning the newly-inserted data (row), while 
>>others are. Restarting apache fixes this as does waiting for some length 
>>of time.
>
>Sounds like you have a scoping problem.  You are probably accidentally 
>creating a closure somewhere that is holding onto old values.  If you can 
>reduce your code down to an example small enough to post here, we can try 
>to spot it for you.
>
>- Perrin


-- 
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html


Mime
View raw message