| ... | ... |
@@ -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:'); |