- fixed bug DBIx::Custom::Result fetch_hash_multi...
...throw warnings
... | ... |
@@ -1,3 +1,8 @@ |
1 |
+0.1747 |
|
2 |
+ - fixed bug DBIx::Custom::Result fetch_hash_multi throw warnings |
|
3 |
+ which cannnot fetch any more |
|
4 |
+ - fixed bug DBIx::Custom::Result fetch_hash_multi throw warnings |
|
5 |
+ which cannnot fetch any more |
|
1 | 6 |
0.1746 |
2 | 7 |
- micro optimization |
3 | 8 |
0.1745 |
... | ... |
@@ -1,7 +1,7 @@ |
1 | 1 |
package DBIx::Custom; |
2 | 2 |
use Object::Simple -base; |
3 | 3 |
|
4 |
-our $VERSION = '0.1745'; |
|
4 |
+our $VERSION = '0.1747'; |
|
5 | 5 |
use 5.008001; |
6 | 6 |
|
7 | 7 |
use Carp 'croak'; |
... | ... |
@@ -3401,6 +3401,15 @@ executed SQL and bind values are printed to STDERR. |
3401 | 3401 |
|
3402 | 3402 |
DEBUG output encoding. Default to UTF-8. |
3403 | 3403 |
|
3404 |
+=head2 C<DBIX_CUSTOM_TAG_PARSE> |
|
3405 |
+ |
|
3406 |
+If you set DBIX_CUSTOM_TAG_PARSE to 0, tag parsing is off. |
|
3407 |
+ |
|
3408 |
+=head2 C<DBIX_CUSTOM_DISABLE_MODEL_EXECUTE> |
|
3409 |
+ |
|
3410 |
+If you set DBIX_CUSTOM_DISABLE_MODEL_EXECUTE to 1, |
|
3411 |
+L<DBIx::Custom::Model> execute method call L<DBIx::Custom> execute. |
|
3412 |
+ |
|
3404 | 3413 |
=head1 DEPRECATED FUNCTIONALITY |
3405 | 3414 |
|
3406 | 3415 |
L<DBIx::Custom> |
... | ... |
@@ -39,24 +39,6 @@ sub filter { |
39 | 39 |
return $self->{filter} ||= {}; |
40 | 40 |
} |
41 | 41 |
|
42 |
-sub _cache { |
|
43 |
- my $self = shift; |
|
44 |
- $self->{_type_map} = {}; |
|
45 |
- $self->{_pos} = {}; |
|
46 |
- $self->{_columns} = {}; |
|
47 |
- for (my $i = 0; $i < @{$self->{sth}->{NAME}}; $i++) { |
|
48 |
- my $type = lc $self->{sth}{TYPE}[$i]; |
|
49 |
- my $name = $self->{sth}{NAME}[$i]; |
|
50 |
- $self->{_type_map}{$type} ||= []; |
|
51 |
- push @{$self->{_type_map}{$type}}, $name; |
|
52 |
- $self->{_pos}{$name} ||= []; |
|
53 |
- push @{$self->{_pos}{$name}}, $i; |
|
54 |
- $self->{_columns}{$name} = 1; |
|
55 |
- } |
|
56 |
- $self->{_cache} = 1; |
|
57 |
-} |
|
58 |
- |
|
59 |
-=pod |
|
60 | 42 |
sub fetch { |
61 | 43 |
my $self = shift; |
62 | 44 |
|
... | ... |
@@ -68,41 +50,48 @@ sub fetch { |
68 | 50 |
return unless @row; |
69 | 51 |
|
70 | 52 |
# Type rule |
71 |
- if ((my $from = $self->type_rule->{from1}) && !$self->{type_rule_off} && !$self->{type_rule1_off}) { |
|
53 |
+ if ($self->{type_rule}->{from1} && !$self->{type_rule_off} && !$self->{type_rule1_off}) { |
|
54 |
+ my $from = $self->{type_rule}->{from1}; |
|
72 | 55 |
for my $type (keys %$from) { |
73 | 56 |
for my $column (@{$self->{_type_map}->{$type}}) { |
74 | 57 |
$row[$_] = $from->{$type}->($row[$_]) |
75 |
- for @{$self->{_pos}{$column}}; |
|
58 |
+ for @{$self->{_pos}{$column} || []}; |
|
76 | 59 |
} |
77 | 60 |
} |
78 | 61 |
} |
79 |
- if ((my $from = $self->type_rule->{from2}) && !$self->{type_rule_off} && !$self->{type_rule2_off}) { |
|
62 |
+ if ($self->{type_rule}->{from2} && !$self->{type_rule_off} && !$self->{type_rule2_off}) { |
|
63 |
+ my $from = $self->{type_rule}->{from2}; |
|
80 | 64 |
for my $type (keys %$from) { |
81 | 65 |
for my $column (@{$self->{_type_map}->{$type}}) { |
82 | 66 |
$row[$_] = $from->{$type}->($row[$_]) |
83 |
- for @{$self->{_pos}{$column}}; |
|
67 |
+ for @{$self->{_pos}{$column} || []}; |
|
84 | 68 |
} |
85 | 69 |
} |
86 | 70 |
} |
87 | 71 |
|
88 | 72 |
# Filter |
89 | 73 |
if (($self->{filter} || $self->{default_filter}) && !$self->{filter_off}) { |
90 |
- for my $column (keys %{$self->{filter}}) { |
|
91 |
- $row[$_] = ($self->{filter}->{$column} || $self->{default_filter} || sub { shift }) |
|
92 |
- ->($row[$_]) |
|
93 |
- for @{$self->{_pos}{$column}}; |
|
94 |
- } |
|
74 |
+ my @columns = $self->{default_filter} ? keys %{$self->{_columns}} |
|
75 |
+ : keys %{$self->{filter}}; |
|
76 |
+ |
|
77 |
+ for my $column (@columns) { |
|
78 |
+ my $filter = exists $self->{filter}->{$column} ? $self->{filter}->{$column} |
|
79 |
+ : $self->{default_filter}; |
|
80 |
+ next unless $filter; |
|
81 |
+ $row[$_] = $filter->($row[$_]) |
|
82 |
+ for @{$self->{_pos}{$column} || []}; |
|
83 |
+ } |
|
95 | 84 |
} |
96 | 85 |
if ($self->{end_filter} && !$self->{filter_off}) { |
97 | 86 |
for my $column (keys %{$self->{end_filter}}) { |
87 |
+ next unless $self->{end_filter}->{$column}; |
|
98 | 88 |
$row[$_] = $self->{end_filter}->{$column}->($row[$_]) |
99 |
- for @{$self->{_pos}{$column}}; |
|
89 |
+ for @{$self->{_pos}{$column} || []}; |
|
100 | 90 |
} |
101 | 91 |
} |
102 | 92 |
|
103 | 93 |
return \@row; |
104 | 94 |
} |
105 |
-=cut |
|
106 | 95 |
|
107 | 96 |
sub fetch_hash { |
108 | 97 |
my $self = shift; |
... | ... |
@@ -154,48 +143,6 @@ sub fetch_hash { |
154 | 143 |
$row; |
155 | 144 |
} |
156 | 145 |
|
157 |
-sub fetch { |
|
158 |
- my $self = shift; |
|
159 |
- |
|
160 |
- # Info |
|
161 |
- my $columns = $self->{sth}->{NAME}; |
|
162 |
- my $types = $self->{sth}->{TYPE}; |
|
163 |
- |
|
164 |
- # Fetch |
|
165 |
- my @row = $self->{sth}->fetchrow_array; |
|
166 |
- return unless @row; |
|
167 |
- |
|
168 |
- # Filtering |
|
169 |
- my $type_rule1 = $self->type_rule->{from1} || {}; |
|
170 |
- my $type_rule2 = $self->type_rule->{from2} || {}; |
|
171 |
- my $filter = $self->filter; |
|
172 |
- my $end_filter = $self->{end_filter} || {}; |
|
173 |
- for (my $i = 0; $i < @$columns; $i++) { |
|
174 |
- |
|
175 |
- # Column |
|
176 |
- my $column = $columns->[$i]; |
|
177 |
- |
|
178 |
- # Type rule |
|
179 |
- my $type_filter1 = $type_rule1->{lc($types->[$i])}; |
|
180 |
- $row[$i] = $type_filter1->($row[$i]) |
|
181 |
- if $type_filter1 && !$self->{type_rule_off} |
|
182 |
- && !$self->{type_rule1_off}; |
|
183 |
- my $type_filter2 = $type_rule2->{lc($types->[$i])}; |
|
184 |
- $row[$i] = $type_filter2->($row[$i]) |
|
185 |
- if $type_filter2 && !$self->{type_rule_off} |
|
186 |
- && !$self->{type_rule2_off}; |
|
187 |
- |
|
188 |
- # Filter |
|
189 |
- my $filter = $filter->{$column} || $self->{default_filter}; |
|
190 |
- $row[$i] = $filter->($row[$i]) |
|
191 |
- if $filter && !$self->{filter_off}; |
|
192 |
- $row[$i] = $end_filter->{$column}->($row[$i]) |
|
193 |
- if $end_filter->{$column} && !$self->{filter_off}; |
|
194 |
- } |
|
195 |
- |
|
196 |
- return \@row; |
|
197 |
-} |
|
198 |
- |
|
199 | 146 |
sub fetch_all { |
200 | 147 |
my $self = shift; |
201 | 148 |
|
... | ... |
@@ -248,10 +195,16 @@ sub fetch_hash_multi { |
248 | 195 |
# Fetch multiple rows |
249 | 196 |
croak 'Row count must be specified ' . _subname |
250 | 197 |
unless $count; |
198 |
+ |
|
199 |
+ return if $self->{_finished}; |
|
200 |
+ |
|
251 | 201 |
my $rows = []; |
252 | 202 |
for (my $i = 0; $i < $count; $i++) { |
253 | 203 |
my $row = $self->fetch_hash; |
254 |
- last unless $row; |
|
204 |
+ unless ($row) { |
|
205 |
+ $self->{_finished} = 1; |
|
206 |
+ last; |
|
207 |
+ } |
|
255 | 208 |
push @$rows, $row; |
256 | 209 |
} |
257 | 210 |
|
... | ... |
@@ -266,11 +219,16 @@ sub fetch_multi { |
266 | 219 |
croak 'Row count must be specified ' . _subname |
267 | 220 |
unless $count; |
268 | 221 |
|
222 |
+ return if $self->{_finished}; |
|
223 |
+ |
|
269 | 224 |
# Fetch multi rows |
270 | 225 |
my $rows = []; |
271 | 226 |
for (my $i = 0; $i < $count; $i++) { |
272 | 227 |
my $row = $self->fetch; |
273 |
- last unless $row; |
|
228 |
+ unless ($row) { |
|
229 |
+ $self->{_finished} = 1; |
|
230 |
+ last; |
|
231 |
+ } |
|
274 | 232 |
push @$rows, $row; |
275 | 233 |
} |
276 | 234 |
|
... | ... |
@@ -347,6 +305,23 @@ sub type_rule2_on { |
347 | 305 |
return $self; |
348 | 306 |
} |
349 | 307 |
|
308 |
+sub _cache { |
|
309 |
+ my $self = shift; |
|
310 |
+ $self->{_type_map} = {}; |
|
311 |
+ $self->{_pos} = {}; |
|
312 |
+ $self->{_columns} = {}; |
|
313 |
+ for (my $i = 0; $i < @{$self->{sth}->{NAME}}; $i++) { |
|
314 |
+ my $type = lc $self->{sth}{TYPE}[$i]; |
|
315 |
+ my $name = $self->{sth}{NAME}[$i]; |
|
316 |
+ $self->{_type_map}{$type} ||= []; |
|
317 |
+ push @{$self->{_type_map}{$type}}, $name; |
|
318 |
+ $self->{_pos}{$name} ||= []; |
|
319 |
+ push @{$self->{_pos}{$name}}, $i; |
|
320 |
+ $self->{_columns}{$name} = 1; |
|
321 |
+ } |
|
322 |
+ $self->{_cache} = 1; |
|
323 |
+} |
|
324 |
+ |
|
350 | 325 |
# DEPRECATED! |
351 | 326 |
sub filter_off { |
352 | 327 |
warn "filter_off method is DEPRECATED!"; |
... | ... |
@@ -1113,6 +1113,15 @@ $result->filter({$key1 => 'three_times'}); |
1113 | 1113 |
$row = $result->one; |
1114 | 1114 |
is_deeply($row, {$key1 => 3, $key2 => 4}, "default_fetch_filter and filter"); |
1115 | 1115 |
|
1116 |
+$dbi->default_fetch_filter('twice'); |
|
1117 |
+eval { $dbi->execute("drop table $table1") }; |
|
1118 |
+$dbi->execute($create_table1); |
|
1119 |
+$dbi->insert({$key1 => 1, $key2 => 2}, table => $table1); |
|
1120 |
+$result = $dbi->select(column => [$key1, $key1, $key2], table => $table1); |
|
1121 |
+$result->filter({$key1 => 'three_times'}); |
|
1122 |
+$row = $result->fetch_first; |
|
1123 |
+is_deeply($row, [3, 3, 4], "default_fetch_filter and filter"); |
|
1124 |
+ |
|
1116 | 1125 |
test 'filters'; |
1117 | 1126 |
$dbi = DBIx::Custom->new; |
1118 | 1127 |
|
... | ... |
@@ -1449,6 +1458,16 @@ $result->end_filter($key1 => sub { $_[0] * 3 }, $key2 => sub { $_[0] * 5 }); |
1449 | 1458 |
$row = $result->fetch_first; |
1450 | 1459 |
is_deeply($row, [6, 40]); |
1451 | 1460 |
|
1461 |
+$dbi = DBIx::Custom->connect; |
|
1462 |
+eval { $dbi->execute("drop table $table1") }; |
|
1463 |
+$dbi->execute($create_table1); |
|
1464 |
+$dbi->insert({$key1 => 1, $key2 => 2}, table => $table1); |
|
1465 |
+$result = $dbi->select(column => [$key1, $key1, $key2], table => $table1); |
|
1466 |
+$result->filter($key1 => sub { $_[0] * 2 }, $key2 => sub { $_[0] * 4 }); |
|
1467 |
+$result->end_filter($key1 => sub { $_[0] * 3 }, $key2 => sub { $_[0] * 5 }); |
|
1468 |
+$row = $result->fetch_first; |
|
1469 |
+is_deeply($row, [6, 6, 40]); |
|
1470 |
+ |
|
1452 | 1471 |
$dbi = DBIx::Custom->connect; |
1453 | 1472 |
eval { $dbi->execute("drop table $table1") }; |
1454 | 1473 |
$dbi->execute($create_table1); |
... | ... |
@@ -1498,6 +1517,13 @@ $result->end_filter($key1 => undef); |
1498 | 1517 |
$row = $result->one; |
1499 | 1518 |
is_deeply($row, {$key1 => 1, $key2 => 40}, 'apply_filter overwrite'); |
1500 | 1519 |
|
1520 |
+$result = $dbi->select(column => [$key1, $key1, $key2], table => $table1); |
|
1521 |
+$result->filter($key1 => sub { $_[0] * 2 }, $key2 => sub { $_[0] * 4 }); |
|
1522 |
+$result->filter($key1 => undef); |
|
1523 |
+$result->end_filter($key1 => undef); |
|
1524 |
+$row = $result->fetch; |
|
1525 |
+is_deeply($row, [1, 1, 40], 'apply_filter overwrite'); |
|
1526 |
+ |
|
1501 | 1527 |
test 'remove_end_filter and remove_filter'; |
1502 | 1528 |
$dbi = DBIx::Custom->connect; |
1503 | 1529 |
eval { $dbi->execute("drop table $table1") }; |
... | ... |
@@ -3279,16 +3305,49 @@ is_deeply($rows, [{$key1 => 1, $key2 => 2}, {$key1 => 3, $key2 => 4}]); |
3279 | 3305 |
$result = $dbi->select(table => $table1); |
3280 | 3306 |
$result->dbi->filters({three_times => sub { $_[0] * 3}}); |
3281 | 3307 |
$result->filter({$key1 => 'three_times'}); |
3282 |
- |
|
3283 | 3308 |
$rows = $result->fetch_all; |
3284 | 3309 |
is_deeply($rows, [[3, 2], [9, 4]], "array"); |
3285 | 3310 |
|
3311 |
+$result = $dbi->select(column => [$key1, $key1, $key2], table => $table1); |
|
3312 |
+$result->dbi->filters({three_times => sub { $_[0] * 3}}); |
|
3313 |
+$result->filter({$key1 => 'three_times'}); |
|
3314 |
+$rows = $result->fetch_all; |
|
3315 |
+is_deeply($rows, [[3, 3, 2], [9, 9, 4]], "array"); |
|
3316 |
+ |
|
3286 | 3317 |
$result = $dbi->select(table => $table1); |
3287 | 3318 |
$result->dbi->filters({three_times => sub { $_[0] * 3}}); |
3288 | 3319 |
$result->filter({$key1 => 'three_times'}); |
3289 | 3320 |
$rows = $result->fetch_hash_all; |
3290 | 3321 |
is_deeply($rows, [{$key1 => 3, $key2 => 2}, {$key1 => 9, $key2 => 4}], "hash"); |
3291 | 3322 |
|
3323 |
+test 'DBIx::Custom::Result fetch_multi'; |
|
3324 |
+eval { $dbi->execute("drop table $table1") }; |
|
3325 |
+$dbi->execute($create_table1); |
|
3326 |
+$dbi->insert({$key1 => 1, $key2 => 2}, table => $table1); |
|
3327 |
+$dbi->insert({$key1 => 3, $key2 => 4}, table => $table1); |
|
3328 |
+$dbi->insert({$key1 => 5, $key2 => 6}, table => $table1); |
|
3329 |
+$result = $dbi->select(table => $table1); |
|
3330 |
+$rows = $result->fetch_multi(2); |
|
3331 |
+is_deeply($rows, [[1, 2], [3, 4]]); |
|
3332 |
+$rows = $result->fetch_multi(2); |
|
3333 |
+is_deeply($rows, [[5, 6]]); |
|
3334 |
+$rows = $result->fetch_multi(2); |
|
3335 |
+ok(!$rows); |
|
3336 |
+ |
|
3337 |
+test 'DBIx::Custom::Result fetch_hash_multi'; |
|
3338 |
+eval { $dbi->execute("drop table $table1") }; |
|
3339 |
+$dbi->execute($create_table1); |
|
3340 |
+$dbi->insert({$key1 => 1, $key2 => 2}, table => $table1); |
|
3341 |
+$dbi->insert({$key1 => 3, $key2 => 4}, table => $table1); |
|
3342 |
+$dbi->insert({$key1 => 5, $key2 => 6}, table => $table1); |
|
3343 |
+$result = $dbi->select(table => $table1); |
|
3344 |
+$rows = $result->fetch_hash_multi(2); |
|
3345 |
+is_deeply($rows, [{$key1 => 1, $key2 => 2}, {$key1 => 3, $key2 => 4}]); |
|
3346 |
+$rows = $result->fetch_hash_multi(2); |
|
3347 |
+is_deeply($rows, [{$key1 => 5, $key2 => 6}]); |
|
3348 |
+$rows = $result->fetch_hash_multi(2); |
|
3349 |
+ok(!$rows); |
|
3350 |
+ |
|
3292 | 3351 |
test "query_builder"; |
3293 | 3352 |
$datas = [ |
3294 | 3353 |
# Basic tests |
... | ... |
@@ -3905,6 +3964,10 @@ $dbi->type_rule( |
3905 | 3964 |
$dbi->insert({$key1 => '2010-02-02'}, table => $table1); |
3906 | 3965 |
$result = $dbi->select(table => $table1); |
3907 | 3966 |
like($result->fetch->[0], qr/^2010-03-03/); |
3967 |
+$result = $dbi->select(column => [$key1, $key1], table => $table1); |
|
3968 |
+$row = $result->fetch; |
|
3969 |
+like($row->[0], qr/^2010-03-03/); |
|
3970 |
+like($row->[1], qr/^2010-03-03/); |
|
3908 | 3971 |
|
3909 | 3972 |
test 'type_rule and filter order'; |
3910 | 3973 |
$dbi = DBIx::Custom->connect; |