File Coverage

blib/lib/Geoffrey/Action/Constraint.pm
Criterion Covered Total %
statement 102 105 97.1
branch 25 30 83.3
condition 13 18 72.2
subroutine 20 20 100.0
pod 7 7 100.0
total 167 180 92.7


line stmt bran cond sub pod time code
1             package Geoffrey::Action::Constraint;
2              
3 6     6   22459 use utf8;
  6         27  
  6         42  
4 6     6   284 use 5.016;
  6         20  
5 6     6   34 use strict;
  6         11  
  6         141  
6 6     6   30 use warnings;
  6         12  
  6         305  
7              
8             $Geoffrey::Action::Constraint::VERSION = '0.000203';
9              
10 6     6   467 use parent 'Geoffrey::Role::Action';
  6         345  
  6         42  
11              
12             sub new {
13 16     16 1 2391 my $class = shift;
14 16         90 my $self = $class->SUPER::new(@_);
15             $self->{constraints} = [
16 15         84 qw/
17             foreignkey
18             primarykey
19             check
20             index
21             unique
22             /
23             ];
24 15         67 return bless $self, $class;
25             }
26              
27             sub _obj_check {
28 39     39   71 my ($self) = @_;
29 39         2111 require Geoffrey::Action::Constraint::Check;
30 39   66     166 $self->{check} //= Geoffrey::Action::Constraint::Check->new(
31             converter => $self->converter,
32             dbh => $self->dbh,
33             );
34 39         120 return $self->{check};
35             }
36              
37             sub _obj_index {
38 39     39   73 my ($self) = @_;
39 39         2061 require Geoffrey::Action::Constraint::Index;
40 39   66     178 $self->{index} //= Geoffrey::Action::Constraint::Index->new(
41             converter => $self->converter,
42             dbh => $self->dbh,
43             );
44 39         103 return $self->{index};
45             }
46              
47             sub _obj_unique {
48 40     40   80 my ($self) = @_;
49 40         2048 require Geoffrey::Action::Constraint::Unique;
50 40   66     159 $self->{unique} //= Geoffrey::Action::Constraint::Unique->new(
51             converter => $self->converter,
52             dbh => $self->dbh,
53             );
54 40         133 return $self->{unique};
55             }
56              
57             sub _obj_primarykey {
58 40     40   78 my ($self) = @_;
59 40         2114 require Geoffrey::Action::Constraint::PrimaryKey;
60 40   66     168 $self->{primarykey} //= Geoffrey::Action::Constraint::PrimaryKey->new(
61             converter => $self->converter,
62             dbh => $self->dbh,
63             );
64 40         135 return $self->{primarykey};
65             }
66              
67             sub _obj_foreignkey {
68 121     121   216 my ($self) = @_;
69 121         3319 require Geoffrey::Action::Constraint::ForeignKey;
70 121   66     385 $self->{foreignkey} //= Geoffrey::Action::Constraint::ForeignKey->new(
71             converter => $self->converter,
72             dbh => $self->dbh,
73             );
74 121         294 return $self->{foreignkey};
75             }
76              
77              
78             sub _set_collective_params {
79 39     39   85 my ($self, $s_sub_call, $b_param) = @_;
80 39         64 for (@{$self->{constraints}}) {
  39         118  
81 195         370 my $s_obj_sub = '_obj_' . $_;
82 195         465 $self->$s_obj_sub($self)->$s_sub_call($b_param);
83             }
84 39         70 return 1;
85             }
86              
87             sub _collective_do {
88 3     3   12 my ($self, $s_sub_call, $s_table_name, $constraints_to_alter) = @_;
89 3         8 my @a_result = ();
90 3         7 for (@{$constraints_to_alter}) {
  3         11  
91 3         18 my $s_obj_sub = '_obj_' . delete $_->{constraint};
92 3 50       25 if (!$self->can($s_obj_sub)) {
93 0         0 require Geoffrey::Exception::General;
94 0         0 return Geoffrey::Exception::General::throw_unknown_action($s_obj_sub);
95             }
96 3         10 $_->{table} = $s_table_name;
97 3         20 push @a_result, $self->do($self->$s_obj_sub()->$s_sub_call($_));
98             }
99 1 50       5 return if scalar @a_result == 0;
100 1 50       8 return shift @a_result if scalar @a_result == 1;
101 0         0 return \@a_result;
102             }
103              
104             sub for_table {
105 122     122 1 1738 my ($self, $b_for_table) = @_;
106 122 100       429 return $self->{for_table} if (!defined $b_for_table);
107 38         95 $self->{for_table} = $b_for_table;
108 38         117 $self->_set_collective_params('for_table', $b_for_table);
109 38         74 return $self;
110             }
111              
112             sub dryrun {
113 2     2 1 9 my ($self, $b_dryrun) = @_;
114 2 100       9 return $self->{dryrun} if (!defined $b_dryrun);
115 1         3 $self->{dryrun} = $b_dryrun;
116 1         5 $self->_set_collective_params('dryrun', $b_dryrun);
117 1         9 return $self;
118             }
119              
120             sub add {
121 84     84 1 5595 my ($self, $s_table_name, $hr_params, $ar_constraint_params) = @_;
122 84 100       182 return $self->create_table_column($s_table_name, $hr_params, $ar_constraint_params)
123             if $self->for_table;
124 4         29 require Geoffrey::Exception::General;
125 4         18 return Geoffrey::Exception::General::throw_unknown_action('add constraint');
126             }
127              
128             sub alter {
129 3     3 1 504 my ($self, $hr_params) = @_;
130 3         538 require Ref::Util;
131 3 100       1749 if (!Ref::Util::is_hashref($hr_params)) {
132 1         534 require Geoffrey::Exception::General;
133 1         6 Geoffrey::Exception::General::throw_wrong_ref(__PACKAGE__ . '::alter', 'hash');
134             }
135 2         10 return $self->_collective_do('alter', delete $hr_params->{table}, $hr_params->{constraints});
136             }
137              
138             sub drop {
139 2     2 1 2630 my ($self, $s_table_name, $hr_params) = @_;
140 2 100       9 if (!$s_table_name) {
141 1         643 require Geoffrey::Exception::RequiredValue;
142 1         5 Geoffrey::Exception::RequiredValue::throw_reftable_missing();
143             }
144 1         5 return $self->_collective_do('drop', $s_table_name, $hr_params->{constraints});
145             }
146              
147             sub create_table_column {
148 80     80 1 159 my ($self, $s_table_name, $hr_column_params, $ar_constraint_params) = @_;
149 80 100 100     259 if ($hr_column_params->{primarykey} && $hr_column_params->{primarykey} != 1) {
150 1         4 return push @{$ar_constraint_params},
151 1         3 $self->_obj_primarykey->add($s_table_name, $hr_column_params->{primarykey});
152             }
153 79         336 push @{$ar_constraint_params},
154             $self->_uniques_to_add({
155             unique => $hr_column_params->{unique},
156             table => $s_table_name,
157             column => $hr_column_params->{name},
158 79         116 });
159              
160 79         221 my $o_foreign_key = $self->_obj_foreignkey;
161 79 100       191 if ($hr_column_params->{foreignkey}) {
162 17         39 $hr_column_params->{foreignkey}->{column} = $hr_column_params->{name};
163 17         37 $hr_column_params->{foreignkey}->{table} = $s_table_name;
164             $hr_column_params->{foreignkey}->{schema} = $hr_column_params->{schema}
165 17 50       39 if $hr_column_params->{schema};
166 17         52 push @{$ar_constraint_params},
167 17         32 $o_foreign_key->for_table(1)->add($hr_column_params->{foreignkey});
168             }
169              
170 79         185 my $consts = $self->converter->constraints;
171 79 100       196 my $not_null = ($hr_column_params->{notnull}) ? $consts->{not_null} : q~~;
172 79 100       185 my $primarykey = (defined $hr_column_params->{primarykey}) ? $consts->{primary_key} : q~~;
173 79         216 $o_foreign_key->for_table(0);
174 79         298 return qq~$not_null $primarykey~;
175             }
176              
177             sub _uniques_to_add {
178 79     79   153 my ($self, $hr_unique_params) = @_;
179 79 100       197 return () if !$hr_unique_params->{unique};
180 1         5 require Ref::Util;
181             my $hr_to_add
182             = Ref::Util::is_hashref($hr_unique_params->{unique})
183             ? $hr_unique_params->{unique}
184 1 50       6 : {columns => [$hr_unique_params->{column}]};
185 1         3 return $self->_obj_unique->add($hr_unique_params->{table}, $hr_to_add);
186             }
187              
188             1;
189              
190             __END__