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 )