DBIx-Class-AuditAny
view release on metacpan or search on metacpan
lib/DBIx/Class/AuditAny/Role/Storage.pm view on Meta::CPAN
# ---
#############################################################
}
catch {
my $err = shift;
$_->_exception_cleanup($err) for ($self->all_auditors);
die $err;
};
# TODO: should we go back to the db to make sure the rows are
# now gone as expected?
$_->record for (@ChangeContexts);
# Tell each auditor that we're done and to record the change group
# into the active changeset:
$_->_finish_current_change_group for ($self->all_auditors);
return $want ? @ret : $ret[0];
};
# _get_cascading_rekey_cols: gets a map of column names to relationships. These
# are the relationships that *could* be changed via a cascade when the column (fk)
# is changed.
# TODO: use 'cascade_rekey' attr from DBIx::Class::Shadow
# (DBIx::Class::Relationship::Cascade::Rekey) ?
sub _get_cascading_rekey_columns {
my $self = shift;
my $Source = shift;
# cache for next time (should I even bother? since if rels are added to the ResultSource
# later this won't get updated? Is that a bigger risk than the performance boost?)
$self->_source_cascade_rekey_cols->{$Source->source_name} ||= do {
my $rels = { map { $_ => $Source->relationship_info($_) } $Source->relationships };
my $cascade_cols = {};
foreach my $rel (keys %$rels) {
# Only multi rels apply:
next unless ($rels->{$rel}{attrs}{accessor} eq 'multi');
# NEW: We can't currently do anything with CodeRef conditions
next if ((ref($rels->{$rel}{cond})||'') eq 'CODE');
# Get all the local columns that effect (i.e. might cascade to) this relationship:
my @cols = $self->_parse_cond_cols_by_alias($rels->{$rel}{cond},'self');
# Add the relationship to list for each column.
#$cascade_cols->{$_} ||= [] for (@cols); #<-- don't need this
push @{$cascade_cols->{$_}}, $rel for (@cols);
}
return $cascade_cols;
};
return $self->_source_cascade_rekey_rels->{$Source->source_name};
}
has '_source_cascade_rekey_cols', is => 'ro', isa => HashRef, lazy => 1, default => sub {{}};
sub _parse_cond_cols_by_alias {
my $self = shift;
my $cond = shift;
my $alias = shift;
# Get the string elements (keys and values)
# (TODO: deep walk any hahs/array structure)
my @elements = %$cond;
ref($_) and die "Complex conditions aren't supported yet" for (@elements);
my @cols = map { $_->[1] } # <-- 3. just the column names
# 2. exclude all but the alias name we want
grep { $_->[0] eq $alias }
# 1. Convert all the element strings into alias/column pairs
map { [split(/\./,$_,2)] } @elements;
return @cols;
}
=head2 changeset_do
TODO... currently is just a wrapper around a native txn_do call. Not sure what this is meant
to do...
=cut
sub changeset_do {
my $self = shift;
# TODO ...
return $self->txn_do(@_);
}
1;
__END__
=head1 SEE ALSO
=over
=item *
L<DBIx::Class::AuditAny>
=item *
L<DBIx::Class>
=back
=head1 SUPPORT
IRC:
Join #rapidapp on irc.perl.org.
=head1 AUTHOR
( run in 0.618 second using v1.01-cache-2.11-cpan-804bf51f3ce )