Rose-DB-Object
view release on metacpan or search on metacpan
lib/Rose/DB/Object/MakeMethods/Generic.pm view on Meta::CPAN
{
next if($meta->column($local_column)->is_primary_key_member);
my $local_method = $meta->column_accessor_method_name($local_column);
$self->$local_method(undef);
}
}
$self->{$key} = undef;
return 1;
}
$self->error("Could not delete $name object - the " .
"$local_method attribute is undefined");
return undef;
}
}
$object->init(%key);
my($db, $started_new_tx, $deleted, %save_fk, $to_save_pre, $to_save_post, $error);
TRY:
{
local $@;
eval
{
$db = $self->db;
$object->db($db);
my $ret = $db->begin_work;
unless(defined $ret)
{
die 'Could not begin transaction during call to $name() - ',
$db->error;
}
$started_new_tx = ($ret == IN_TRANSACTION) ? 0 : 1;
if($ref_integrity || $required)
{
local $fk->{'disable_column_triggers'} = 1;
# Clear columns that reference the foreign key
foreach my $local_column (keys %$fk_columns)
{
next if($meta->column($local_column)->is_primary_key_member);
my $local_method = $meta->column_accessor_method_name($local_column);
$save_fk{$local_method} = $self->$local_method();
$self->$local_method(undef);
}
}
# Forget about any value we were going to set on save
$to_save_pre = delete $self->{ON_SAVE_ATTR_NAME()}{'pre'}{'fk'}{$fk_name}{'set'};
$to_save_post = delete $self->{ON_SAVE_ATTR_NAME()}{'post'}{'rel'}{$fk_name}{'set'};
$self->save or die $self->error;
# Propogate cascade arg, if any
$deleted = $object->delete(@_) or die $object->error;
if($started_new_tx)
{
$db->commit or die $db->error;
}
$self->{$key} = undef;
# Not sharing? Aw.
$object->db(undef) unless($share_db);
};
$error = $@;
}
if($error)
{
$self->error(ref $error ? $error : "Could not delete $name object - $error");
$db->rollback if($db && $started_new_tx);
# Restore foreign key column values
while(my($method, $value) = each(%save_fk))
{
$self->$method($value);
}
# Restore any value we were going to set on save
$self->{ON_SAVE_ATTR_NAME()}{'pre'}{'fk'}{$fk_name}{'set'} = $to_save_pre
if($to_save_pre);
$self->{ON_SAVE_ATTR_NAME()}{'post'}{'rel'}{$fk_name}{'set'} = $to_save_post
if($to_save_post);
$meta->handle_error($self);
return undef;
}
return $deleted;
};
}
elsif($interface eq 'delete_on_save')
{
unless($fk)
{
Carp::croak "Cannot make 'delete_on_save' method $name without foreign key argument";
}
my $fk_name = $fk->name;
my $is_fk = $fk->type eq 'foreign key' ? 1 : 0;
$methods{$name} = sub
{
my($self) = shift;
my $object = $self->{$key} || $fk_class->new;
my %key;
while(my($local_column, $foreign_column) = each(%$fk_columns))
( run in 0.795 second using v1.01-cache-2.11-cpan-39bf76dae61 )