Re: before_create trigger problems
[prev]
[thread]
[next]
[Date index for 2004/12/21]
--- 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)
|