... | ... |
@@ -1,7 +1,10 @@ |
1 | 1 |
0.1623 |
2 | 2 |
added experimental auto_filter method |
3 | 3 |
deprecated default_bind_filter and default_fetch_filter because these are global effect. |
4 |
- weakend filter_check for usability |
|
4 |
+ changed defautl_bind_filter and default_fetch_filter attributes to methods. |
|
5 |
+ changed DBIx::Custom::Result default_filter attribute to method |
|
6 |
+ changed DBIx::Custom::Result filter attribute to method. |
|
7 |
+ filter_check is always done for usability |
|
5 | 8 |
0.1622 |
6 | 9 |
deprecated DBIx::Custom::SQLite and DBIx::Custom::MySQL |
7 | 10 |
added dbi_options attribute |
... | ... |
@@ -15,8 +15,8 @@ use DBIx::Custom::Query; |
15 | 15 |
use DBIx::Custom::QueryBuilder; |
16 | 16 |
use Encode qw/encode_utf8 decode_utf8/; |
17 | 17 |
|
18 |
-__PACKAGE__->attr([qw/data_source dbh default_bind_filter |
|
19 |
- dbi_options default_fetch_filter password user/]); |
|
18 |
+__PACKAGE__->attr([qw/data_source dbh |
|
19 |
+ dbi_options password user/]); |
|
20 | 20 |
|
21 | 21 |
__PACKAGE__->attr(cache => 1); |
22 | 22 |
__PACKAGE__->attr(cache_method => sub { |
... | ... |
@@ -98,21 +98,38 @@ sub auto_filter { |
98 | 98 |
|
99 | 99 |
# Bind filter |
100 | 100 |
my $bind_filter = $c->[1]; |
101 |
- croak qq{"$bind_filter" is not registered} |
|
102 |
- unless $self->filters->{$bind_filter}; |
|
103 |
- $self->{_auto_bind_filter}{$table}{$column} |
|
104 |
- = $self->filters->{$bind_filter}; |
|
105 |
- $self->{_auto_bind_filter}{$table}{"$table.$column"} |
|
106 |
- = $self->filters->{$bind_filter}; |
|
101 |
+ if (ref $bind_filter eq 'CODE') { |
|
102 |
+ $self->{_auto_bind_filter}{$table}{$column} |
|
103 |
+ = $bind_filter; |
|
104 |
+ $self->{_auto_bind_filter}{$table}{"$table.$column"} |
|
105 |
+ = $bind_filter; |
|
106 |
+ } |
|
107 |
+ else { |
|
108 |
+ croak qq{"$bind_filter" is not registered} |
|
109 |
+ unless exists $self->filters->{$bind_filter}; |
|
110 |
+ |
|
111 |
+ $self->{_auto_bind_filter}{$table}{$column} |
|
112 |
+ = $self->filters->{$bind_filter}; |
|
113 |
+ $self->{_auto_bind_filter}{$table}{"$table.$column"} |
|
114 |
+ = $self->filters->{$bind_filter}; |
|
115 |
+ } |
|
107 | 116 |
|
108 | 117 |
# Fetch filter |
109 | 118 |
my $fetch_filter = $c->[2]; |
110 |
- croak qq{"$fetch_filter" is not registered} |
|
111 |
- unless $self->filters->{$fetch_filter}; |
|
112 |
- $self->{_auto_fetch_filter}{$table}{$column} |
|
113 |
- = $self->filters->{$fetch_filter}; |
|
114 |
- $self->{_auto_fetch_filter}{$table}{"$table.$column"} |
|
115 |
- = $self->filters->{$fetch_filter}; |
|
119 |
+ if (ref $fetch_filter eq 'CODE') { |
|
120 |
+ $self->{_auto_fetch_filter}{$table}{$column} |
|
121 |
+ = $fetch_filter; |
|
122 |
+ $self->{_auto_fetch_filter}{$table}{"$table.$column"} |
|
123 |
+ = $fetch_filter; |
|
124 |
+ } |
|
125 |
+ else { |
|
126 |
+ croak qq{"$fetch_filter" is not registered} |
|
127 |
+ unless exists $self->filters->{$fetch_filter}; |
|
128 |
+ $self->{_auto_fetch_filter}{$table}{$column} |
|
129 |
+ = $self->filters->{$fetch_filter}; |
|
130 |
+ $self->{_auto_fetch_filter}{$table}{"$table.$column"} |
|
131 |
+ = $self->filters->{$fetch_filter}; |
|
132 |
+ } |
|
116 | 133 |
} |
117 | 134 |
|
118 | 135 |
return $self; |
... | ... |
@@ -209,6 +226,40 @@ sub create_query { |
209 | 226 |
return $query; |
210 | 227 |
} |
211 | 228 |
|
229 |
+sub default_bind_filter { |
|
230 |
+ my $self = shift; |
|
231 |
+ my $fname = $_[0]; |
|
232 |
+ |
|
233 |
+ if (@_ && !$fname) { |
|
234 |
+ $self->{_default_bind_filter} = undef; |
|
235 |
+ } |
|
236 |
+ else { |
|
237 |
+ croak qq{"$fname" is not registered} |
|
238 |
+ unless exists $self->filters->{$fname}; |
|
239 |
+ |
|
240 |
+ $self->{_default_bind_filter} = $self->filters->{$fname}; |
|
241 |
+ } |
|
242 |
+ |
|
243 |
+ return $self; |
|
244 |
+} |
|
245 |
+ |
|
246 |
+sub default_fetch_filter { |
|
247 |
+ my $self = shift; |
|
248 |
+ my $fname = $_[0]; |
|
249 |
+ |
|
250 |
+ if (@_ && !$fname) { |
|
251 |
+ $self->{_default_fetch_filter} = undef; |
|
252 |
+ } |
|
253 |
+ else { |
|
254 |
+ croak qq{"$fname" is not registered} |
|
255 |
+ unless exists $self->filters->{$fname}; |
|
256 |
+ |
|
257 |
+ $self->{_default_fetch_filter} = $self->filters->{$fname}; |
|
258 |
+ } |
|
259 |
+ |
|
260 |
+ return $self; |
|
261 |
+} |
|
262 |
+ |
|
212 | 263 |
our %VALID_DELETE_ARGS |
213 | 264 |
= map { $_ => 1 } qw/auto_filter_table table where append filter allow_delete_all/; |
214 | 265 |
|
... | ... |
@@ -294,6 +345,15 @@ sub execute{ |
294 | 345 |
|
295 | 346 |
# Filter |
296 | 347 |
my $filter = $args{filter} || $query->filter || {}; |
348 |
+ foreach my $column (keys %$filter) { |
|
349 |
+ my $fname = $filter->{$column}; |
|
350 |
+ unless (ref $fname eq 'CODE') { |
|
351 |
+ croak qq{"$fname" is not registered"} |
|
352 |
+ unless exists $self->filters->{$fname}; |
|
353 |
+ |
|
354 |
+ $filter->{$column} = $self->filters->{$fname}; |
|
355 |
+ } |
|
356 |
+ } |
|
297 | 357 |
$filter = {%$auto_filter, %$filter}; |
298 | 358 |
|
299 | 359 |
# Create bind value |
... | ... |
@@ -320,10 +380,10 @@ sub execute{ |
320 | 380 |
# Result |
321 | 381 |
my $result = $self->result_class->new( |
322 | 382 |
sth => $sth, |
323 |
- default_filter => $self->default_fetch_filter, |
|
324 | 383 |
filters => $self->filters, |
325 | 384 |
filter_check => $self->filter_check, |
326 |
- _auto_filter => $auto_fetch_filter || {} |
|
385 |
+ _auto_filter => $auto_fetch_filter || {}, |
|
386 |
+ _default_filter => $self->{_default_fetch_filter} |
|
327 | 387 |
); |
328 | 388 |
|
329 | 389 |
return $result; |
... | ... |
@@ -594,14 +654,9 @@ sub _build_bind_values { |
594 | 654 |
: $params->{$column}; |
595 | 655 |
|
596 | 656 |
# Filtering |
597 |
- my $fname = $filter->{$column} || $self->default_bind_filter || ''; |
|
598 |
- my $filter_func = ref $fname ? $fname |
|
599 |
- : $fname ? $self->filters->{$fname} |
|
600 |
- : undef; |
|
657 |
+ my $f = $filter->{$column} || $self->{_default_bind_filter} || ''; |
|
601 | 658 |
|
602 |
- push @bind_values, $filter_func |
|
603 |
- ? $filter_func->($value) |
|
604 |
- : $value; |
|
659 |
+ push @bind_values, $f ? $f->($value) : $value; |
|
605 | 660 |
|
606 | 661 |
# Count up |
607 | 662 |
$count->{$column}++; |
... | ... |
@@ -715,10 +770,6 @@ Execute SQL |
715 | 770 |
|
716 | 771 |
Other features. |
717 | 772 |
|
718 |
- # Default filter |
|
719 |
- $dbi->default_bind_filter('encode_utf8'); |
|
720 |
- $dbi->default_fetch_filter('decode_utf8'); |
|
721 |
- |
|
722 | 773 |
# Get DBI object |
723 | 774 |
my $dbh = $dbi->dbh; |
724 | 775 |
|
... | ... |
@@ -815,18 +866,6 @@ L<DBI> object. You can call all methods of L<DBI>. |
815 | 866 |
DBI options. |
816 | 867 |
C<connect()> method use this value to connect the database. |
817 | 868 |
|
818 |
-=head2 C<default_bind_filter> |
|
819 |
- |
|
820 |
- my $default_bind_filter = $dbi->default_bind_filter |
|
821 |
- $dbi = $dbi->default_bind_filter('encode_utf8'); |
|
822 |
- |
|
823 |
-Default filter when parameter binding is executed. |
|
824 |
- |
|
825 |
-=head2 C<default_fetch_filter> |
|
826 |
- |
|
827 |
- my $default_fetch_filter = $dbi->default_fetch_filter; |
|
828 |
- $dbi = $dbi->default_fetch_filter('decode_utf8'); |
|
829 |
- |
|
830 | 869 |
Default filter when row is fetched. |
831 | 870 |
|
832 | 871 |
=head2 C<filters> |
... | ... |
@@ -894,8 +933,17 @@ and implements the following new ones. |
894 | 933 |
|
895 | 934 |
C<auto_filter> is automatically filter for columns of table. |
896 | 935 |
This have effect C<insert>, C<update>, C<delete>. C<select> |
897 |
-and L<DBIx::Custom::Result> object. |
|
936 |
+and L<DBIx::Custom::Result> object. but this has'nt C<execute> method. |
|
937 |
+ |
|
938 |
+If you want to have effect <execute< method, use C<auto_filter_table> |
|
939 |
+arguments. |
|
898 | 940 |
|
941 |
+ $result = $dbi->execute( |
|
942 |
+ "select * from table1 where {= key1} and {= key2};", |
|
943 |
+ param => {key1 => 1, key2 => 2}, |
|
944 |
+ auto_filter_table => ['table1'] |
|
945 |
+ ); |
|
946 |
+ |
|
899 | 947 |
B<Example:> |
900 | 948 |
|
901 | 949 |
$dbi->auto_filter('books', 'sale_date', 'to_date', 'date_to'); |
... | ... |
@@ -940,6 +988,16 @@ instead of suger methods. |
940 | 988 |
|
941 | 989 |
$dbi->execute($query, {author => 'Ken', title => '%Perl%'}); |
942 | 990 |
|
991 |
+=head2 C<(deprecated) default_bind_filter> |
|
992 |
+ |
|
993 |
+ $dbi = $dbi->default_bind_filter($fname); |
|
994 |
+ |
|
995 |
+Default filter when parameter binding is executed. |
|
996 |
+ |
|
997 |
+=head2 C<(deprecated) default_fetch_filter> |
|
998 |
+ |
|
999 |
+ $dbi = $dbi->default_fetch_filter($fname); |
|
1000 |
+ |
|
943 | 1001 |
=head2 C<execute> |
944 | 1002 |
|
945 | 1003 |
my $result = $dbi->execute($query, param => $params, filter => \%filter); |
... | ... |
@@ -1074,10 +1132,6 @@ or arguments. |
1074 | 1132 |
|
1075 | 1133 |
=item * |
1076 | 1134 |
|
1077 |
-C<default_bind_filter>, C<default_fetch_filter> |
|
1078 |
- |
|
1079 |
-=item * |
|
1080 |
- |
|
1081 | 1135 |
C<filter> argument of C<insert()>, C<update()>, |
1082 | 1136 |
C<update_all()>, C<delete()>, C<delete_all()>, C<select()> |
1083 | 1137 |
methods |
... | ... |
@@ -7,15 +7,50 @@ use base 'Object::Simple'; |
7 | 7 |
|
8 | 8 |
use Carp 'croak'; |
9 | 9 |
|
10 |
-__PACKAGE__->attr([qw/default_filter filter |
|
11 |
- filter_check filters sth/]); |
|
10 |
+__PACKAGE__->attr([qw/filter_check filters sth/]); |
|
11 |
+ |
|
12 |
+sub default_filter { |
|
13 |
+ my $self = shift; |
|
14 |
+ my $fname = $_[0]; |
|
15 |
+ |
|
16 |
+ if (@_ && !$fname) { |
|
17 |
+ $self->{_default_filter} = undef; |
|
18 |
+ } |
|
19 |
+ else { |
|
20 |
+ croak qq{"$fname" is not registered} |
|
21 |
+ unless exists $self->filters->{$fname}; |
|
22 |
+ |
|
23 |
+ $self->{_default_filter} = $self->filters->{$fname}; |
|
24 |
+ } |
|
25 |
+ |
|
26 |
+ return $self; |
|
27 |
+} |
|
28 |
+ |
|
29 |
+sub filter { |
|
30 |
+ my $self = shift; |
|
31 |
+ my $filter = ref $_[0] eq 'HASH' ? $_[0] : {@_}; |
|
32 |
+ |
|
33 |
+ foreach my $column (keys %$filter) { |
|
34 |
+ my $fname = $filter->{$column}; |
|
35 |
+ unless (ref $fname eq 'CODE') { |
|
36 |
+ croak qq{"$fname" is not registered"} |
|
37 |
+ unless exists $self->filters->{$fname}; |
|
38 |
+ |
|
39 |
+ $filter->{$column} = $self->filters->{$fname}; |
|
40 |
+ } |
|
41 |
+ } |
|
42 |
+ |
|
43 |
+ $self->{_filter} = $filter; |
|
44 |
+ |
|
45 |
+ return $self; |
|
46 |
+} |
|
12 | 47 |
|
13 | 48 |
sub fetch { |
14 | 49 |
my $self = shift; |
15 | 50 |
|
16 | 51 |
# Filters |
17 | 52 |
my $filters = $self->{filters} || {}; |
18 |
- my $filter = $self->{filter} || {}; |
|
53 |
+ my $filter = $self->{_filter} || {}; |
|
19 | 54 |
my $auto_filter = $self->{_auto_filter} || {}; |
20 | 55 |
$filter = {%$auto_filter, %$filter}; |
21 | 56 |
|
... | ... |
@@ -31,14 +66,12 @@ sub fetch { |
31 | 66 |
|
32 | 67 |
# Filter name |
33 | 68 |
my $column = $columns->[$i]; |
34 |
- my $fname = exists $filter->{$column} |
|
35 |
- ? $filter->{$column} |
|
36 |
- : $self->{default_filter}; |
|
69 |
+ my $f = exists $filter->{$column} |
|
70 |
+ ? $filter->{$column} |
|
71 |
+ : $self->{_default_filter}; |
|
37 | 72 |
|
38 | 73 |
# Filtering |
39 |
- $row[$i] = ref $fname ? $fname->($row[$i]) |
|
40 |
- : $filters->{$fname}->($row[$i]) |
|
41 |
- if $fname; |
|
74 |
+ $row[$i] = $f->($row[$i]) if $f; |
|
42 | 75 |
} |
43 | 76 |
|
44 | 77 |
return \@row; |
... | ... |
@@ -75,7 +108,7 @@ sub fetch_hash { |
75 | 108 |
|
76 | 109 |
# Filters |
77 | 110 |
my $filters = $self->{filters} || {}; |
78 |
- my $filter = $self->{filter} || {}; |
|
111 |
+ my $filter = $self->{_filter} || {}; |
|
79 | 112 |
my $auto_filter = $self->{_auto_filter} || {}; |
80 | 113 |
$filter = {%$auto_filter, %$filter}; |
81 | 114 |
|
... | ... |
@@ -92,15 +125,12 @@ sub fetch_hash { |
92 | 125 |
|
93 | 126 |
# Filter name |
94 | 127 |
my $column = $columns->[$i]; |
95 |
- my $fname = exists $filter->{$column} |
|
96 |
- ? $filter->{$column} |
|
97 |
- : $self->{default_filter}; |
|
128 |
+ my $f = exists $filter->{$column} |
|
129 |
+ ? $filter->{$column} |
|
130 |
+ : $self->{_default_filter}; |
|
98 | 131 |
|
99 | 132 |
# Filtering |
100 |
- $row_hash->{$column} |
|
101 |
- = ref $fname ? $fname->($row->[$i]) |
|
102 |
- : $fname ? $filters->{$fname}->($row->[$i]) |
|
103 |
- : $row->[$i]; |
|
133 |
+ $row_hash->{$column} = $f ? $f->($row->[$i]) : $row->[$i]; |
|
104 | 134 |
} |
105 | 135 |
|
106 | 136 |
return $row_hash; |
... | ... |
@@ -234,19 +264,6 @@ Fetch row into hash. |
234 | 264 |
|
235 | 265 |
=head1 ATTRIBUTES |
236 | 266 |
|
237 |
-=head2 C<default_filter> |
|
238 |
- |
|
239 |
- my $default_filter = $result->default_filter; |
|
240 |
- $result = $result->default_filter('decode_utf8'); |
|
241 |
- |
|
242 |
-Default filter when a row is fetched. |
|
243 |
- |
|
244 |
-=head2 C<filter> |
|
245 |
- |
|
246 |
- my $filter = $result->filter; |
|
247 |
- $result = $result->filter({title => 'decode_utf8', |
|
248 |
- author => 'decode_utf8'}); |
|
249 |
- |
|
250 | 267 |
Filters when a row is fetched. |
251 | 268 |
This overwrites C<default_filter>. |
252 | 269 |
|
... | ... |
@@ -276,6 +293,12 @@ Statement handle of L<DBI>. |
276 | 293 |
L<DBIx::Custom::Result> inherits all methods from L<Object::Simple> |
277 | 294 |
and implements the following new ones. |
278 | 295 |
|
296 |
+=head2 C<(deprecated) default_filter> |
|
297 |
+ |
|
298 |
+ $result = $result->default_filter($filter); |
|
299 |
+ |
|
300 |
+Default filter when a row is fetched. |
|
301 |
+ |
|
279 | 302 |
=head2 C<fetch> |
280 | 303 |
|
281 | 304 |
my $row = $result->fetch; |
... | ... |
@@ -326,4 +349,9 @@ Row count must be specified. |
326 | 349 |
Fetch multiple rows into array of array. |
327 | 350 |
Row count must be specified. |
328 | 351 |
|
352 |
+=head2 C<filter> |
|
353 |
+ |
|
354 |
+ $result = $result->filter(title => 'decode_utf8', |
|
355 |
+ author => 'decode_utf8'); |
|
356 |
+ |
|
329 | 357 |
=cut |