use strict;
use warnings;
-our $VERSION = '0.02_01';
+our $VERSION = '0.900001_04';
+$VERSION = eval $VERSION; # no errors in dev versions
-## On create/insert, add new entry to AuditLog
+## On create/insert, add new entry to AuditLog and new content to AuditHistory
-# sub new
-# {
-# my ($class, $attrs, @rest) = @_;
+sub _journal_schema {
+ my $self = shift;
+ $self->result_source->schema->_journal_schema;
+}
+
+sub insert {
+ my ($self, @args) = @_;
+ return if $self->in_storage;
-# $class->result_source->schema->_journal_schema->current_user(delete $attrs->{user_id});
+ my $res = $self->next::method(@args);
+ $self->journal_log_insert;
-# $class->next::method($attrs, @rest);
-# }
+ return $res;
+}
-sub insert
-{
+sub journal_log_insert {
my ($self) = @_;
- return if($self->in_storage);
- ## create new transaction here?
- my $res = $self->next::method();
- if($self->in_storage)
- {
- my $s_name = $self->result_source->source_name();
- my $al = $self->result_source->schema->_journal_schema->resultset("${s_name}AuditLog");
- $al->update_or_create({
- ( map { $_ => $self->get_column($_)} $self->primary_columns ),
- created => { changeset_id => $al->result_source->schema->current_changeset },
- });
+ if ( $self->in_storage ) {
+ my $j = $self->_journal_schema;
+ my $change_id = $j->journal_create_change()->id;
+ $j->journal_update_or_create_log_entry( $self, create_id => $change_id );
+ $j->journal_record_in_history( $self, audit_change_id => $change_id );
}
-
- return $res;
}
## On delete, update delete_id of AuditLog
-sub delete
-{
- my ($self, @rest) = @_;
- $self->next::method(@rest);
-
- if(!$self->in_storage)
- {
- my $s_name = $self->result_source->source_name();
- my $al = $self->result_source->schema->_journal_schema->resultset("${s_name}AuditLog");
- my $alentry = $al->find_or_create({ map { $_ => $self->get_column($_)} $self->primary_columns });
-
- ## bulk_update doesnt do "create new item on update of rel-accessor with hashref, yet
- my $change = $self->result_source->schema->_journal_schema->resultset('ChangeLog')->create({ changeset_id => $self->result_source->schema->_journal_schema->current_changeset });
- $alentry->delete_id($change->id);
- $alentry->update();
+sub delete {
+ my $self = shift;
+ $self->next::method(@_);
+ $self->journal_log_delete(@_);
+}
+
+sub journal_log_delete {
+ my ($self) = @_;
+
+ unless ($self->in_storage) {
+ my $j = $self->_journal_schema;
+ $j->journal_update_or_create_log_entry( $self, delete_id => $j->journal_create_change->id );
}
-
}
-## On update, copy previous row's contents to AuditHistory
+## On update, copy row's new contents to AuditHistory
-sub update
-{
- my ($self, $upd, @rest) = @_;
+sub update {
+ my $self = shift;
+ $self->next::method(@_);
+ $self->journal_log_update(@_);
+}
- if($self->in_storage)
- {
- my $s_name = $self->result_source->source_name();
- my $ah = $self->result_source->schema->_journal_schema->resultset("${s_name}AuditHistory");
+sub journal_log_update {
+ my $self = shift;
- my $obj = $self->result_source->resultset->find( $self->ident_condition );
- $ah->create({
- $obj->get_columns,
- change => { changeset_id => $ah->result_source->schema->current_changeset },
- });
+ if ($self->in_storage) {
+ my $j = $self->_journal_schema;
+ my $change_id = $j->journal_create_change->id;
+ $j->journal_record_in_history( $self, audit_change_id => $change_id );
}
-
- $self->next::method($upd, @rest);
}
=head1 NAME
=head1 SYNOPSIS
- package My::Schema;
- use base 'DBIx::Class::Schema';
+ package My::Schema;
+ use base 'DBIx::Class::Schema';
- __PACKAGE__->load_components(qw/+DBIx::Class::Schema::Journal/);
+ __PACKAGE__->load_components(qw/Schema::Journal/);
- __PACKAGE__->journal_connection(['dbi:SQLite:t/var/Audit.db']);
- __PACKAGE__->journal_user(['My::Schema::User', {'foreign.userid' => 'self.user_id'}]);
+ __PACKAGE__->journal_connection(['dbi:SQLite:t/var/Audit.db']);
+ __PACKAGE__->journal_user(['My::Schema::User', {'foreign.userid' => 'self.user_id'}]);
- ########
+ #######
- $schema->changeset_user($user->id);
- my $new_artist = $schema->txn_do( sub {
- return = $schema->resultset('Artist')->create({ name => 'Fred' });
- });
+ $schema->changeset_user($user->id);
+ my $new_artist = $schema->txn_do( sub {
+ return $schema->resultset('Artist')->create({ name => 'Fred' });
+ });
=head1 DESCRIPTION
of each row is stored, as well as the previous contents of any row
that gets changed.
-All queries which want auditing should be called using
+All queries which need auditing must be called using
L<DBIx::Class::Schema/txn_do>, which is used to create changesets for
each transaction.
=head2 TABLES
-The journal schema contains a number of tables.
+The journal schema contains a number of tables.
=over
database. The storage object will be shared by the regular schema and the
journalling schema.
+=item journal_components @components
+
+If you want to add components to your journal
+(L<DBIx::Class::Schema::Versioned> for example) this would be the
+
+
=item journal_sources \@source_names
Set a list of source names you would like to audit, if unset, all