From: Yuval Kogman Date: Wed, 30 Jul 2008 04:53:27 +0000 (+0000) Subject: multi column PK support X-Git-Tag: v0.900201~81 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=30a4f2413c77b479a3391914b795dd9d806b4d42;p=dbsrgits%2FDBIx-Class-Journal.git multi column PK support --- diff --git a/lib/DBIx/Class/Journal.pm b/lib/DBIx/Class/Journal.pm index 8c3a57d..4130baa 100644 --- a/lib/DBIx/Class/Journal.pm +++ b/lib/DBIx/Class/Journal.pm @@ -29,17 +29,9 @@ sub insert { my $s_name = $self->result_source->source_name(); my $al = $self->result_source->schema->_journal_schema->resultset("${s_name}AuditLog"); - my ($pri, $too_many) = map { $self->get_column($_)} $self->primary_columns; - if(defined $pri && defined $too_many) - { - $self->throw_exception( "More than one possible key found for auto-inc on ".ref $self ); - } - $pri ||= \'NULL'; #' - $al->create({ - ID => $pri, -# created => { -# changeset => $self->result_source->schema->_journal_schema->current_changeset(), -# }, + $al->update_or_create({ + ( map { $_ => $self->get_column($_)} $self->primary_columns ), + created => { changeset_id => $al->result_source->schema->current_changeset }, }); } @@ -57,22 +49,12 @@ sub delete { my $s_name = $self->result_source->source_name(); my $al = $self->result_source->schema->_journal_schema->resultset("${s_name}AuditLog"); - my ($pri, $too_many) = map { $self->get_column($_)} $self->primary_columns; - if(defined $pri && defined $too_many) - { - $self->throw_exception( "More than one possible key found for auto-inc on ".ref $self ); - } - - if($pri) - { - my $alentry = $al->find({ID => $pri}); - $self->throw_exception( "No audit_log entry found for ".ref($self) . " item $pri" ) if(!$alentry); - - ## 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(); - } + 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(); } } diff --git a/lib/DBIx/Class/Schema/Journal.pm b/lib/DBIx/Class/Schema/Journal.pm index f688d39..eaa4808 100644 --- a/lib/DBIx/Class/Schema/Journal.pm +++ b/lib/DBIx/Class/Schema/Journal.pm @@ -131,11 +131,13 @@ sub create_journal_for my ($self, $s_name) = @_; my $source = $self->source($s_name); - my $newclass = $self->get_audit_log_class_name($s_name); - DBIx::Class::Componentised->inject_base($newclass, 'DBIx::Class::Schema::Journal::DB::AuditLog'); - $newclass->table(lc($s_name) . "_audit_log"); + my $logclass = $self->get_audit_log_class_name($s_name); + + DBIx::Class::Componentised->inject_base($logclass, 'DBIx::Class::Schema::Journal::DB::AuditLog'); + $logclass->journal_define_table($source); + my $log_source = "${s_name}AuditLog"; - $self->_journal_schema->register_class($log_source, $newclass); + $self->_journal_schema->register_class($log_source, $logclass); my $histclass = $self->get_audit_history_class_name($s_name); diff --git a/lib/DBIx/Class/Schema/Journal/DB.pm b/lib/DBIx/Class/Schema/Journal/DB.pm index 1f247fb..d41ff5a 100644 --- a/lib/DBIx/Class/Schema/Journal/DB.pm +++ b/lib/DBIx/Class/Schema/Journal/DB.pm @@ -10,10 +10,10 @@ __PACKAGE__->mk_group_accessors( simple => '_current_changeset_container' ); DBIx::Class::Schema::Journal::DB->load_classes(qw/ ChangeSet ChangeLog - AuditLog AuditHistory /); +require DBIx::Class::Schema::Journal::DB::AuditLog; sub _current_changeset { my $self = shift; diff --git a/lib/DBIx/Class/Schema/Journal/DB/AuditHistory.pm b/lib/DBIx/Class/Schema/Journal/DB/AuditHistory.pm index d19d11b..bfa8fba 100644 --- a/lib/DBIx/Class/Schema/Journal/DB/AuditHistory.pm +++ b/lib/DBIx/Class/Schema/Journal/DB/AuditHistory.pm @@ -4,11 +4,11 @@ use base 'DBIx::Class::Schema::Journal::DB::Base'; __PACKAGE__->table(__PACKAGE__->table); __PACKAGE__->add_columns( - change_id => { + audit_change_id => { data_type => 'integer', is_nullable => 0, }); -__PACKAGE__->belongs_to('change', 'DBIx::Class::Schema::Journal::DB::ChangeLog', 'change_id'); +__PACKAGE__->belongs_to('change', 'DBIx::Class::Schema::Journal::DB::ChangeLog', 'audit_change_id'); sub new { diff --git a/lib/DBIx/Class/Schema/Journal/DB/AuditLog.pm b/lib/DBIx/Class/Schema/Journal/DB/AuditLog.pm index 8938045..83a1a90 100644 --- a/lib/DBIx/Class/Schema/Journal/DB/AuditLog.pm +++ b/lib/DBIx/Class/Schema/Journal/DB/AuditLog.pm @@ -1,42 +1,35 @@ package DBIx::Class::Schema::Journal::DB::AuditLog; -use base 'DBIx::Class::Schema::Journal::DB::Base'; -__PACKAGE__->table(__PACKAGE__->table); - -__PACKAGE__->add_columns( - ID => { - data_type => 'integer', -# is_auto_increment => 1, - is_nullable => 0, - }, - create_id => { - data_type => 'integer', - is_nullable => 0, - is_foreign_key => 1, - }, - delete_id => { - data_type => 'integer', - is_nullable => 1, - is_foreign_key => 1, - }); -__PACKAGE__->set_primary_key('ID'); - - __PACKAGE__->belongs_to('created', 'DBIx::Class::Schema::Journal::DB::ChangeLog', 'create_id'); - __PACKAGE__->belongs_to('deleted', 'DBIx::Class::Schema::Journal::DB::ChangeLog', 'delete_id'); - -sub new -{ - my ($self, $data, @rest) = @_; - my $source = $data->{-result_source}; - - $data->{created} = { -# ID => \'DEFAULT', -# ID => 1, - changeset_id => $source->schema->current_changeset, - %{$data->{created}||{}}, - }; - - $self->next::method($data, @rest); -} +use base 'DBIx::Class'; + +sub journal_define_table { + my ( $class, $source ) = @_; + + $class->load_components(qw(Core)); + + $class->table($source->name . "_audit_log"); + + $class->add_columns( + create_id => { + data_type => 'integer', + is_nullable => 0, + is_foreign_key => 1, + }, + delete_id => { + data_type => 'integer', + is_nullable => 1, + is_foreign_key => 1, + } + ); + + foreach my $column ( $source->primary_columns ) { + $class->add_column( $column => { %{ $source->column_info($column) } } ); + } + + $class->set_primary_key( $source->primary_columns ); + + $class->belongs_to('created', 'DBIx::Class::Schema::Journal::DB::ChangeLog', 'create_id'); + $class->belongs_to('deleted', 'DBIx::Class::Schema::Journal::DB::ChangeLog', 'delete_id'); +} 1; diff --git a/lib/DBIx/Class/Schema/Journal/DB/ChangeLog.pm b/lib/DBIx/Class/Schema/Journal/DB/ChangeLog.pm index a18ef09..bf0dc3b 100644 --- a/lib/DBIx/Class/Schema/Journal/DB/ChangeLog.pm +++ b/lib/DBIx/Class/Schema/Journal/DB/ChangeLog.pm @@ -4,7 +4,7 @@ use base 'DBIx::Class'; # __PACKAGE__->load_components(qw/Core/); __PACKAGE__->load_components(qw/Ordered Core/); -__PACKAGE__->table('change_log'); +__PACKAGE__->table('changelog'); __PACKAGE__->add_columns( ID => { diff --git a/t/01test.t b/t/01test.t index c5afa72..57da686 100644 --- a/t/01test.t +++ b/t/01test.t @@ -68,7 +68,7 @@ $schema->txn_do( sub { $new_cd->delete; } ); -my $alentry = $search->find({ ID => $new_cd->get_column($new_cd->primary_columns) }); +my $alentry = $search->find({ map { $_ => $new_cd->get_column($_) } $new_cd->primary_columns }); ok(defined($alentry->deleted), 'Deleted set in audit_log'); $schema->changeset_user(1);