File Coverage

blib/lib/DBIx/Class/Relationship/HasOne.pm
Criterion Covered Total %
statement 47 50 94.0
branch 20 24 83.3
condition 2 3 66.6
subroutine 10 11 90.9
pod 0 2 0.0
total 79 90 87.7


line stmt bran cond sub pod time code
1             package # hide from PAUSE
2             DBIx::Class::Relationship::HasOne;
3              
4 312     312   100504 use strict;
  312         745  
  312         8518  
5 312     312   1598 use warnings;
  312         655  
  312         7522  
6 312     312   1700 use DBIx::Class::Carp;
  312         634  
  312         2318  
7 312     312   1868 use DBIx::Class::_Util qw( dbic_internal_try dbic_internal_catch );
  312         711  
  312         15740  
8 312     312   1860 use namespace::clean;
  312         787  
  312         1809  
9              
10             our %_pod_inherit_config =
11             (
12             class_map => { 'DBIx::Class::Relationship::HasOne' => 'DBIx::Class::Relationship' }
13             );
14              
15             sub might_have {
16 1846     1846 0 34551 shift->_has_one('LEFT' => @_);
17             }
18              
19             sub has_one {
20 540     540 0 8622 shift->_has_one(undef() => @_);
21             }
22              
23             sub _has_one {
24 2386     2386   9089 my ($class, $join_type, $rel, $f_class, $cond, $attrs) = @_;
25 2386 100       8836 unless (ref $cond) {
26 1855         15981 my $pri = $class->result_source->_single_pri_col_or_die;
27              
28 1855         4878 my ($f_key,$guess,$f_rsrc);
29 1855 100 66     10335 if (defined $cond && length $cond) {
30 1586         4546 $f_key = $cond;
31 1586         5437 $guess = "caller specified foreign key '$f_key'";
32             }
33             else {
34             # at this point we need to load the foreigner, expensive or not
35 269         2847 $class->ensure_class_loaded($f_class);
36              
37             $f_rsrc = dbic_internal_try {
38 269     269   3107 my $r = $f_class->result_source;
39 269 50       12018 die "There got to be some columns by now... (exception caught and rewritten by catch below)"
40             unless $r->columns;
41 269         1014 $r;
42             }
43             dbic_internal_catch {
44 0     0   0 $class->throw_exception(
45             "Foreign class '$f_class' does not seem to be a Result class "
46             . "(or it simply did not load entirely due to a circular relation chain)"
47             );
48 269         6578 };
49              
50 269 50       6910 if ($f_rsrc->has_column($rel)) {
51 0         0 $f_key = $rel;
52 0         0 $guess = "using given relationship name '$rel' as foreign key column name";
53             }
54             else {
55 269         1226 $f_key = $f_rsrc->_single_pri_col_or_die;
56 269         826 $guess = "using primary key of foreign class for foreign key";
57             }
58             }
59              
60             # FIXME - this check needs to be moved to schema-composition time...
61             # # only perform checks if the far side was not preloaded above *AND*
62             # # appears to have been loaded by something else (has a rsrc)
63             # if (! $f_rsrc and $f_rsrc = dbic_internal_try { $f_class->result_source }) {
64             # $class->throw_exception(
65             # "No such column '$f_key' on foreign class ${f_class} ($guess)"
66             # ) if !$f_rsrc->has_column($f_key);
67             # }
68              
69 1855         9348 $cond = { "foreign.${f_key}" => "self.${pri}" };
70             }
71 2386         17021 $class->_validate_has_one_condition($cond);
72              
73 2386 100       8674 my $default_cascade = ref $cond eq 'CODE' ? 0 : 1;
74              
75             $class->add_relationship($rel, $f_class,
76             $cond,
77             { accessor => 'single',
78             cascade_update => $default_cascade,
79             cascade_delete => $default_cascade,
80             is_depends_on => 0,
81             ($join_type ? ('join_type' => $join_type) : ()),
82 2386 100       7768 %{$attrs || {}} });
  2386 100       38228  
83 2384         8929 1;
84             }
85              
86             sub _validate_has_one_condition {
87 2386     2386   6365 my ($class, $cond ) = @_;
88              
89 2386 100       8313 return if $ENV{DBIC_DONT_VALIDATE_RELS};
90 2385 100       8063 return unless 'HASH' eq ref $cond;
91 2116         8062 foreach my $foreign_id ( keys %$cond ) {
92 2116         4795 my $self_id = $cond->{$foreign_id};
93              
94             # we can ignore a bad $self_id because add_relationship handles this
95             # exception
96 2116 50       10747 return unless $self_id =~ /^self\.(.*)$/;
97              
98 2116         6057 my $key = $1;
99              
100 2116 50       10492 my $column_info = $class->result_source->columns_info->{$key}
101             or $class->throw_exception(
102             "Defining rel on ${class} that includes '$key' "
103             . 'but no such column defined there yet'
104             );
105              
106             carp(
107             "'might_have'/'has_one' must not be used on columns with is_nullable "
108             . "set to true ($class/$key). This almost certainly indicates an "
109             . "incorrect use of these relationship helpers instead of 'belongs_to'"
110 2116 100       10790 ) if $column_info->{is_nullable};
111             }
112             }
113              
114             1;