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