Commit | Line | Data |
b8e1e21f |
1 | package DBIx::Class::PK::Auto; |
2 | |
773e3015 |
3 | #use base qw/DBIx::Class::PK/; |
4 | use base qw/DBIx::Class/; |
b8e1e21f |
5 | use strict; |
6 | use warnings; |
7 | |
34d52be2 |
8 | =head1 NAME |
9 | |
eb49d4e3 |
10 | DBIx::Class::PK::Auto - Automatic primary key class |
34d52be2 |
11 | |
12 | =head1 SYNOPSIS |
13 | |
eb49d4e3 |
14 | # In your table classes (replace PK::Auto::SQLite with your database) |
15 | __PACKAGE__->load_components(qw/PK::Auto::SQLite Core/); |
16 | __PACKAGE__->set_primary_key('id'); |
6718c5f0 |
17 | |
34d52be2 |
18 | =head1 DESCRIPTION |
19 | |
eb49d4e3 |
20 | This class overrides the insert method to get automatically incremented primary |
21 | keys. |
34d52be2 |
22 | |
eb49d4e3 |
23 | You don't want to be using this directly - instead load the appropriate one for |
24 | your database, e.g. C<PK::Auto::SQLite>, in your table classes: |
f4ccda68 |
25 | |
eb49d4e3 |
26 | __PACKAGE__->load_components(qw/PK::Auto::SQLite Core/); |
f4ccda68 |
27 | |
28 | Note that C<PK::Auto::SQLite> is specified as the leftmost argument. |
29 | |
30 | Alternatively, you can load the components separately: |
31 | |
eb49d4e3 |
32 | __PACKAGE__->load_components(qw/Core/); |
33 | __PACKAGE__->load_components(qw/PK::Auto::SQLite/); |
f4ccda68 |
34 | |
eb49d4e3 |
35 | This can be used, for example, if you have different databases and need to |
36 | determine the appropriate C<PK::Auto> class at runtime. |
7624b19f |
37 | |
c8f4b52b |
38 | =head1 LOGIC |
39 | |
eb49d4e3 |
40 | C<PK::Auto> does this by letting the database assign the primary key field and |
41 | fetching the assigned value afterwards. |
c8f4b52b |
42 | |
34d52be2 |
43 | =head1 METHODS |
44 | |
130c6439 |
45 | =head2 insert |
34d52be2 |
46 | |
eb49d4e3 |
47 | Overrides C<insert> so that it will get the value of autoincremented primary |
48 | keys. |
34d52be2 |
49 | |
50 | =cut |
51 | |
b8e1e21f |
52 | sub insert { |
53 | my ($self, @rest) = @_; |
147dd158 |
54 | my $ret = $self->next::method(@rest); |
0675cd04 |
55 | |
56 | # if all primaries are already populated, skip auto-inc |
57 | my $populated = 0; |
9a15732e |
58 | map { $populated++ if defined $self->get_column($_) } $self->primary_columns; |
103647d5 |
59 | return $ret if ( $populated == scalar $self->primary_columns ); |
0675cd04 |
60 | |
b8e1e21f |
61 | my ($pri, $too_many) = |
103647d5 |
62 | (grep { $self->column_info($_)->{'auto_increment'} } |
63 | $self->primary_columns) |
64 | || $self->primary_columns; |
701da8c4 |
65 | $self->throw_exception( "More than one possible key found for auto-inc on ".ref $self ) |
b8e1e21f |
66 | if $too_many; |
c1d23573 |
67 | unless (defined $self->get_column($pri)) { |
701da8c4 |
68 | $self->throw_exception( "Can't auto-inc for $pri on ".ref $self.": no _last_insert_id method" ) |
126042ee |
69 | unless $self->can('last_insert_id'); |
70 | my $id = $self->last_insert_id; |
701da8c4 |
71 | $self->throw_exception( "Can't get last insert id" ) unless $id; |
b8e1e21f |
72 | $self->store_column($pri => $id); |
73 | } |
74 | return $ret; |
75 | } |
76 | |
130c6439 |
77 | =head2 sequence |
97cc0025 |
78 | |
79 | Manually define the correct sequence for your table, to avoid the overhead |
80 | associated with looking up the sequence automatically. |
81 | |
82 | =cut |
83 | |
84 | __PACKAGE__->mk_classdata('sequence'); |
85 | |
b8e1e21f |
86 | 1; |
34d52be2 |
87 | |
34d52be2 |
88 | =head1 AUTHORS |
89 | |
daec44b8 |
90 | Matt S. Trout <mst@shadowcatsystems.co.uk> |
34d52be2 |
91 | |
92 | =head1 LICENSE |
93 | |
94 | You may distribute this code under the same terms as Perl itself. |
95 | |
96 | =cut |