| ... | ... |
@@ -1,4 +1,5 @@ |
| 1 | 1 |
0.1692 |
| 2 |
+ - added EXPERIMENTAL DBIx::Custom::Result type_rule |
|
| 2 | 3 |
- added EXPERIMENTAL available_type_name method |
| 3 | 4 |
- EXPERIMENTAL type_rule_off is not passed form execute method |
| 4 | 5 |
to DBIx::Custom::Result object |
| ... | ... |
@@ -521,7 +521,7 @@ sub execute {
|
| 521 | 521 |
default_filter => $self->{default_in_filter},
|
| 522 | 522 |
filter => $filter->{in} || {},
|
| 523 | 523 |
end_filter => $filter->{end} || {},
|
| 524 |
- type_rule => $self->type_rule, |
|
| 524 |
+ type_rule => \%{$self->type_rule->{from}},
|
|
| 525 | 525 |
); |
| 526 | 526 |
|
| 527 | 527 |
return $result; |
| ... | ... |
@@ -989,10 +989,14 @@ sub type_rule {
|
| 989 | 989 |
$type_rule->{into} = _array_to_hash($type_rule->{into});
|
| 990 | 990 |
$self->{type_rule} = $type_rule;
|
| 991 | 991 |
$self->{_into} ||= {};
|
| 992 |
+ foreach my $type_name (keys %{$type_rule->{into} || {}}) {
|
|
| 993 |
+ croak qq{type name of into section must be lower case}
|
|
| 994 |
+ if $type_name =~ /[A-Z]/; |
|
| 995 |
+ } |
|
| 992 | 996 |
$self->each_column(sub {
|
| 993 | 997 |
my ($dbi, $table, $column, $column_info) = @_; |
| 994 | 998 |
|
| 995 |
- my $type_name = $column_info->{TYPE_NAME};
|
|
| 999 |
+ my $type_name = lc $column_info->{TYPE_NAME};
|
|
| 996 | 1000 |
if ($type_rule->{into} &&
|
| 997 | 1001 |
(my $filter = $type_rule->{into}->{$type_name}))
|
| 998 | 1002 |
{
|
| ... | ... |
@@ -1014,6 +1018,8 @@ sub type_rule {
|
| 1014 | 1018 |
# From |
| 1015 | 1019 |
$type_rule->{from} = _array_to_hash($type_rule->{from});
|
| 1016 | 1020 |
foreach my $data_type (keys %{$type_rule->{from} || {}}) {
|
| 1021 |
+ croak qq{data type of into section must be lower case or number}
|
|
| 1022 |
+ if $data_type =~ /[A-Z]/; |
|
| 1017 | 1023 |
my $fname = $type_rule->{from}{$data_type};
|
| 1018 | 1024 |
if (defined $fname && ref $fname ne 'CODE') {
|
| 1019 | 1025 |
croak qq{Filter "$fname" is not registered" } . _subname
|
| ... | ... |
@@ -5,7 +5,7 @@ use Object::Simple -base; |
| 5 | 5 |
use Carp 'croak'; |
| 6 | 6 |
use DBIx::Custom::Util qw/_array_to_hash _subname/; |
| 7 | 7 |
|
| 8 |
-has [qw/filters filter_off sth type_rule type_rule_off/], |
|
| 8 |
+has [qw/filters filter_off sth type_rule_off/], |
|
| 9 | 9 |
stash => sub { {} };
|
| 10 | 10 |
|
| 11 | 11 |
*all = \&fetch_hash_all; |
| ... | ... |
@@ -68,9 +68,7 @@ sub fetch {
|
| 68 | 68 |
my $type_rule = $self->type_rule || {};
|
| 69 | 69 |
|
| 70 | 70 |
for (my $i = 0; $i < @$columns; $i++) {
|
| 71 |
- |
|
| 72 |
- if (!$self->type_rule_off && $type_rule->{from} &&
|
|
| 73 |
- (my $rule = $type_rule->{from}->{$types->[$i]}))
|
|
| 71 |
+ if (!$self->type_rule_off && (my $rule = $type_rule->{lc($types->[$i])}))
|
|
| 74 | 72 |
{
|
| 75 | 73 |
$row[$i] = $rule->($row[$i]); |
| 76 | 74 |
} |
| ... | ... |
@@ -139,8 +137,7 @@ sub fetch_hash {
|
| 139 | 137 |
for (my $i = 0; $i < @$columns; $i++) {
|
| 140 | 138 |
|
| 141 | 139 |
# Type rule |
| 142 |
- if (!$self->type_rule_off && $type_rule->{from} &&
|
|
| 143 |
- (my $rule = $type_rule->{from}->{$types->[$i]}))
|
|
| 140 |
+ if (!$self->type_rule_off && (my $rule = $type_rule->{lc($types->[$i])}))
|
|
| 144 | 141 |
{
|
| 145 | 142 |
$row->[$i] = $rule->($row->[$i]); |
| 146 | 143 |
} |
| ... | ... |
@@ -229,6 +226,36 @@ sub fetch_multi {
|
| 229 | 226 |
|
| 230 | 227 |
*one = \&fetch_hash_first; |
| 231 | 228 |
|
| 229 |
+sub type_rule {
|
|
| 230 |
+ my $self = shift; |
|
| 231 |
+ |
|
| 232 |
+ # Merge type rule |
|
| 233 |
+ if (@_) {
|
|
| 234 |
+ my $type_rule = @_ == 1 ? $_[0] : [@_]; |
|
| 235 |
+ $type_rule = _array_to_hash($type_rule) || {};
|
|
| 236 |
+ foreach my $data_type (keys %{$type_rule || {}}) {
|
|
| 237 |
+ croak qq{data type of into section must be lower case or number}
|
|
| 238 |
+ if $data_type =~ /[A-Z]/; |
|
| 239 |
+ my $fname = $type_rule->{$data_type};
|
|
| 240 |
+ if (defined $fname && ref $fname ne 'CODE') {
|
|
| 241 |
+ croak qq{Filter "$fname" is not registered" } . _subname
|
|
| 242 |
+ unless exists $self->filters->{$fname};
|
|
| 243 |
+ |
|
| 244 |
+ $type_rule->{$data_type} = $self->filters->{$fname};
|
|
| 245 |
+ } |
|
| 246 |
+ } |
|
| 247 |
+ $self->{type_rule} = {%{$self->type_rule}, %$type_rule};
|
|
| 248 |
+ } |
|
| 249 |
+ |
|
| 250 |
+ return $self->{type_rule} ||= {};
|
|
| 251 |
+} |
|
| 252 |
+ |
|
| 253 |
+sub clear_type_rule {
|
|
| 254 |
+ my $self = shift; |
|
| 255 |
+ $self->{type_rule} = {};
|
|
| 256 |
+ return $self; |
|
| 257 |
+} |
|
| 258 |
+ |
|
| 232 | 259 |
# DEPRECATED! |
| 233 | 260 |
sub end_filter {
|
| 234 | 261 |
my $self = shift; |
| ... | ... |
@@ -501,6 +528,17 @@ Remove filter. End filter is not removed. |
| 501 | 528 |
|
| 502 | 529 |
Stash is hash reference to save your data. |
| 503 | 530 |
|
| 531 |
+=head2 C<type_rule> EXPERIMENTAL |
|
| 532 |
+ |
|
| 533 |
+ $result->type_rule( |
|
| 534 |
+ # DATE |
|
| 535 |
+ 9 => sub { ... },
|
|
| 536 |
+ # DATETIME or TIMESTAMP |
|
| 537 |
+ 11 => sub { ... }
|
|
| 538 |
+ ); |
|
| 539 |
+ |
|
| 540 |
+This override L<DBIx::Custom>'s C<type_rule> C<from> section. |
|
| 541 |
+ |
|
| 504 | 542 |
=head2 C<remove_end_filter> DEPRECATED! |
| 505 | 543 |
|
| 506 | 544 |
$result->remove_end_filter; |
| ... | ... |
@@ -2605,7 +2605,7 @@ test 'type_rule from'; |
| 2605 | 2605 |
$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
| 2606 | 2606 |
$dbi->type_rule( |
| 2607 | 2607 |
from => {
|
| 2608 |
- Date => sub { uc $_[0] }
|
|
| 2608 |
+ date => sub { uc $_[0] }
|
|
| 2609 | 2609 |
} |
| 2610 | 2610 |
); |
| 2611 | 2611 |
$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
| ... | ... |
@@ -2622,7 +2622,7 @@ $dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
| 2622 | 2622 |
$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
| 2623 | 2623 |
$dbi->type_rule( |
| 2624 | 2624 |
into => {
|
| 2625 |
- Date => sub { uc $_[0] }
|
|
| 2625 |
+ date => sub { uc $_[0] }
|
|
| 2626 | 2626 |
} |
| 2627 | 2627 |
); |
| 2628 | 2628 |
$dbi->insert({key1 => 'a'}, table => 'table1');
|
| ... | ... |
@@ -2630,10 +2630,10 @@ $result = $dbi->select(table => 'table1'); |
| 2630 | 2630 |
is($result->one->{key1}, 'A');
|
| 2631 | 2631 |
|
| 2632 | 2632 |
$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
| 2633 |
-$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
|
| 2633 |
+$dbi->execute("create table table1 (key1 date, key2 datetime)");
|
|
| 2634 | 2634 |
$dbi->type_rule( |
| 2635 | 2635 |
into => [ |
| 2636 |
- [qw/Date datetime/] => sub { uc $_[0] }
|
|
| 2636 |
+ [qw/date datetime/] => sub { uc $_[0] }
|
|
| 2637 | 2637 |
] |
| 2638 | 2638 |
); |
| 2639 | 2639 |
$dbi->insert({key1 => 'a', key2 => 'b'}, table => 'table1');
|
| ... | ... |
@@ -2647,7 +2647,7 @@ $dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
| 2647 | 2647 |
$dbi->insert({key1 => 'a', key2 => 'B'}, table => 'table1');
|
| 2648 | 2648 |
$dbi->type_rule( |
| 2649 | 2649 |
into => [ |
| 2650 |
- [qw/Date datetime/] => sub { uc $_[0] }
|
|
| 2650 |
+ [qw/date datetime/] => sub { uc $_[0] }
|
|
| 2651 | 2651 |
] |
| 2652 | 2652 |
); |
| 2653 | 2653 |
$result = $dbi->execute( |
| ... | ... |
@@ -2663,7 +2663,7 @@ $dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
| 2663 | 2663 |
$dbi->insert({key1 => 'A', key2 => 'B'}, table => 'table1');
|
| 2664 | 2664 |
$dbi->type_rule( |
| 2665 | 2665 |
into => [ |
| 2666 |
- [qw/Date datetime/] => sub { uc $_[0] }
|
|
| 2666 |
+ [qw/date datetime/] => sub { uc $_[0] }
|
|
| 2667 | 2667 |
] |
| 2668 | 2668 |
); |
| 2669 | 2669 |
$result = $dbi->execute( |
| ... | ... |
@@ -2676,14 +2676,14 @@ is($row->{key1}, 'A');
|
| 2676 | 2676 |
is($row->{key2}, 'B');
|
| 2677 | 2677 |
|
| 2678 | 2678 |
$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
| 2679 |
-$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
|
| 2679 |
+$dbi->execute("create table table1 (key1 date, key2 datetime)");
|
|
| 2680 | 2680 |
$dbi->register_filter(twice => sub { $_[0] * 2 });
|
| 2681 | 2681 |
$dbi->type_rule( |
| 2682 | 2682 |
from => {
|
| 2683 |
- Date => 'twice', |
|
| 2683 |
+ date => 'twice', |
|
| 2684 | 2684 |
}, |
| 2685 | 2685 |
into => {
|
| 2686 |
- Date => 'twice', |
|
| 2686 |
+ date => 'twice', |
|
| 2687 | 2687 |
} |
| 2688 | 2688 |
); |
| 2689 | 2689 |
$dbi->insert({key1 => 2}, table => 'table1');
|
| ... | ... |
@@ -2696,10 +2696,10 @@ $dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
| 2696 | 2696 |
$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
| 2697 | 2697 |
$dbi->type_rule( |
| 2698 | 2698 |
from => {
|
| 2699 |
- Date => sub { $_[0] * 2 },
|
|
| 2699 |
+ date => sub { $_[0] * 2 },
|
|
| 2700 | 2700 |
}, |
| 2701 | 2701 |
into => {
|
| 2702 |
- Date => sub { $_[0] * 2 },
|
|
| 2702 |
+ date => sub { $_[0] * 2 },
|
|
| 2703 | 2703 |
} |
| 2704 | 2704 |
); |
| 2705 | 2705 |
$dbi->insert({key1 => 2}, table => 'table1', type_rule_off => 1);
|
| ... | ... |
@@ -2711,22 +2711,50 @@ $dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
| 2711 | 2711 |
$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
| 2712 | 2712 |
$dbi->type_rule( |
| 2713 | 2713 |
from => {
|
| 2714 |
- DATE => sub { $_[0] * 2 },
|
|
| 2714 |
+ date => sub { $_[0] * 2 },
|
|
| 2715 | 2715 |
}, |
| 2716 | 2716 |
into => {
|
| 2717 |
- DATE => sub { $_[0] * 3 },
|
|
| 2717 |
+ date => sub { $_[0] * 3 },
|
|
| 2718 | 2718 |
} |
| 2719 | 2719 |
); |
| 2720 | 2720 |
$dbi->insert({key1 => 2}, table => 'table1', type_rule_off => 1);
|
| 2721 | 2721 |
$result = $dbi->select(table => 'table1', type_rule_off => 1); |
| 2722 |
-is($result->one->{key1}, 2);
|
|
| 2722 |
+is($result->one->{key1}, 4);
|
|
| 2723 |
+ |
|
| 2724 |
+$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
|
| 2725 |
+$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
|
| 2726 |
+$dbi->type_rule( |
|
| 2727 |
+ from => {
|
|
| 2728 |
+ date => sub { $_[0] * 2 },
|
|
| 2729 |
+ }, |
|
| 2730 |
+ into => {
|
|
| 2731 |
+ date => sub { $_[0] * 3 },
|
|
| 2732 |
+ } |
|
| 2733 |
+); |
|
| 2734 |
+$dbi->insert({key1 => 2}, table => 'table1');
|
|
| 2735 |
+$result = $dbi->select(table => 'table1'); |
|
| 2736 |
+is($result->one->{key1}, 12);
|
|
| 2737 |
+ |
|
| 2738 |
+$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
|
| 2739 |
+$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
|
| 2740 |
+$dbi->type_rule( |
|
| 2741 |
+ from => {
|
|
| 2742 |
+ date => sub { $_[0] * 2 },
|
|
| 2743 |
+ }, |
|
| 2744 |
+ into => {
|
|
| 2745 |
+ date => sub { $_[0] * 3 },
|
|
| 2746 |
+ } |
|
| 2747 |
+); |
|
| 2748 |
+$dbi->insert({key1 => 2}, table => 'table1');
|
|
| 2749 |
+$result = $dbi->select(table => 'table1'); |
|
| 2750 |
+is($result->fetch->[0], 12); |
|
| 2723 | 2751 |
|
| 2724 | 2752 |
$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
| 2725 | 2753 |
$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
| 2726 | 2754 |
$dbi->register_filter(ppp => sub { uc $_[0] });
|
| 2727 | 2755 |
$dbi->type_rule( |
| 2728 | 2756 |
into => {
|
| 2729 |
- Date => 'ppp' |
|
| 2757 |
+ date => 'ppp' |
|
| 2730 | 2758 |
} |
| 2731 | 2759 |
); |
| 2732 | 2760 |
$dbi->insert({key1 => 'a'}, table => 'table1');
|
| ... | ... |
@@ -2735,11 +2763,98 @@ is($result->one->{key1}, 'A');
|
| 2735 | 2763 |
|
| 2736 | 2764 |
eval{$dbi->type_rule(
|
| 2737 | 2765 |
into => {
|
| 2738 |
- Date => 'pp' |
|
| 2766 |
+ date => 'pp' |
|
| 2739 | 2767 |
} |
| 2740 | 2768 |
)}; |
| 2741 | 2769 |
like($@, qr/not registered/); |
| 2742 | 2770 |
|
| 2771 |
+$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
|
| 2772 |
+$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
|
| 2773 |
+$dbi->type_rule( |
|
| 2774 |
+ from => {
|
|
| 2775 |
+ date => sub { $_[0] * 2 },
|
|
| 2776 |
+ }, |
|
| 2777 |
+ into => {
|
|
| 2778 |
+ date => sub { $_[0] * 3 },
|
|
| 2779 |
+ } |
|
| 2780 |
+); |
|
| 2781 |
+$dbi->insert({key1 => 2}, table => 'table1');
|
|
| 2782 |
+$result = $dbi->select(table => 'table1'); |
|
| 2783 |
+delete $result->type_rule->{date};
|
|
| 2784 |
+is($result->one->{key1}, 6);
|
|
| 2785 |
+ |
|
| 2786 |
+$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
|
| 2787 |
+$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
|
| 2788 |
+eval {
|
|
| 2789 |
+ $dbi->type_rule( |
|
| 2790 |
+ from => {
|
|
| 2791 |
+ Date => sub { $_[0] * 2 },
|
|
| 2792 |
+ } |
|
| 2793 |
+ ); |
|
| 2794 |
+}; |
|
| 2795 |
+like($@, qr/lower/); |
|
| 2796 |
+ |
|
| 2797 |
+eval {
|
|
| 2798 |
+ $dbi->type_rule( |
|
| 2799 |
+ into => {
|
|
| 2800 |
+ Date => sub { $_[0] * 2 },
|
|
| 2801 |
+ } |
|
| 2802 |
+ ); |
|
| 2803 |
+}; |
|
| 2804 |
+like($@, qr/lower/); |
|
| 2805 |
+ |
|
| 2806 |
+$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
|
| 2807 |
+$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
|
| 2808 |
+$dbi->type_rule( |
|
| 2809 |
+ from => {
|
|
| 2810 |
+ date => sub { $_[0] * 2 },
|
|
| 2811 |
+ }, |
|
| 2812 |
+ into => {
|
|
| 2813 |
+ date => sub { $_[0] * 3 },
|
|
| 2814 |
+ } |
|
| 2815 |
+); |
|
| 2816 |
+$dbi->insert({key1 => 2}, table => 'table1');
|
|
| 2817 |
+$result = $dbi->select(table => 'table1'); |
|
| 2818 |
+$result->type_rule_off(1); |
|
| 2819 |
+is($result->one->{key1}, 6);
|
|
| 2820 |
+ |
|
| 2821 |
+$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
|
| 2822 |
+$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
|
| 2823 |
+$dbi->type_rule( |
|
| 2824 |
+ from => {
|
|
| 2825 |
+ date => sub { $_[0] * 2 },
|
|
| 2826 |
+ datetime => sub { $_[0] * 4 },
|
|
| 2827 |
+ }, |
|
| 2828 |
+); |
|
| 2829 |
+$dbi->insert({key1 => 2, key2 => 2}, table => 'table1');
|
|
| 2830 |
+$result = $dbi->select(table => 'table1'); |
|
| 2831 |
+$result->type_rule(date => sub { $_[0] * 3 });
|
|
| 2832 |
+$row = $result->one; |
|
| 2833 |
+is($row->{key1}, 6);
|
|
| 2834 |
+is($row->{key2}, 8);
|
|
| 2835 |
+$result = $dbi->select(table => 'table1'); |
|
| 2836 |
+$result->type_rule({date => sub { $_[0] * 3 }});
|
|
| 2837 |
+$row = $result->one; |
|
| 2838 |
+is($row->{key1}, 6);
|
|
| 2839 |
+is($row->{key2}, 8);
|
|
| 2840 |
+$result = $dbi->select(table => 'table1'); |
|
| 2841 |
+$result->type_rule([date => sub { $_[0] * 3 }]);
|
|
| 2842 |
+$row = $result->one; |
|
| 2843 |
+is($row->{key1}, 6);
|
|
| 2844 |
+is($row->{key2}, 8);
|
|
| 2845 |
+$dbi->register_filter(fivetimes => sub { $_[0] * 5});
|
|
| 2846 |
+$result = $dbi->select(table => 'table1'); |
|
| 2847 |
+$result->type_rule(date => 'fivetimes'); |
|
| 2848 |
+$row = $result->one; |
|
| 2849 |
+is($row->{key1}, 10);
|
|
| 2850 |
+is($row->{key2}, 8);
|
|
| 2851 |
+$result = $dbi->select(table => 'table1'); |
|
| 2852 |
+$result->type_rule(date => undef); |
|
| 2853 |
+$row = $result->one; |
|
| 2854 |
+is($row->{key1}, 2);
|
|
| 2855 |
+is($row->{key2}, 8);
|
|
| 2856 |
+ |
|
| 2857 |
+ |
|
| 2743 | 2858 |
test 'result_filter'; |
| 2744 | 2859 |
$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
|
| 2745 | 2860 |
$dbi->execute($CREATE_TABLE->{0});
|
| ... | ... |
@@ -142,12 +142,12 @@ $dbi->each_column( |
| 142 | 142 |
|
| 143 | 143 |
$dbi->type_rule( |
| 144 | 144 |
into => {
|
| 145 |
- DATE=> sub {
|
|
| 145 |
+ date=> sub {
|
|
| 146 | 146 |
my $date = shift; |
| 147 | 147 |
$date =~ s/aaaaa//g; |
| 148 | 148 |
return $date; |
| 149 | 149 |
}, |
| 150 |
- DATETIME => sub {
|
|
| 150 |
+ datetime => sub {
|
|
| 151 | 151 |
my $date = shift; |
| 152 | 152 |
$date =~ s/ccccc//g; |
| 153 | 153 |
return $date; |