... | ... |
@@ -384,7 +384,7 @@ sub execute { |
384 | 384 |
} |
385 | 385 |
|
386 | 386 |
# Type rule |
387 |
- my $applied_filter = {}; |
|
387 |
+ my $type_filter = {}; |
|
388 | 388 |
unless ($type_rule_off) { |
389 | 389 |
foreach my $name (keys %$param) { |
390 | 390 |
my $table; |
... | ... |
@@ -399,13 +399,14 @@ sub execute { |
399 | 399 |
if (defined $table && $into->{$table} && |
400 | 400 |
(my $rule = $into->{$table}->{$column})) |
401 | 401 |
{ |
402 |
- $applied_filter->{$column} = $rule; |
|
403 |
- $applied_filter->{"$table.$column"} = $rule; |
|
402 |
+ $type_filter->{$column} = $rule; |
|
403 |
+ $type_filter->{"$table.$column"} = $rule; |
|
404 | 404 |
} |
405 | 405 |
} |
406 | 406 |
} |
407 | 407 |
|
408 | 408 |
# Applied filter |
409 |
+ my $applied_filter = {}; |
|
409 | 410 |
foreach my $table (@$tables) { |
410 | 411 |
$applied_filter = { |
411 | 412 |
%$applied_filter, |
... | ... |
@@ -432,6 +433,7 @@ sub execute { |
432 | 433 |
$param, |
433 | 434 |
$query->columns, |
434 | 435 |
$filter, |
436 |
+ $type_filter, |
|
435 | 437 |
$type |
436 | 438 |
); |
437 | 439 |
|
... | ... |
@@ -1171,7 +1173,7 @@ sub _apply_filter { |
1171 | 1173 |
} |
1172 | 1174 |
|
1173 | 1175 |
sub _create_bind_values { |
1174 |
- my ($self, $params, $columns, $filter, $type) = @_; |
|
1176 |
+ my ($self, $params, $columns, $filter, $type_filter, $type) = @_; |
|
1175 | 1177 |
|
1176 | 1178 |
# Create bind values |
1177 | 1179 |
my $bind = []; |
... | ... |
@@ -1201,12 +1203,14 @@ sub _create_bind_values { |
1201 | 1203 |
|
1202 | 1204 |
# Filter |
1203 | 1205 |
my $f = $filter->{$column} || $self->{default_out_filter} || ''; |
1206 |
+ $value = $f->($value) if $f; |
|
1207 |
+ |
|
1208 |
+ # Type rule |
|
1209 |
+ my $tf = $type_filter->{$column}; |
|
1210 |
+ $value = $tf->($value) if $tf; |
|
1204 | 1211 |
|
1205 |
- # Type |
|
1206 |
- push @$bind, { |
|
1207 |
- value => $f ? $f->($value) : $value, |
|
1208 |
- type => $type->{$column} |
|
1209 |
- }; |
|
1212 |
+ # Bind values |
|
1213 |
+ push @$bind, {value => $value, type => $type->{$column}}; |
|
1210 | 1214 |
|
1211 | 1215 |
# Count up |
1212 | 1216 |
$count->{$column}++; |
... | ... |
@@ -2051,11 +2055,10 @@ The following opitons are available. |
2051 | 2055 |
[qw/title author/] => sub { uc $_[0] } |
2052 | 2056 |
] |
2053 | 2057 |
|
2054 |
-Filter, executed before data is saved into database. |
|
2055 |
-Filter value is code reference or |
|
2056 |
-filter name registerd by C<register_filter()>. |
|
2057 |
- |
|
2058 |
-These filters are added to the C<out> filters, set by C<apply_filter()>. |
|
2058 |
+Filter. You can set subroutine or filter name |
|
2059 |
+registered by by C<register_filter()>. |
|
2060 |
+This filter is executed before data is saved into database. |
|
2061 |
+and before type rule filter is executed. |
|
2059 | 2062 |
|
2060 | 2063 |
=item C<query> |
2061 | 2064 |
|
... | ... |
@@ -2389,8 +2392,8 @@ Register filters, used by C<filter> option of many methods. |
2389 | 2392 |
|
2390 | 2393 |
$dbi->type_rule( |
2391 | 2394 |
into => { |
2392 |
- DATE => sub { ... }, |
|
2393 |
- DATETIME => sub { ... } |
|
2395 |
+ date => sub { ... }, |
|
2396 |
+ datetime => sub { ... } |
|
2394 | 2397 |
}, |
2395 | 2398 |
from => { |
2396 | 2399 |
# DATE |
... | ... |
@@ -2402,12 +2405,15 @@ Register filters, used by C<filter> option of many methods. |
2402 | 2405 |
); |
2403 | 2406 |
|
2404 | 2407 |
Filtering rule when data is send into and get from database. |
2405 |
-This has a little complex problem. |
|
2408 |
+This has a little complex problem. |
|
2406 | 2409 |
|
2407 | 2410 |
In C<into> you can specify type name as same as type name defined |
2408 | 2411 |
by create table, such as C<DATETIME> or C<DATE>. |
2409 | 2412 |
Type rule of C<into> is enabled on the following pattern. |
2410 | 2413 |
|
2414 |
+Note that type name and data type don't contain upper case. |
|
2415 |
+If that contain upper case charactor, you specify it lower case. |
|
2416 |
+ |
|
2411 | 2417 |
=over 4 |
2412 | 2418 |
|
2413 | 2419 |
=item 1. column name |
... | ... |
@@ -6,7 +6,7 @@ use utf8; |
6 | 6 |
use Encode qw/encode_utf8 decode_utf8/; |
7 | 7 |
use Data::Dumper; |
8 | 8 |
|
9 |
-#$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /DEPRECATED/}; |
|
9 |
+$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /DEPRECATED/}; |
|
10 | 10 |
|
11 | 11 |
BEGIN { |
12 | 12 |
eval { require DBD::SQLite; 1 } |
... | ... |
@@ -2690,6 +2690,21 @@ $dbi->insert({key1 => 2}, table => 'table1'); |
2690 | 2690 |
$result = $dbi->select(table => 'table1'); |
2691 | 2691 |
is($result->fetch->[0], 8); |
2692 | 2692 |
|
2693 |
+test 'type_rule and filter order'; |
|
2694 |
+$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
|
2695 |
+$dbi->execute("create table table1 (key1 Date, key2 datetime)"); |
|
2696 |
+$dbi->type_rule( |
|
2697 |
+ into => { |
|
2698 |
+ date => sub { $_[0] . 'b' } |
|
2699 |
+ }, |
|
2700 |
+ from => { |
|
2701 |
+ date => sub { $_[0] . 'c' } |
|
2702 |
+ } |
|
2703 |
+); |
|
2704 |
+$dbi->insert({key1 => '1'}, table => 'table1', filter => {key1 => sub { $_[0] . 'a' }}); |
|
2705 |
+$result = $dbi->select(table => 'table1'); |
|
2706 |
+$result->filter(key1 => sub { $_[0] . 'd' }); |
|
2707 |
+is($result->fetch_first->[0], '1abcd'); |
|
2693 | 2708 |
|
2694 | 2709 |
test 'type_rule_off'; |
2695 | 2710 |
$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |