Re: before_create trigger problems

[prev] [thread] [next] [Date index for 2004/12/21]

From: Emile Aben
Subject: Re: before_create trigger problems
Date: 18:35 on 21 Dec 2004
--- Emile Aben <emileaben@xxxxx.xxx> wrote:

> 
> --- Tony Bowden <tony-cdbitalk@xxxxx.xxx> wrote:
> 
> > On Mon, Dec 20, 2004 at 05:39:11PM -0800, Emile
> Aben
> > wrote:
> > > MonitorData=HASH(0x6c3498) destroyed without
> > saving
> > > changes to end_date at
> > >
> >
>
/usr/local/perl-5.6.0/lib/site_perl/5.6.0/Class/Trigger.pm
> > > line 51
> > > 
> > > Is there anything that prevents updates/deletes
> > from
> > > within a trigger?
> > 
> > No, but you have to use the low level data access
> in
> > a before_create
> > trigger, as the normal accessors expect to be
> > working on an object
> > that's already in existence.
> 
> OK, that did the trick! It was a bit
> counterintuitive
> to me at first to have to use low-level data access
> on
> objects that are just fetched from the database, but
> now I understand (and after rereading the manual it
> was inthere as well).

Cheered too early. Now I'm genuinly confused. In my
triggered routine I fetch information from the
database, and I seem to have to use the low-level
access sometimes, but not at other times:

sub _fixup_exclusive {
	my ($this) = @_;
	# need to use low-level accessors(_attrs) and not
set/get here because we're in a trigger!
	# shouldn't be too many @attrs that match
	my @mondata_list = __PACKAGE__->search ( 
		{ 
			monitor => $this->_attrs("monitor"),
			attribute => $this->_attrs("attribute"),
		}
	);

	my $new_start = $this->_attrs("start_date");
	my $new_end   = $this->_attrs("end_date");
	foreach my $old (@mondata_list) {
		next if ( $this->_attrs("id") 
			&& $this->_attrs("id") eq $old->_attrs("id") );
		my $old_start = $old->start_date();
		my $old_end   = $old->end_date();

		next if ($old_end && ( $old_end < $new_start ));
		print STDERR "NEW: $new_start -> $new_end \n";
		print STDERR "OLD: $old_start -> $old_end \n";
		use Data::Dumper; print Dumper($old);


$old is an object created from a search in the
database, but to be able to access anything other than
the primary key, I have to use the accessor
'start_date', otherwise the data for this object won't
actually be fetched from the database (checked that
with Data::Dumper).

Further on in the triggered sub I sometimes have to
create a new object in the database, and I'm currently
unable to get this working. My best try is:

               if ($new_end && $new_start >=
$old_start && (!$old_end || $new_end <= $old_end ) ) {
			# case:     nnnn
                        #        ooooooooo(...)
			# solution: cut old in 2
			print STDERR "     nnnn\n";
			print STDERR "   ooooooooo(...)\n";
			my $old2 = $old->copy();
			$old2->_attribute_set("start_date", $new_end + 1 );
			$old2->update();
			$old->_attribute_set("end_date", $new_start - 1 );
			$old->update();
		}

This get's stuck on line 51 in Trigger.pm again:
Can't retrieve a reference at
/usr/local/perl-5.6.0/lib/site_perl/5.6.0/Class/Trigger.pm
line 51

Thanks for any pointers.

Emile


		
__________________________________ 
Do you Yahoo!? 
Yahoo! Mail - Easier than ever with enhanced search. Learn more.
http://info.mail.yahoo.com/mail_250

(message missing)

before_create trigger problems
Emile Aben 01:39 on 21 Dec 2004

Re: before_create trigger problems
Tony Bowden 09:09 on 21 Dec 2004

Re: before_create trigger problems
Drew Taylor 16:21 on 21 Dec 2004

Re: before_create trigger problems
Emile Aben 17:13 on 21 Dec 2004

Re: before_create trigger problems
Emile Aben 18:35 on 21 Dec 2004

Re: before_create trigger problems
Charles Bailey 19:01 on 21 Dec 2004

Re: before_create trigger problems
Emile Aben 19:28 on 21 Dec 2004

Re: before_create trigger problems
Charles Bailey 15:56 on 22 Dec 2004

Re: before_create trigger problems
Emile Aben 17:24 on 22 Dec 2004

Generated at 12:15 on 16 Jan 2005 by mariachi v0.52