DBIO
view release on metacpan or search on metacpan
lib/DBIO/ChangeLog.pm view on Meta::CPAN
my $schema = $self->result_source->schema;
return undef unless $schema->can('_changelog_current_changeset_id');
return $schema->_changelog_current_changeset_id;
}
sub _changelog_get_timestamp {
my ($self) = @_;
# Use a simple ISO 8601 string; drivers can override
require POSIX;
return POSIX::strftime('%Y-%m-%d %H:%M:%S', localtime);
}
sub _changelog_excluded_columns {
my ($self) = @_;
my $info = $self->result_source->columns_info;
return { map { $_ => 1 } grep { $info->{$_}{_changelog_exclude} } keys %$info };
}
sub _changelog_filtered_columns {
my ($self, %cols) = @_;
my $exclude = $self->_changelog_excluded_columns;
delete $cols{$_} for keys %$exclude;
return %cols;
}
sub _changelog_record {
my ($self, $event, $changes) = @_;
return if $self->_changelog_is_disabled;
return unless $self->_changelog_is_tracked;
my $entry = {
changeset_id => $self->_changelog_current_changeset_id,
row_id => $self->_changelog_serialize_pk,
event => $event,
changes => $self->changelog_serialize_changes($changes),
created_at => $self->_changelog_get_timestamp,
};
$self->changelog_write_entry($entry);
$self->changelog_notify($event, $entry);
}
# ---- Overrides ----
sub insert {
my ($self, @args) = @_;
my $result = $self->next::method(@args);
if ($self->_changelog_is_tracked && !$self->_changelog_is_disabled) {
my %cols = $self->_changelog_filtered_columns($self->get_columns);
$self->_changelog_record('insert', \%cols);
}
return $result;
}
sub update {
my ($self, $upd) = @_;
# Apply the update values so get_dirty_columns sees them
$self->set_inflated_columns($upd) if $upd;
my %dirty = $self->get_dirty_columns;
# Filter out excluded columns
my $exclude = $self->_changelog_excluded_columns;
delete $dirty{$_} for keys %$exclude;
# Capture old values before the update
my %old_values;
if (%dirty && $self->_changelog_is_tracked && !$self->_changelog_is_disabled) {
for my $col (keys %dirty) {
# _column_data_in_storage has the previously stored values
$old_values{$col} = exists $self->{_column_data_in_storage}
? $self->{_column_data_in_storage}{$col}
: undef;
}
}
my $result = $self->next::method;
if (%dirty && $self->_changelog_is_tracked && !$self->_changelog_is_disabled) {
my %diffs;
for my $col (keys %dirty) {
$diffs{$col} = [ $old_values{$col}, $dirty{$col} ];
}
$self->_changelog_record('update', \%diffs) if %diffs;
}
return $result;
}
sub delete {
my ($self, @args) = @_;
my %cols;
if (ref $self && $self->_changelog_is_tracked && !$self->_changelog_is_disabled) {
%cols = $self->_changelog_filtered_columns($self->get_columns);
}
my $result = $self->next::method(@args);
if (%cols) {
$self->_changelog_record('delete', \%cols);
}
return $result;
}
sub log_event {
my ($self, $event_name, $details) = @_;
$details //= {};
$self->_changelog_record($event_name, $details);
}
( run in 1.213 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )