DBIx-Class-Events
view release on metacpan or search on metacpan
lib/DBIx/Class/Events.pm view on Meta::CPAN
# TODO: optimize the ->columns call
map { $_ => $col_data->{$_} }
grep { exists $col_data->{$_} }
$self->result_source
->related_source( $self->events_relationship )->columns,
);
return $self->create_related( $self->events_relationship,
{ %col_data, event => $event } );
}
sub event_defaults {}
sub state_at {
my ($self, $time_stamp, @args) = @_;
if (ref $time_stamp) {
my $dtf = $self->result_source->schema->storage->datetime_parser;
$time_stamp = $dtf->format_datetime( $time_stamp );
}
my $events = $self->search_related( $self->events_relationship );
my $alias = $events->current_source_alias;
$events = $events->search( {
"$alias.event" => { in => [qw( insert update delete )] },
"$alias.triggered_on" => { '<=', $time_stamp },
},
{
select => [ "$alias.event", "$alias.details" ],
order_by => [
map {"$alias.$_ desc"} 'triggered_on',
$events->result_source->primary_columns
],
} )->search(@args);
my $event = $events->next;
return undef if !$event or $event->event eq 'delete';
my %state;
while ($event) {
%state = ( %{ $event->details || {} }, %state );
last if $event->event eq 'insert';
$event = $events->next;
}
return \%state;
}
sub insert {
my ( $class, @args ) = @_;
my $self = $class->next::method(@args);
my %inserted = $self->get_columns;
$self->event( insert => { details => \%inserted } );
return $self;
};
sub update {
my ( $self, @args ) = @_;
# Do this here instead of letting our parent do it
# so that we can use get_dirty_columns.
$self->set_inflated_columns(@args) if @args;
my %changed = $self->get_dirty_columns;
$self->next::method(); # we already set_inflated_columns
$self->event( update => { details => \%changed } ) if %changed;
return $self;
};
sub delete {
my ( $self, @args ) = @_;
# DBIx::Class::Row::delete has a special edge case for calling
# delete as a class method, we however can't log it in that case.
if ( ref $self ) {
my %deleted = $self->get_columns;
$self->event( delete => { details => \%deleted } );
}
return $self->next::method(@args);
};
1;
=pod
=encoding UTF-8
=head1 NAME
DBIx::Class::Events - Store Events for your DBIC Results
=head1 VERSION
version v0.9.3
=head1 SYNOPSIS
my $artist
= $schema->resultset('Artist')->create( { name => 'Dead Salmon' } );
$artist->events->count; # is now 1, an 'insert' event
$artist->change_name('Trout'); # add a name_change event
$artist->update; # An update event, last_name_change_id and name
# Find their previous name
my $name_change = $artist->last_name_change;
print $name_change->details->{old}, "\n";
See C<change_name> and C<last_name_change> example definitions
in L</CONFIGURATION AND ENVIRONMENT>.
# Three more name_change events and one update event
( run in 1.641 second using v1.01-cache-2.11-cpan-39bf76dae61 )