X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FPK%2FAuto.pm;h=64c8c8315d22145fc552a295134870a3db8e4045;hb=85dea9a95925c5a8c6b15f7ab59d06a737015812;hp=6928ba77e9decc78186e60425bd746a9145a67f8;hpb=773e30151b762903af9584a7943093170fdae91c;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/PK/Auto.pm b/lib/DBIx/Class/PK/Auto.pm index 6928ba7..64c8c83 100644 --- a/lib/DBIx/Class/PK/Auto.pm +++ b/lib/DBIx/Class/PK/Auto.pm @@ -7,26 +7,45 @@ use warnings; =head1 NAME -DBIx::Class::PK::Auto - Automatic Primary Key class +DBIx::Class::PK::Auto - Automatic primary key class =head1 SYNOPSIS + # In your table classes (replace PK::Auto::SQLite with your database) + __PACKAGE__->load_components(qw/PK::Auto::SQLite Core/); + __PACKAGE__->set_primary_key('id'); + =head1 DESCRIPTION -This class overrides the insert method to get automatically -incremented primary keys. +This class overrides the insert method to get automatically incremented primary +keys. -You don't want to be using this directly - instead load the appropriate -one for your database, e.g. PK::Auto::SQLite +You don't want to be using this directly - instead load the appropriate one for +your database, e.g. C, in your table classes: -=head1 METHODS + __PACKAGE__->load_components(qw/PK::Auto::SQLite Core/); + +Note that C is specified as the leftmost argument. + +Alternatively, you can load the components separately: + + __PACKAGE__->load_components(qw/Core/); + __PACKAGE__->load_components(qw/PK::Auto::SQLite/); + +This can be used, for example, if you have different databases and need to +determine the appropriate C class at runtime. + +=head1 LOGIC -=over 4 +C does this by letting the database assign the primary key field and +fetching the assigned value afterwards. -=item insert +=head1 METHODS + +=head2 insert -Overrides insert so that it will get the value of autoincremented -primary keys. +Overrides C so that it will get the value of autoincremented primary +keys. =cut @@ -34,40 +53,36 @@ sub insert { my ($self, @rest) = @_; my $ret = $self->next::method(@rest); - # if all primaries are already populated, skip auto-inc - my $populated = 0; - map { $populated++ if defined $self->get_column($_) } $self->primary_columns; - return $ret if ( $populated == scalar $self->primary_columns ); - - my ($pri, $too_many) = - (grep { $self->column_info($_)->{'auto_increment'} } - $self->primary_columns) - || $self->primary_columns; - $self->throw( "More than one possible key found for auto-inc on ".ref $self ) - if $too_many; - unless (defined $self->get_column($pri)) { - $self->throw( "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; - $self->throw( "Can't get last insert id" ) unless $id; - $self->store_column($pri => $id); - } + 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; } -=item sequence +=head2 sequence Manually define the correct sequence for your table, to avoid the overhead associated with looking up the sequence automatically. =cut -__PACKAGE__->mk_classdata('sequence'); +sub sequence { + my ($self,$seq) = @_; + foreach my $pri ($self->primary_columns) { + $self->column_info($pri)->{sequence} = $seq; + } +} 1; -=back - =head1 AUTHORS Matt S. Trout @@ -77,4 +92,3 @@ Matt S. Trout You may distribute this code under the same terms as Perl itself. =cut -