... | ... |
@@ -235,53 +235,69 @@ use Object::Simple; |
235 | 235 |
sub sth : Attr {} |
236 | 236 |
sub fetch_filter : Attr {} |
237 | 237 |
|
238 |
+# Fetch (array) |
|
238 | 239 |
sub fetch { |
239 | 240 |
my ($self, $type) = @_; |
240 | 241 |
my $sth = $self->sth; |
241 |
- $type ||= 'array'; |
|
242 |
- |
|
243 | 242 |
my $fetch_filter = $self->fetch_filter; |
244 |
- if ($type eq 'hash') { |
|
245 |
- my $hash = $sth->fetchrow_hashref; |
|
246 |
- return unless $hash; |
|
247 |
- if ($fetch_filter) { |
|
248 |
- foreach my $key (keys %$hash) { |
|
249 |
- $hash->{$key} = $fetch_filter->($key, $hash->{$key}); |
|
250 |
- } |
|
243 |
+ |
|
244 |
+ # Fetch |
|
245 |
+ my $row = $sth->fetchrow_arrayref; |
|
246 |
+ |
|
247 |
+ # Cannot fetch |
|
248 |
+ return unless $row; |
|
249 |
+ |
|
250 |
+ # Filter |
|
251 |
+ if ($fetch_filter) { |
|
252 |
+ my $keys = $sth->{NAME_lc}; |
|
253 |
+ for (my $i = 0; $i < @$keys; $i++) { |
|
254 |
+ $row->[$i] = $fetch_filter->($keys->[$i], $row->[$i]); |
|
251 | 255 |
} |
252 |
- return wantarray ? %$hash : $hash; |
|
253 | 256 |
} |
254 |
- else { |
|
255 |
- my $array = $sth->fetchrow_arrayref; |
|
256 |
- return unless $array; |
|
257 |
- if ($fetch_filter) { |
|
258 |
- my $keys = $sth->{NAME_lc}; |
|
259 |
- for (my $i = 0; $i < @$keys; $i++) { |
|
260 |
- $array->[$i] = $fetch_filter->($keys->[$i], $array->[$i]); |
|
261 |
- } |
|
257 |
+ return wantarray ? @$row : $row; |
|
258 |
+} |
|
259 |
+ |
|
260 |
+# Fetch (hash) |
|
261 |
+sub fetch_hash { |
|
262 |
+ my $self = shift; |
|
263 |
+ my $sth = $self->sth; |
|
264 |
+ my $fetch_filter = $self->fetch_filter; |
|
265 |
+ |
|
266 |
+ # Fetch |
|
267 |
+ my $row = $sth->fetchrow_hashref; |
|
268 |
+ |
|
269 |
+ # Cannot fetch |
|
270 |
+ return unless $row; |
|
271 |
+ |
|
272 |
+ # Filter |
|
273 |
+ if ($fetch_filter) { |
|
274 |
+ foreach my $key (keys %$row) { |
|
275 |
+ $row->{$key} = $fetch_filter->($key, $row->{$key}); |
|
262 | 276 |
} |
263 |
- return wantarray ? @$array : $array; |
|
264 | 277 |
} |
278 |
+ return wantarray ? %$row : $row; |
|
265 | 279 |
} |
266 | 280 |
|
281 |
+# Fetch all (array) |
|
267 | 282 |
sub fetch_all { |
268 |
- my ($self, $type) = @_; |
|
269 |
- $type ||= 'array'; |
|
283 |
+ my $self = shift; |
|
270 | 284 |
|
271 |
- if ($type eq 'hash') { |
|
272 |
- my $array_of_hash = []; |
|
273 |
- while(my %hash = $self->fetch('hash')) { |
|
274 |
- push @$array_of_hash, {%hash}; |
|
275 |
- } |
|
276 |
- return wantarray ? @$array_of_hash : $array_of_hash; |
|
285 |
+ my $rows = []; |
|
286 |
+ while(my %row = $self->fetch) { |
|
287 |
+ push @$rows, {%row}; |
|
277 | 288 |
} |
278 |
- else { |
|
279 |
- my $array_of_array = []; |
|
280 |
- while(my %array = $self->fetch('hash')) { |
|
281 |
- push @$array_of_array, {%array}; |
|
282 |
- } |
|
283 |
- return wantarray ? @$array_of_array : $array_of_array; |
|
289 |
+ return wantarray ? @$rows : $rows; |
|
290 |
+} |
|
291 |
+ |
|
292 |
+# Fetch all (hash) |
|
293 |
+sub fetch_all_hash { |
|
294 |
+ my $self = shift; |
|
295 |
+ |
|
296 |
+ my $rows = []; |
|
297 |
+ while(my %row = $self->fetch_hash) { |
|
298 |
+ push @$rows, {%row}; |
|
284 | 299 |
} |
300 |
+ return wantarray ? @$rows : $rows; |
|
285 | 301 |
} |
286 | 302 |
|
287 | 303 |
sub err { shift->sth->err } |
... | ... |
@@ -65,6 +65,31 @@ my $t = Test::DBI::Custom->new; |
65 | 65 |
$t->new->create_table1->insert({k1 => 1, k2 => 2}, {k1 => 3, k2 => 4})->test(sub { |
66 | 66 |
my $dbi = shift; |
67 | 67 |
|
68 |
+ my $r; # resultset |
|
69 |
+ my @rows; |
|
70 |
+ |
|
71 |
+ # Simple query array |
|
72 |
+ $r = $dbi->query("select k1, k2 from t1"); |
|
73 |
+ |
|
74 |
+ @rows = (); |
|
75 |
+ while (my $row = $r->fetch) { |
|
76 |
+ push @rows, [@$row]; |
|
77 |
+ } |
|
78 |
+ is_deeply(\@rows, [[1, 2], [3, 4]], 'Simple query array'); |
|
79 |
+ |
|
80 |
+ # Simple query hash |
|
81 |
+ $r = $dbi->query("select k1, k2 from t1;"); |
|
82 |
+ |
|
83 |
+ @rows = (); |
|
84 |
+ while (my $row = $r->fetch_hash) { |
|
85 |
+ push @rows, {%$row}; |
|
86 |
+ } |
|
87 |
+ is_deeply(\@rows, [{k1 => 1, k2 => 2}, {k1 => 3, k2 => 4}], 'Simple query array'); |
|
88 |
+ |
|
89 |
+ |
|
90 |
+ |
|
91 |
+ |
|
92 |
+ |
|
68 | 93 |
$dbi->fetch_filter(sub { |
69 | 94 |
my ($key, $value) = @_; |
70 | 95 |
if ($key eq 'k1' && $value == 1 ) { |
... | ... |
@@ -73,11 +98,11 @@ $t->new->create_table1->insert({k1 => 1, k2 => 2}, {k1 => 3, k2 => 4})->test(sub |
73 | 98 |
return $value; |
74 | 99 |
}); |
75 | 100 |
|
76 |
- my $result = $dbi->query("select k1, k2 from t1"); |
|
101 |
+ $r = $dbi->query("select k1, k2 from t1"); |
|
77 | 102 |
|
78 |
- my $row = $result->fetch; |
|
103 |
+ my $row = $r->fetch; |
|
79 | 104 |
my @values = @$row; |
80 |
- $result->finish; |
|
105 |
+ $r->finish; |
|
81 | 106 |
|
82 | 107 |
is_deeply(\@values, [3, 2]); |
83 | 108 |
}); |