perl-modperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Aaron Ross <ar...@plusthree.com>
Subject Re: some children not returning newly-inserted data
Date Sun, 02 May 2004 16:06:21 GMT
Hi Dave,

It looks like you are using Class::DBI. The behavior you describe is
exactly what you would see if you had uncommitted changes. The changes
would be visible to the connections that made the changes, but not to
the other processes or connections.

If the problem is easy to reproduce, you could enable AutoCommit and see
if it goes away.

You've got all that nice logging in there, can you give us more details
about the behavior your are seeing?

HTH, Aaron

On Sat, 2004-05-01 at 20:22, Dave Boodman wrote:
> 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
-- 
Aaron Ross <aross@plusthree.com>
Plus Three


-- 
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