... | ... |
@@ -361,7 +361,8 @@ sub execute { |
361 | 361 |
$param ||= $opt{param} || {}; |
362 | 362 |
my $tables = $opt{table} || []; |
363 | 363 |
$tables = [$tables] unless ref $tables eq 'ARRAY'; |
364 |
- my $filter = _array_to_hash($opt{filter}); |
|
364 |
+ my $filter = ref $opt{filter} eq 'ARRAY' ? |
|
365 |
+ _array_to_hash($opt{filter}) : $opt{filter}; |
|
365 | 366 |
|
366 | 367 |
# Append |
367 | 368 |
$sql .= $opt{append} if defined $opt{append} && !ref $sql; |
... | ... |
@@ -377,7 +378,7 @@ sub execute { |
377 | 378 |
} |
378 | 379 |
|
379 | 380 |
# Save query |
380 |
- $self->last_sql($query->sql); |
|
381 |
+ $self->{last_sql} = $query->{sql}; |
|
381 | 382 |
|
382 | 383 |
# Return query |
383 | 384 |
return $query if $opt{query}; |
... | ... |
@@ -401,24 +402,26 @@ sub execute { |
401 | 402 |
|
402 | 403 |
# Type rule |
403 | 404 |
my $type_filters = {}; |
404 |
- unless ($opt{type_rule_off}) { |
|
405 |
- my $type_rule_off_parts = { |
|
406 |
- 1 => $opt{type_rule1_off}, |
|
407 |
- 2 => $opt{type_rule2_off} |
|
408 |
- }; |
|
409 |
- for my $i (1, 2) { |
|
410 |
- unless ($type_rule_off_parts->{$i}) { |
|
411 |
- $type_filters->{$i} = {}; |
|
412 |
- my $table_alias = $opt{table_alias} || {}; |
|
413 |
- for my $alias (keys %$table_alias) { |
|
414 |
- my $table = $table_alias->{$alias}; |
|
415 |
- |
|
416 |
- for my $column (keys %{$self->{"_into$i"}{key}{$table} || {}}) { |
|
417 |
- $type_filters->{$i}->{"$alias.$column"} = $self->{"_into$i"}{key}{$table}{$column}; |
|
405 |
+ if ($self->{_type_rule_is_called}) { |
|
406 |
+ unless ($opt{type_rule_off}) { |
|
407 |
+ my $type_rule_off_parts = { |
|
408 |
+ 1 => $opt{type_rule1_off}, |
|
409 |
+ 2 => $opt{type_rule2_off} |
|
410 |
+ }; |
|
411 |
+ for my $i (1, 2) { |
|
412 |
+ unless ($type_rule_off_parts->{$i}) { |
|
413 |
+ $type_filters->{$i} = {}; |
|
414 |
+ my $table_alias = $opt{table_alias} || {}; |
|
415 |
+ for my $alias (keys %$table_alias) { |
|
416 |
+ my $table = $table_alias->{$alias}; |
|
417 |
+ |
|
418 |
+ for my $column (keys %{$self->{"_into$i"}{key}{$table} || {}}) { |
|
419 |
+ $type_filters->{$i}->{"$alias.$column"} = $self->{"_into$i"}{key}{$table}{$column}; |
|
420 |
+ } |
|
418 | 421 |
} |
422 |
+ $type_filters->{$i} = {%{$type_filters->{$i}}, %{$self->{"_into$i"}{key}{$main_table} || {}}} |
|
423 |
+ if $main_table; |
|
419 | 424 |
} |
420 |
- $type_filters->{$i} = {%{$type_filters->{$i}}, %{$self->{"_into$i"}{key}{$main_table} || {}}} |
|
421 |
- if $main_table; |
|
422 | 425 |
} |
423 | 426 |
} |
424 | 427 |
} |
... | ... |
@@ -449,17 +452,22 @@ sub execute { |
449 | 452 |
} |
450 | 453 |
|
451 | 454 |
# Create bind values |
452 |
- my $bind = $self->_create_bind_values($param, $query->columns, |
|
453 |
- $filter, $type_filters, _array_to_hash($opt{bind_type} || $opt{type})); |
|
455 |
+ my ($bind, $bind_types) = $self->_create_bind_values($param, $query->columns, |
|
456 |
+ $filter, $type_filters, $opt{bind_type} || $opt{type} || {}); |
|
454 | 457 |
|
455 | 458 |
# Execute |
456 |
- my $sth = $query->sth; |
|
459 |
+ my $sth = $query->{sth}; |
|
457 | 460 |
my $affected; |
458 | 461 |
eval { |
459 |
- $sth->bind_param($_ + 1, $bind->[$_]->{value}, |
|
460 |
- $bind->[$_]->{bind_type} ? $bind->[$_]->{bind_type} : ()) |
|
461 |
- for (0 .. @$bind - 1); |
|
462 |
- $affected = $sth->execute; |
|
462 |
+ if ($opt{bind_type} || $opt{type}) { |
|
463 |
+ $sth->bind_param($_ + 1, $bind->[$_], |
|
464 |
+ $bind_types->[$_] ? $bind_types->[$_] : ()) |
|
465 |
+ for (0 .. @$bind - 1); |
|
466 |
+ $affected = $sth->execute; |
|
467 |
+ } |
|
468 |
+ else { |
|
469 |
+ $affected = $sth->execute(@$bind); |
|
470 |
+ } |
|
463 | 471 |
}; |
464 | 472 |
|
465 | 473 |
$self->_croak($@, qq{. Following SQL is executed.\n} |
... | ... |
@@ -479,39 +487,36 @@ sub execute { |
479 | 487 |
print STDERR "Bind values: " . join(', ', @output) . "\n\n"; |
480 | 488 |
} |
481 | 489 |
|
482 |
- # Select statement |
|
483 |
- if ($sth->{NUM_OF_FIELDS}) { |
|
484 |
- |
|
485 |
- # Filter(DEPRECATED!) |
|
486 |
- my $filter = {}; |
|
487 |
- if ($self->{filter}{on}) { |
|
488 |
- $filter->{in} = {}; |
|
489 |
- $filter->{end} = {}; |
|
490 |
- push @$tables, $main_table if $main_table; |
|
491 |
- for my $table (@$tables) { |
|
492 |
- for my $way (qw/in end/) { |
|
493 |
- $filter->{$way} = {%{$filter->{$way}}, |
|
494 |
- %{$self->{filter}{$way}{$table} || {}}}; |
|
495 |
- } |
|
490 |
+ # Not select statement |
|
491 |
+ return $affected unless $sth->{NUM_OF_FIELDS}; |
|
492 |
+ |
|
493 |
+ # Filter(DEPRECATED!) |
|
494 |
+ my $infilter = {}; |
|
495 |
+ if ($self->{filter}{on}) { |
|
496 |
+ $infilter->{in} = {}; |
|
497 |
+ $infilter->{end} = {}; |
|
498 |
+ push @$tables, $main_table if $main_table; |
|
499 |
+ for my $table (@$tables) { |
|
500 |
+ for my $way (qw/in end/) { |
|
501 |
+ $infilter->{$way} = {%{$infilter->{$way}}, |
|
502 |
+ %{$self->{filter}{$way}{$table} || {}}}; |
|
496 | 503 |
} |
497 | 504 |
} |
498 |
- |
|
499 |
- # Result |
|
500 |
- my $result = $self->result_class->new( |
|
501 |
- sth => $sth, |
|
502 |
- dbi => $self, |
|
503 |
- default_filter => $self->{default_in_filter}, |
|
504 |
- filter => $filter->{in} || {}, |
|
505 |
- end_filter => $filter->{end} || {}, |
|
506 |
- type_rule => { |
|
507 |
- from1 => $self->type_rule->{from1}, |
|
508 |
- from2 => $self->type_rule->{from2} |
|
509 |
- }, |
|
510 |
- ); |
|
511 |
- return $result; |
|
512 | 505 |
} |
513 |
- # Not select statement |
|
514 |
- else { return $affected } |
|
506 |
+ |
|
507 |
+ # Result |
|
508 |
+ my $result = $self->result_class->new( |
|
509 |
+ sth => $sth, |
|
510 |
+ dbi => $self, |
|
511 |
+ default_filter => $self->{default_in_filter}, |
|
512 |
+ filter => $infilter->{in} || {}, |
|
513 |
+ end_filter => $infilter->{end} || {}, |
|
514 |
+ type_rule => { |
|
515 |
+ from1 => $self->type_rule->{from1}, |
|
516 |
+ from2 => $self->type_rule->{from2} |
|
517 |
+ }, |
|
518 |
+ ); |
|
519 |
+ $result; |
|
515 | 520 |
} |
516 | 521 |
|
517 | 522 |
sub get_table_info { |
... | ... |
@@ -918,6 +923,8 @@ sub show_tables { |
918 | 923 |
|
919 | 924 |
sub type_rule { |
920 | 925 |
my $self = shift; |
926 |
+ |
|
927 |
+ $self->{_type_rule_is_called} = 1; |
|
921 | 928 |
|
922 | 929 |
if (@_) { |
923 | 930 |
my $type_rule = ref $_[0] eq 'HASH' ? $_[0] : {@_}; |
... | ... |
@@ -1185,8 +1192,11 @@ sub _create_query { |
1185 | 1192 |
sub _create_bind_values { |
1186 | 1193 |
my ($self, $params, $columns, $filter, $type_filters, $bind_type) = @_; |
1187 | 1194 |
|
1195 |
+ $bind_type = _array_to_hash($bind_type) if ref $bind_type eq 'ARRAY'; |
|
1196 |
+ |
|
1188 | 1197 |
# Create bind values |
1189 | 1198 |
my $bind = []; |
1199 |
+ my $types = []; |
|
1190 | 1200 |
my $count = {}; |
1191 | 1201 |
my $not_exists = {}; |
1192 | 1202 |
for my $column (@$columns) { |
... | ... |
@@ -1224,13 +1234,14 @@ sub _create_bind_values { |
1224 | 1234 |
$value = $tf2->($value) if $tf2; |
1225 | 1235 |
|
1226 | 1236 |
# Bind values |
1227 |
- push @$bind, {value => $value, bind_type => $bind_type->{$column}}; |
|
1237 |
+ push @$bind, $value; |
|
1238 |
+ push @$types, $bind_type->{$column}; |
|
1228 | 1239 |
|
1229 | 1240 |
# Count up |
1230 | 1241 |
$count->{$column}++; |
1231 | 1242 |
} |
1232 | 1243 |
|
1233 |
- return $bind; |
|
1244 |
+ return ($bind, $types); |
|
1234 | 1245 |
} |
1235 | 1246 |
|
1236 | 1247 |
sub _id_to_param { |
... | ... |
@@ -162,6 +162,18 @@ $result = $dbi->execute('select length(key1) as key1_length from table1'); |
162 | 162 |
$row = $result->one; |
163 | 163 |
is($row->{key1_length}, length $binary); |
164 | 164 |
|
165 |
+test 'bind_type option'; # DEPRECATED! |
|
166 |
+$binary = pack("I3", 1, 2, 3); |
|
167 |
+eval { $dbi->execute('drop table table1') }; |
|
168 |
+$dbi->execute('create table table1(key1, key2)'); |
|
169 |
+$dbi->insert({key1 => $binary, key2 => 'あ'}, table => 'table1', bind_type => [key1 => DBI::SQL_BLOB]); |
|
170 |
+$result = $dbi->select(table => 'table1'); |
|
171 |
+$row = $result->one; |
|
172 |
+is_deeply($row, {key1 => $binary, key2 => 'あ'}, "basic"); |
|
173 |
+$result = $dbi->execute('select length(key1) as key1_length from table1'); |
|
174 |
+$row = $result->one; |
|
175 |
+is($row->{key1_length}, length $binary); |
|
176 |
+ |
|
165 | 177 |
test 'type_rule from'; |
166 | 178 |
$dbi = DBIx::Custom->connect; |
167 | 179 |
$dbi->type_rule( |