File Coverage

blib/lib/DBIx/Class/PK.pm
Criterion Covered Total %
statement 41 44 93.1
branch 13 22 59.0
condition 7 15 46.6
subroutine 10 10 100.0
pod 3 3 100.0
total 74 94 78.7


line stmt bran cond sub pod time code
1             package DBIx::Class::PK;
2              
3 379     379   168990 use strict;
  379         1248  
  379         11540  
4 379     379   2169 use warnings;
  379         1105  
  379         10782  
5              
6 379     379   2120 use base qw/DBIx::Class::Row/;
  379         1160  
  379         259152  
7              
8             =head1 NAME
9              
10             DBIx::Class::PK - Primary Key class
11              
12             =head1 SYNOPSIS
13              
14             =head1 DESCRIPTION
15              
16             This class contains methods for handling primary keys and methods
17             depending on them.
18              
19             =head1 METHODS
20              
21             =cut
22              
23             =head2 id
24              
25             Returns the primary key(s) for a row. Can't be called as
26             a class method.
27              
28             =cut
29              
30             sub id {
31 343     343 1 24263 my ($self) = @_;
32 343 50       838 $self->throw_exception( "Can't call id() as a class method" )
33             unless ref $self;
34 343         1116 my @id_vals = $self->_ident_values;
35 343 100       2448 return (wantarray ? @id_vals : $id_vals[0]);
36             }
37              
38             sub _ident_values {
39 1739     1739   3640 my ($self, $use_storage_state) = @_;
40              
41 1739         2980 my (@ids, @missing);
42              
43 1739         4166 for ($self->result_source->_pri_cols_or_die) {
44             push @ids, ($use_storage_state and exists $self->{_column_data_in_storage}{$_})
45 1808 100 100     10355 ? $self->{_column_data_in_storage}{$_}
46             : $self->get_column($_)
47             ;
48 1808 0 33     5540 push @missing, $_ if (! defined $ids[-1] and ! $self->has_column_loaded ($_) );
49             }
50              
51 1739 50 33     5220 if (@missing && $self->in_storage) {
52 0         0 $self->throw_exception (
53             'Unable to uniquely identify result object with missing PK columns: '
54             . join (', ', @missing )
55             );
56             }
57              
58 1739         3815 return @ids;
59             }
60              
61             =head2 ID
62              
63             Returns a unique id string identifying a result object by primary key.
64             Used by L<DBIx::Class::CDBICompat::LiveObjectIndex> and
65             L<DBIx::Class::ObjectCache>.
66              
67             =over
68              
69             =item WARNING
70              
71             The default C<_create_ID> method used by this function orders the returned
72             values by the alphabetical order of the primary column names, B<unlike>
73             the L</id> method, which follows the same order in which columns were fed
74             to L<DBIx::Class::ResultSource/set_primary_key>.
75              
76             =back
77              
78             =cut
79              
80             sub ID {
81 58     58 1 119 my ($self) = @_;
82 58 50       145 $self->throw_exception( "Can't call ID() as a class method" )
83             unless ref $self;
84 58 50       142 return undef unless $self->in_storage;
85 58         88 return $self->_create_ID(%{$self->ident_condition});
  58         215  
86             }
87              
88             sub _create_ID {
89 58     58   170 my ($self, %vals) = @_;
90 58 50       136 return undef if grep { !defined } values %vals;
  80         247  
91             return join '|', ref $self || $self, $self->result_source->name,
92 58   33     197 map { $_ . '=' . $vals{$_} } sort keys %vals;
  80         712  
93             }
94              
95             =head2 ident_condition
96              
97             my $cond = $result_source->ident_condition();
98              
99             my $cond = $result_source->ident_condition('alias');
100              
101             Produces a condition hash to locate a row based on the primary key(s).
102              
103             =cut
104              
105             sub ident_condition {
106 146     146 1 679 shift->_mk_ident_cond(@_);
107             }
108              
109             sub _storage_ident_condition {
110 1252     1252   4286 shift->_mk_ident_cond(shift, 1);
111             }
112              
113             sub _mk_ident_cond {
114 1398     1398   3394 my ($self, $alias, $use_storage_state) = @_;
115              
116 1398         3881 my @pks = $self->result_source->_pri_cols_or_die;
117 1396         4626 my @vals = $self->_ident_values($use_storage_state);
118              
119 1396         2722 my (%cond, @undef);
120 1396 100       3579 my $prefix = defined $alias ? $alias.'.' : '';
121 1396         2702 for my $col (@pks) {
122 1465 50       6353 if (! defined ($cond{$prefix.$col} = shift @vals) ) {
123 0         0 push @undef, $col;
124             }
125             }
126              
127 1396 50 33     4013 if (@undef && $self->in_storage) {
128 0         0 $self->throw_exception (
129             'Unable to construct result object identity condition due to NULL PK columns: '
130             . join (', ', @undef)
131             );
132             }
133              
134 1396         22167 return \%cond;
135             }
136              
137             =head1 FURTHER QUESTIONS?
138              
139             Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
140              
141             =head1 COPYRIGHT AND LICENSE
142              
143             This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
144             by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
145             redistribute it and/or modify it under the same terms as the
146             L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
147              
148             =cut
149              
150             1;