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 )