| ... | ... |
@@ -407,9 +407,13 @@ sub execute {
|
| 407 | 407 |
my ($self, $query, %args) = @_; |
| 408 | 408 |
|
| 409 | 409 |
# Arguments |
| 410 |
- my $params = delete $args{param} || {};
|
|
| 410 |
+ my $param = delete $args{param} || {};
|
|
| 411 | 411 |
my $tables = delete $args{table} || [];
|
| 412 | 412 |
$tables = [$tables] unless ref $tables eq 'ARRAY'; |
| 413 |
+ my $filter = delete $args{filter};
|
|
| 414 |
+ $filter = DBIx::Custom::Util::array_to_hash($filter); |
|
| 415 |
+ my $type = delete $args{type};
|
|
| 416 |
+ $type = DBIx::Custom::Util::array_to_hash($type); |
|
| 413 | 417 |
|
| 414 | 418 |
# Check argument names |
| 415 | 419 |
foreach my $name (keys %args) {
|
| ... | ... |
@@ -419,10 +423,10 @@ sub execute {
|
| 419 | 423 |
|
| 420 | 424 |
# Create query |
| 421 | 425 |
$query = $self->create_query($query) unless ref $query; |
| 426 |
+ $filter ||= $query->filter; |
|
| 422 | 427 |
|
| 423 | 428 |
# Tables |
| 424 | 429 |
unshift @$tables, @{$query->tables};
|
| 425 |
- my %table_set = map {defined $_ ? ($_ => 1) : ()} @$tables;
|
|
| 426 | 430 |
my $main_table = pop @$tables; |
| 427 | 431 |
$tables = $self->_remove_duplicate_table($tables, $main_table); |
| 428 | 432 |
if (my $q = $self->reserved_word_quote) {
|
| ... | ... |
@@ -449,78 +453,69 @@ sub execute {
|
| 449 | 453 |
my $filter_name_alias = $filter_name; |
| 450 | 454 |
$filter_name_alias =~ s/^$alias\./$table\./; |
| 451 | 455 |
$filter_name_alias =~ s/^${alias}__/${table}__/;
|
| 452 |
- |
|
| 453 | 456 |
$self->{filter}{$type}{$table}{$filter_name_alias}
|
| 454 | 457 |
= $self->{filter}{$type}{$alias}{$filter_name}
|
| 455 | 458 |
} |
| 456 | 459 |
} |
| 457 | 460 |
} |
| 458 |
- |
|
| 459 |
- # Filters |
|
| 460 |
- my $filter = {};
|
|
| 461 |
+ |
|
| 462 |
+ # Applied filter |
|
| 463 |
+ my $applied_filter = {};
|
|
| 461 | 464 |
foreach my $table (@$tables) {
|
| 462 |
- next unless $table; |
|
| 463 |
- $filter = {
|
|
| 464 |
- %$filter, |
|
| 465 |
+ $applied_filter = {
|
|
| 466 |
+ %$applied_filter, |
|
| 465 | 467 |
%{$self->{filter}{out}->{$table} || {}}
|
| 466 | 468 |
} |
| 467 | 469 |
} |
| 470 |
+ $filter = {%$applied_filter, %$filter};
|
|
| 468 | 471 |
|
| 469 |
- # Filter argument |
|
| 470 |
- my $f = DBIx::Custom::Util::array_to_hash($args{filter})
|
|
| 471 |
- || $query->filter || {};
|
|
| 472 |
- foreach my $column (keys %$f) {
|
|
| 473 |
- my $fname = $f->{$column};
|
|
| 474 |
- if (!defined $fname) {
|
|
| 475 |
- $f->{$column} = undef;
|
|
| 472 |
+ # Replace filter name to code |
|
| 473 |
+ foreach my $column (keys %$filter) {
|
|
| 474 |
+ my $name = $filter->{$column};
|
|
| 475 |
+ if (!defined $name) {
|
|
| 476 |
+ $filter->{$column} = undef;
|
|
| 476 | 477 |
} |
| 477 |
- elsif (ref $fname ne 'CODE') {
|
|
| 478 |
- croak qq{Filter "$fname" is not registered"}
|
|
| 479 |
- unless exists $self->filters->{$fname};
|
|
| 480 |
- |
|
| 481 |
- $f->{$column} = $self->filters->{$fname};
|
|
| 478 |
+ elsif (ref $name ne 'CODE') {
|
|
| 479 |
+ croak qq{Filter "$name" is not registered"}
|
|
| 480 |
+ unless exists $self->filters->{$name};
|
|
| 481 |
+ $filter->{$column} = $self->filters->{$name};
|
|
| 482 | 482 |
} |
| 483 | 483 |
} |
| 484 |
- $filter = {%$filter, %$f};
|
|
| 485 | 484 |
|
| 486 |
- # Type |
|
| 487 |
- my $type = DBIx::Custom::Util::array_to_hash($args{type});
|
|
| 488 |
- |
|
| 489 |
- # Bind |
|
| 490 |
- my $bind = $self->_bind($params, $query->columns, $filter, $type); |
|
| 485 |
+ # Create bind values |
|
| 486 |
+ my $bind = $self->_create_bind_values( |
|
| 487 |
+ $param, |
|
| 488 |
+ $query->columns, |
|
| 489 |
+ $filter, |
|
| 490 |
+ $type |
|
| 491 |
+ ); |
|
| 491 | 492 |
|
| 492 | 493 |
# Execute |
| 493 | 494 |
my $sth = $query->sth; |
| 494 | 495 |
my $affected; |
| 495 | 496 |
eval {
|
| 496 | 497 |
for (my $i = 0; $i < @$bind; $i++) {
|
| 497 |
- if (my $type = $bind->[$i]->{type}) {
|
|
| 498 |
- $sth->bind_param($i + 1, $bind->[$i]->{value}, $type);
|
|
| 499 |
- } |
|
| 500 |
- else {
|
|
| 501 |
- $sth->bind_param($i + 1, $bind->[$i]->{value});
|
|
| 502 |
- } |
|
| 498 |
+ my $type = $bind->[$i]->{type};
|
|
| 499 |
+ $sth->bind_param($i + 1, $bind->[$i]->{value}, $type ? $type : ());
|
|
| 503 | 500 |
} |
| 504 | 501 |
$affected = $sth->execute; |
| 505 | 502 |
}; |
| 506 | 503 |
$self->_croak($@, qq{. Following SQL is executed. "$query->{sql}"}) if $@;
|
| 507 | 504 |
|
| 508 |
- # Return resultset if select statement is executed |
|
| 505 |
+ # Select statement |
|
| 509 | 506 |
if ($sth->{NUM_OF_FIELDS}) {
|
| 510 | 507 |
|
| 511 |
- # Result in and end filter |
|
| 512 |
- my $in_filter = {};
|
|
| 513 |
- my $end_filter = {};
|
|
| 508 |
+ # Filter |
|
| 509 |
+ my $filter = {};
|
|
| 510 |
+ $filter->{in} = {};
|
|
| 511 |
+ $filter->{end} = {};
|
|
| 514 | 512 |
foreach my $table (@$tables) {
|
| 515 |
- next unless $table; |
|
| 516 |
- $in_filter = {
|
|
| 517 |
- %$in_filter, |
|
| 518 |
- %{$self->{filter}{in}{$table} || {}}
|
|
| 519 |
- }; |
|
| 520 |
- $end_filter = {
|
|
| 521 |
- %$end_filter, |
|
| 522 |
- %{$self->{filter}{end}{$table} || {}}
|
|
| 523 |
- }; |
|
| 513 |
+ foreach my $way (qw/in end/) {
|
|
| 514 |
+ $filter->{$way} = {
|
|
| 515 |
+ %{$filter->{$way}},
|
|
| 516 |
+ %{$self->{filter}{$way}{$table} || {}}
|
|
| 517 |
+ }; |
|
| 518 |
+ } |
|
| 524 | 519 |
} |
| 525 | 520 |
|
| 526 | 521 |
# Result |
| ... | ... |
@@ -529,13 +524,15 @@ sub execute {
|
| 529 | 524 |
filters => $self->filters, |
| 530 | 525 |
filter_check => $self->filter_check, |
| 531 | 526 |
default_filter => $self->{default_in_filter},
|
| 532 |
- filter => $in_filter || {},
|
|
| 533 |
- end_filter => $end_filter || {}
|
|
| 527 |
+ filter => $filter->{in} || {},
|
|
| 528 |
+ end_filter => $filter->{end} || {}
|
|
| 534 | 529 |
); |
| 535 | 530 |
|
| 536 | 531 |
return $result; |
| 537 | 532 |
} |
| 538 |
- return $affected; |
|
| 533 |
+ |
|
| 534 |
+ # Not select statement |
|
| 535 |
+ else { return $affected }
|
|
| 539 | 536 |
} |
| 540 | 537 |
|
| 541 | 538 |
our %INSERT_ARGS = map { $_ => 1 } @COMMON_ARGS, qw/param append/;
|
| ... | ... |
@@ -1181,7 +1178,7 @@ sub where {
|
| 1181 | 1178 |
); |
| 1182 | 1179 |
} |
| 1183 | 1180 |
|
| 1184 |
-sub _bind {
|
|
| 1181 |
+sub _create_bind_values {
|
|
| 1185 | 1182 |
my ($self, $params, $columns, $filter, $type) = @_; |
| 1186 | 1183 |
|
| 1187 | 1184 |
# bind values |