| ... | ... |
@@ -249,9 +249,10 @@ sub fetch {
|
| 249 | 249 |
|
| 250 | 250 |
# Filter |
| 251 | 251 |
if ($fetch_filter) {
|
| 252 |
- my $keys = $sth->{NAME_lc};
|
|
| 252 |
+ my $keys = $sth->{NAME_lc};
|
|
| 253 |
+ my $types = $sth->{TYPE};
|
|
| 253 | 254 |
for (my $i = 0; $i < @$keys; $i++) {
|
| 254 |
- $row->[$i] = $fetch_filter->($keys->[$i], $row->[$i]); |
|
| 255 |
+ $row->[$i] = $fetch_filter->($keys->[$i], $row->[$i], $types->[$i], $sth, $i); |
|
| 255 | 256 |
} |
| 256 | 257 |
} |
| 257 | 258 |
return wantarray ? @$row : $row; |
| ... | ... |
@@ -264,20 +265,52 @@ sub fetch_hash {
|
| 264 | 265 |
my $fetch_filter = $self->fetch_filter; |
| 265 | 266 |
|
| 266 | 267 |
# Fetch |
| 267 |
- my $row = $sth->fetchrow_hashref; |
|
| 268 |
+ my $row = $sth->fetchrow_arrayref; |
|
| 268 | 269 |
|
| 269 | 270 |
# Cannot fetch |
| 270 | 271 |
return unless $row; |
| 271 | 272 |
|
| 273 |
+ # Keys |
|
| 274 |
+ my $keys = $sth->{NAME_lc};
|
|
| 275 |
+ |
|
| 272 | 276 |
# Filter |
| 277 |
+ my $row_hash = {};
|
|
| 273 | 278 |
if ($fetch_filter) {
|
| 274 |
- foreach my $key (keys %$row) {
|
|
| 275 |
- $row->{$key} = $fetch_filter->($key, $row->{$key});
|
|
| 279 |
+ my $types = $sth->{TYPE};
|
|
| 280 |
+ for (my $i = 0; $i < @$keys; $i++) {
|
|
| 281 |
+ $row_hash->{$keys->[$i]} = $fetch_filter->($keys->[$i], $row->[$i], $types->[$i], $sth, $i);
|
|
| 276 | 282 |
} |
| 277 | 283 |
} |
| 278 |
- return wantarray ? %$row : $row; |
|
| 284 |
+ else {
|
|
| 285 |
+ for (my $i = 0; $i < @$keys; $i++) {
|
|
| 286 |
+ $row_hash->{$keys->[$i]} = $row->[$i];
|
|
| 287 |
+ } |
|
| 288 |
+ } |
|
| 289 |
+ return wantarray ? %$row_hash : $row_hash; |
|
| 279 | 290 |
} |
| 280 | 291 |
|
| 292 |
+# Fetch (hash) |
|
| 293 |
+#sub fetch_hash {
|
|
| 294 |
+# my $self = shift; |
|
| 295 |
+# my $sth = $self->sth; |
|
| 296 |
+# my $fetch_filter = $self->fetch_filter; |
|
| 297 |
+# |
|
| 298 |
+# # Fetch |
|
| 299 |
+# my $row = $sth->fetchrow_hashref; |
|
| 300 |
+# |
|
| 301 |
+# # Cannot fetch |
|
| 302 |
+# return unless $row; |
|
| 303 |
+# |
|
| 304 |
+# # Filter |
|
| 305 |
+# if ($fetch_filter) {
|
|
| 306 |
+# foreach my $key (keys %$row) {
|
|
| 307 |
+# $row->{$key} = $fetch_filter->($key, $row->{$key});
|
|
| 308 |
+# } |
|
| 309 |
+# } |
|
| 310 |
+# return wantarray ? %$row : $row; |
|
| 311 |
+#} |
|
| 312 |
+ |
|
| 313 |
+ |
|
| 281 | 314 |
# Fetch all (array) |
| 282 | 315 |
sub fetch_all {
|
| 283 | 316 |
my $self = shift; |
| ... | ... |
@@ -1,7 +1,7 @@ |
| 1 | 1 |
use Test::More; |
| 2 | 2 |
use strict; |
| 3 | 3 |
use warnings; |
| 4 |
-use DBI; |
|
| 4 |
+use DBI qw/:sql_types/; |
|
| 5 | 5 |
|
| 6 | 6 |
BEGIN {
|
| 7 | 7 |
eval { require DBD::SQLite; 1 }
|
| ... | ... |
@@ -139,8 +139,8 @@ $t->new->create_table1->insert({k1 => 1, k2 => 2}, {k1 => 3, k2 => 4})->test(sub
|
| 139 | 139 |
|
| 140 | 140 |
#--------------------------------------------------------------------- |
| 141 | 141 |
$dbi->fetch_filter(sub {
|
| 142 |
- my ($key, $value) = @_; |
|
| 143 |
- if ($key eq 'k1' && $value == 1 ) {
|
|
| 142 |
+ my ($key, $value, $type, $sth, $i) = @_; |
|
| 143 |
+ if ($key eq 'k1' && $value == 1 && $type =~ /char/i && $i == 0 && $sth->{TYPE}->[$i] eq $type) {
|
|
| 144 | 144 |
return $value * 3; |
| 145 | 145 |
} |
| 146 | 146 |
return $value; |