... | ... |
@@ -1,6 +1,7 @@ |
1 | 1 |
0.1715 |
2 | 2 |
- default quote attribute in ODBC driver is changed to "[]" |
3 | 3 |
- fixed some bug in Microsoft SQL Server |
4 |
+ - added EXPERIMENTAL execute method sqlfilter option |
|
4 | 5 |
0.1714 |
5 | 6 |
- fixed not backword compatible change in 0.1712 query_buider |
6 | 7 |
0.1713 |
... | ... |
@@ -1,7 +1,7 @@ |
1 | 1 |
package DBIx::Custom; |
2 | 2 |
use Object::Simple -base; |
3 | 3 |
|
4 |
-our $VERSION = '0.1714'; |
|
4 |
+our $VERSION = '0.1715'; |
|
5 | 5 |
use 5.008001; |
6 | 6 |
|
7 | 7 |
use Carp 'croak'; |
... | ... |
@@ -344,7 +344,7 @@ sub each_table { |
344 | 344 |
|
345 | 345 |
our %VALID_ARGS = map { $_ => 1 } qw/append allow_delete_all |
346 | 346 |
allow_update_all bind_type column filter id join param prefix primary_key |
347 |
- query relation table table_alias type type_rule_off type_rule1_off |
|
347 |
+ query relation sqlfilter table table_alias type type_rule_off type_rule1_off |
|
348 | 348 |
type_rule2_off wrap/; |
349 | 349 |
|
350 | 350 |
sub execute { |
... | ... |
@@ -370,6 +370,7 @@ sub execute { |
370 | 370 |
}; |
371 | 371 |
my $query_return = delete $args{query}; |
372 | 372 |
my $table_alias = delete $args{table_alias} || {}; |
373 |
+ my $sqlfilter = $args{sqlfilter}; |
|
373 | 374 |
|
374 | 375 |
# Check argument names |
375 | 376 |
foreach my $name (keys %args) { |
... | ... |
@@ -377,8 +378,7 @@ sub execute { |
377 | 378 |
unless $VALID_ARGS{$name}; |
378 | 379 |
} |
379 | 380 |
|
380 |
- # Create query |
|
381 |
- $query = $self->_create_query($query) unless ref $query; |
|
381 |
+ $query = $self->_create_query($query, $sqlfilter) unless ref $query; |
|
382 | 382 |
|
383 | 383 |
# Save query |
384 | 384 |
$self->last_sql($query->sql); |
... | ... |
@@ -448,7 +448,7 @@ sub execute { |
448 | 448 |
$type_filters, |
449 | 449 |
$bind_type |
450 | 450 |
); |
451 |
- |
|
451 |
+ |
|
452 | 452 |
# Execute |
453 | 453 |
my $sth = $query->sth; |
454 | 454 |
my $affected; |
... | ... |
@@ -1119,7 +1119,7 @@ sub where { DBIx::Custom::Where->new(dbi => shift, @_) } |
1119 | 1119 |
|
1120 | 1120 |
sub _create_query { |
1121 | 1121 |
|
1122 |
- my ($self, $source) = @_; |
|
1122 |
+ my ($self, $source, $sqlfilter) = @_; |
|
1123 | 1123 |
|
1124 | 1124 |
# Cache |
1125 | 1125 |
my $cache = $self->cache; |
... | ... |
@@ -1163,7 +1163,16 @@ sub _create_query { |
1163 | 1163 |
} |
1164 | 1164 |
) if $cache; |
1165 | 1165 |
} |
1166 |
- |
|
1166 |
+ |
|
1167 |
+ # Filter SQL |
|
1168 |
+ if ($sqlfilter) { |
|
1169 |
+ my $sql = $query->sql; |
|
1170 |
+ $sql =~ s/\s*;$//; |
|
1171 |
+ $sql = $sqlfilter->($sql); |
|
1172 |
+ $sql .= ';'; |
|
1173 |
+ $query->sql($sql); |
|
1174 |
+ } |
|
1175 |
+ |
|
1167 | 1176 |
# Save sql |
1168 | 1177 |
$self->last_sql($query->sql); |
1169 | 1178 |
|
... | ... |
@@ -2253,6 +2262,17 @@ The following opitons are available. |
2253 | 2262 |
|
2254 | 2263 |
=over 4 |
2255 | 2264 |
|
2265 |
+=item C<bind_type> |
|
2266 |
+ |
|
2267 |
+Specify database bind data type. |
|
2268 |
+ |
|
2269 |
+ bind_type => [image => DBI::SQL_BLOB] |
|
2270 |
+ bind_type => [[qw/image audio/] => DBI::SQL_BLOB] |
|
2271 |
+ |
|
2272 |
+This is used to bind parameter by C<bind_param> of statment handle. |
|
2273 |
+ |
|
2274 |
+ $sth->bind_param($pos, $value, DBI::SQL_BLOB); |
|
2275 |
+ |
|
2256 | 2276 |
=item C<filter> |
2257 | 2277 |
|
2258 | 2278 |
filter => { |
... | ... |
@@ -2313,6 +2333,29 @@ Note that $row must be simple hash reference, such as |
2313 | 2333 |
{title => 'Perl', author => 'Ken'}. |
2314 | 2334 |
and don't forget to sort $row values by $row key asc order. |
2315 | 2335 |
|
2336 |
+=item C<sqlfilter EXPERIMENTAL> |
|
2337 |
+ |
|
2338 |
+SQL filter function. |
|
2339 |
+ |
|
2340 |
+ sqlfilter => $code_ref |
|
2341 |
+ |
|
2342 |
+This option is generally for Oracle and SQL Server paging process. |
|
2343 |
+ |
|
2344 |
+ my $limit = sub { |
|
2345 |
+ my ($sql, $count, $offset) = @_; |
|
2346 |
+ |
|
2347 |
+ my $min = $offset + 1; |
|
2348 |
+ my $max = $offset + $count; |
|
2349 |
+ |
|
2350 |
+ $sql = "select * from ( $sql ) as t where rnum >= $min rnum <= $max"; |
|
2351 |
+ |
|
2352 |
+ return $sql; |
|
2353 |
+ } |
|
2354 |
+ $dbi->select(... column => ['ROWNUM rnom'], sqlfilter => sub { |
|
2355 |
+ my $sql = shift; |
|
2356 |
+ return $limit->($sql, 100, 50); |
|
2357 |
+ }) |
|
2358 |
+ |
|
2316 | 2359 |
=item C<table> |
2317 | 2360 |
|
2318 | 2361 |
table => 'author' |
... | ... |
@@ -2329,17 +2372,6 @@ You must set C<table> option. |
2329 | 2372 |
"select * from book where title = :book.title and author = :book.author", |
2330 | 2373 |
{title => 'Perl', author => 'Ken'); |
2331 | 2374 |
|
2332 |
-=item C<bind_type> |
|
2333 |
- |
|
2334 |
-Specify database bind data type. |
|
2335 |
- |
|
2336 |
- bind_type => [image => DBI::SQL_BLOB] |
|
2337 |
- bind_type => [[qw/image audio/] => DBI::SQL_BLOB] |
|
2338 |
- |
|
2339 |
-This is used to bind parameter by C<bind_param> of statment handle. |
|
2340 |
- |
|
2341 |
- $sth->bind_param($pos, $value, DBI::SQL_BLOB); |
|
2342 |
- |
|
2343 | 2375 |
=item C<table_alias> EXPERIMENTAL |
2344 | 2376 |
|
2345 | 2377 |
table_alias => {user => 'hiker'} |
... | ... |
@@ -2416,6 +2448,10 @@ prefix before table name section. |
2416 | 2448 |
|
2417 | 2449 |
Same as C<execute> method's C<query> option. |
2418 | 2450 |
|
2451 |
+=item C<sqlfilter EXPERIMENTAL> |
|
2452 |
+ |
|
2453 |
+Same as C<execute> method's C<sqlfilter> option. |
|
2454 |
+ |
|
2419 | 2455 |
=item C<table> |
2420 | 2456 |
|
2421 | 2457 |
table => 'book' |
... | ... |
@@ -2479,6 +2515,10 @@ The following opitons are available. |
2479 | 2515 |
|
2480 | 2516 |
Same as C<select> method's C<append> option. |
2481 | 2517 |
|
2518 |
+=item C<bind_type> |
|
2519 |
+ |
|
2520 |
+Same as C<execute> method's C<bind_type> option. |
|
2521 |
+ |
|
2482 | 2522 |
=item C<filter> |
2483 | 2523 |
|
2484 | 2524 |
Same as C<execute> method's C<filter> option. |
... | ... |
@@ -2524,16 +2564,16 @@ Primary key. This is used by C<id> option. |
2524 | 2564 |
|
2525 | 2565 |
Same as C<execute> method's C<query> option. |
2526 | 2566 |
|
2567 |
+=item C<sqlfilter EXPERIMENTAL> |
|
2568 |
+ |
|
2569 |
+Same as C<execute> method's C<sqlfilter> option. |
|
2570 |
+ |
|
2527 | 2571 |
=item C<table> |
2528 | 2572 |
|
2529 | 2573 |
table => 'book' |
2530 | 2574 |
|
2531 | 2575 |
Table name. |
2532 | 2576 |
|
2533 |
-=item C<bind_type> |
|
2534 |
- |
|
2535 |
-Same as C<execute> method's C<bind_type> option. |
|
2536 |
- |
|
2537 | 2577 |
=item C<type_rule_off> EXPERIMENTAL |
2538 | 2578 |
|
2539 | 2579 |
Same as C<execute> method's C<type_rule_off> option. |
... | ... |
@@ -2832,6 +2872,10 @@ The following opitons are available. |
2832 | 2872 |
append => 'order by title' |
2833 | 2873 |
|
2834 | 2874 |
Append statement to last of SQL. |
2875 |
+ |
|
2876 |
+=item C<bind_type> |
|
2877 |
+ |
|
2878 |
+Same as C<execute> method's C<bind_type> option. |
|
2835 | 2879 |
|
2836 | 2880 |
=item C<column> |
2837 | 2881 |
|
... | ... |
@@ -2968,9 +3012,9 @@ Primary key. This is used by C<id> option. |
2968 | 3012 |
|
2969 | 3013 |
Same as C<execute> method's C<query> option. |
2970 | 3014 |
|
2971 |
-=item C<bind_type> |
|
3015 |
+=item C<sqlfilter EXPERIMENTAL> |
|
2972 | 3016 |
|
2973 |
-Same as C<execute> method's C<bind_type> option. |
|
3017 |
+Same as C<execute> method's C<sqlfilter> option |
|
2974 | 3018 |
|
2975 | 3019 |
=item C<table> |
2976 | 3020 |
|
... | ... |
@@ -3026,7 +3070,7 @@ Where clause. |
3026 | 3070 |
|
3027 | 3071 |
Wrap statement. This is array reference. |
3028 | 3072 |
|
3029 |
- $dbi->select(wrap => ['select * from (', ') as t where ROWNUM < 10']); |
|
3073 |
+ wrap => ['select * from (', ') as t where ROWNUM < 10'] |
|
3030 | 3074 |
|
3031 | 3075 |
This option is for Oracle and SQL Server paging process. |
3032 | 3076 |
|
... | ... |
@@ -3051,6 +3095,10 @@ The following opitons are available. |
3051 | 3095 |
|
3052 | 3096 |
Same as C<select> method's C<append> option. |
3053 | 3097 |
|
3098 |
+=item C<bind_type> |
|
3099 |
+ |
|
3100 |
+Same as C<execute> method's C<bind_type> option. |
|
3101 |
+ |
|
3054 | 3102 |
=item C<filter> |
3055 | 3103 |
|
3056 | 3104 |
Same as C<execute> method's C<filter> option. |
... | ... |
@@ -3097,20 +3145,16 @@ Primary key. This is used by C<id> option. |
3097 | 3145 |
|
3098 | 3146 |
Same as C<execute> method's C<query> option. |
3099 | 3147 |
|
3148 |
+=item C<sqlfilter EXPERIMENTAL> |
|
3149 |
+ |
|
3150 |
+Same as C<execute> method's C<sqlfilter> option. |
|
3151 |
+ |
|
3100 | 3152 |
=item C<table> |
3101 | 3153 |
|
3102 | 3154 |
table => 'book' |
3103 | 3155 |
|
3104 | 3156 |
Table name. |
3105 | 3157 |
|
3106 |
-=item C<where> |
|
3107 |
- |
|
3108 |
-Same as C<select> method's C<where> option. |
|
3109 |
- |
|
3110 |
-=item C<bind_type> |
|
3111 |
- |
|
3112 |
-Same as C<execute> method's C<bind_type> option. |
|
3113 |
- |
|
3114 | 3158 |
=item C<type_rule_off> EXPERIMENTAL |
3115 | 3159 |
|
3116 | 3160 |
Same as C<execute> method's C<type_rule_off> option. |
... | ... |
@@ -3127,6 +3171,10 @@ Same as C<execute> method's C<type_rule1_off> option. |
3127 | 3171 |
|
3128 | 3172 |
Same as C<execute> method's C<type_rule2_off> option. |
3129 | 3173 |
|
3174 |
+=item C<where> |
|
3175 |
+ |
|
3176 |
+Same as C<select> method's C<where> option. |
|
3177 |
+ |
|
3130 | 3178 |
=back |
3131 | 3179 |
|
3132 | 3180 |
=head2 C<update_all> |
... | ... |
@@ -3411,6 +3411,23 @@ $dbi->select( |
3411 | 3411 |
}; |
3412 | 3412 |
like($@, qr/array/); |
3413 | 3413 |
|
3414 |
+test 'select() sqlfilter option'; |
|
3415 |
+$dbi = DBIx::Custom->connect; |
|
3416 |
+eval { $dbi->execute('drop table table1') }; |
|
3417 |
+$dbi->execute($create_table1); |
|
3418 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
3419 |
+$dbi->insert(table => 'table1', param => {key1 => 2, key2 => 3}); |
|
3420 |
+$rows = $dbi->select( |
|
3421 |
+ table => 'table1', |
|
3422 |
+ column => 'key1', |
|
3423 |
+ sqlfilter => sub { |
|
3424 |
+ my $sql = shift; |
|
3425 |
+ $sql = "select * from ( $sql ) as t where key1 = 1"; |
|
3426 |
+ return $sql; |
|
3427 |
+ } |
|
3428 |
+)->all; |
|
3429 |
+is_deeply($rows, [{key1 => 1}]); |
|
3430 |
+ |
|
3414 | 3431 |
test 'dbi method from model'; |
3415 | 3432 |
$dbi = MyDBI9->connect; |
3416 | 3433 |
eval { $dbi->execute('drop table table1') }; |