X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FPK%2FAuto.pm;h=b7ebda70937e8a584712ce3ef9a372e6fec90962;hb=7223a5ce4537097282af3bc892cf6477baa6a3a7;hp=b9507a890193023a7535e5ddc15977aea55ed014;hpb=b8e1e21f0fcd55e6e3ce987e57601b279a75b666;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/PK/Auto.pm b/lib/DBIx/Class/PK/Auto.pm index b9507a8..b7ebda7 100644 --- a/lib/DBIx/Class/PK/Auto.pm +++ b/lib/DBIx/Class/PK/Auto.pm @@ -1,25 +1,83 @@ package DBIx::Class::PK::Auto; +#use base qw/DBIx::Class::PK/; +use base qw/DBIx::Class/; use strict; use warnings; +=head1 NAME + +DBIx::Class::PK::Auto - Automatic primary key class + +=head1 SYNOPSIS + +__PACKAGE__->load_components(qw/PK::Auto Core/); +__PACKAGE__->set_primary_key('id'); + +=head1 DESCRIPTION + +This class overrides the insert method to get automatically incremented primary +keys. + + __PACKAGE__->load_components(qw/PK::Auto Core/); + +Note that C is specified as the left of the Core component. +See L for details of component interactions. + +=head1 LOGIC + +C does this by letting the database assign the primary key field and +fetching the assigned value afterwards. + +=head1 METHODS + +=head2 insert + +Overrides C so that it will get the value of autoincremented primary +keys. + +=cut + sub insert { my ($self, @rest) = @_; - my $ret = $self->NEXT::ACTUAL::insert(@rest); - my ($pri, $too_many) = - (grep { $self->_primaries->{$_}{'auto_increment'} } - keys %{ $self->_primaries }) - || (keys %{ $self->_primaries }); - die "More than one possible key found for auto-inc on ".ref $self - if $too_many; - unless (exists $self->{_column_data}{$pri}) { - die "Can't auto-inc for $pri on ".ref $self.": no _last_insert_id method" - unless $self->can('_last_insert_id'); - my $id = $self->_last_insert_id; - die "Can't get last insert id" unless $id; - $self->store_column($pri => $id); - } + my $ret = $self->next::method(@rest); + + my ($pri, $too_many) = grep { !defined $self->get_column($_) } $self->primary_columns; + return $ret unless defined $pri; # if all primaries are already populated, skip auto-inc + $self->throw_exception( "More than one possible key found for auto-inc on ".ref $self ) + if defined $too_many; + + my $storage = $self->result_source->storage; + $self->throw_exception( "Missing primary key but Storage doesn't support last_insert_id" ) unless $storage->can('last_insert_id'); + my $id = $storage->last_insert_id($self->result_source,$pri); + $self->throw_exception( "Can't get last insert id" ) unless $id; + $self->store_column($pri => $id); + return $ret; } +=head2 sequence + +Manually define the correct sequence for your table, to avoid the overhead +associated with looking up the sequence automatically. + +=cut + +sub sequence { + my ($self,$seq) = @_; + foreach my $pri ($self->primary_columns) { + $self->column_info($pri)->{sequence} = $seq; + } +} + 1; + +=head1 AUTHORS + +Matt S. Trout + +=head1 LICENSE + +You may distribute this code under the same terms as Perl itself. + +=cut