attempt to fix weird overload '0+' bug, modify tests to make sure it works
[dbsrgits/DBIx-Class-Historic.git] / lib / DBIx / Class / PK.pm
CommitLineData
dbd7896f 1package DBIx::Class::PK;
2
3use strict;
4use warnings;
5
1edd1722 6use base qw/DBIx::Class::Row/;
dbd7896f 7
34d52be2 8=head1 NAME
9
10DBIx::Class::PK - Primary Key class
11
12=head1 SYNOPSIS
13
14=head1 DESCRIPTION
15
8091aa91 16This class contains methods for handling primary keys and methods
17depending on them.
34d52be2 18
19=head1 METHODS
20
34d52be2 21=cut
22
dbd7896f 23sub _ident_cond {
24 my ($class) = @_;
d7156e50 25 return join(" AND ", map { "$_ = ?" } $class->primary_columns);
dbd7896f 26}
27
28sub _ident_values {
29 my ($self) = @_;
d7156e50 30 return (map { $self->{_column_data}{$_} } $self->primary_columns);
dbd7896f 31}
32
8091aa91 33=head2 discard_changes
076652e8 34
8091aa91 35Re-selects the row from the database, losing any changes that had
36been made.
076652e8 37
38=cut
39
510ca912 40sub discard_changes {
41 my ($self) = @_;
42 delete $self->{_dirty_columns};
8d5134b0 43 return unless $self->in_storage; # Don't reload if we aren't real!
b653de5d 44 my ($reload) = $self->result_source->resultset->find(map { $self->$_ } $self->primary_columns);
c1d23573 45 unless ($reload) { # If we got deleted in the mean-time
8d5134b0 46 $self->in_storage(0);
c1d23573 47 return $self;
48 }
4a07648a 49 delete @{$self}{keys %$self};
50 @{$self}{keys %$reload} = values %$reload;
c1d23573 51 return $self;
510ca912 52}
53
8091aa91 54=head2 id
076652e8 55
8091aa91 56Returns the primary key(s) for a row. Can't be called as
076652e8 57a class method.
58
59=cut
60
604d9f38 61sub id {
62 my ($self) = @_;
701da8c4 63 $self->throw_exception( "Can't call id() as a class method" ) unless ref $self;
604d9f38 64 my @pk = $self->_ident_values;
65 return (wantarray ? @pk : $pk[0]);
66}
67
8091aa91 68=head2 ID
69
70Returns a unique id string identifying a row object by primary key.
71Used by L<DBIx::Class::CDBICompat::LiveObjectIndex> and
72L<DBIx::Class::ObjectCache>.
73
74=cut
75
48700d09 76sub ID {
77 my ($self) = @_;
701da8c4 78 $self->throw_exception( "Can't call ID() as a class method" ) unless ref $self;
48700d09 79 return undef unless $self->in_storage;
d7156e50 80 return $self->_create_ID(map { $_ => $self->{_column_data}{$_} } $self->primary_columns);
48700d09 81}
82
83sub _create_ID {
9bbd8963 84 my ($self,%vals) = @_;
90f3f5ff 85 return undef unless 0 == grep { !defined } values %vals;
9bbd8963 86 return join '|', ref $self || $self, $self->result_source->name, map { $_ . '=' . $vals{$_} } sort keys %vals;
48700d09 87}
88
103647d5 89sub ident_condition {
fea3d045 90 my ($self, $alias) = @_;
103647d5 91 my %cond;
fea3d045 92 $cond{(defined $alias ? "${alias}.$_" : $_)} = $self->get_column($_) for $self->primary_columns;
103647d5 93 return \%cond;
94}
95
dbd7896f 961;
34d52be2 97
34d52be2 98=head1 AUTHORS
99
daec44b8 100Matt S. Trout <mst@shadowcatsystems.co.uk>
34d52be2 101
102=head1 LICENSE
103
104You may distribute this code under the same terms as Perl itself.
105
106=cut
107