| ... | ... |
@@ -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 |