... | ... |
@@ -1,4 +1,7 @@ |
1 | 1 |
0.1738 |
2 |
+ - removed example that query pass execute method in documentation |
|
3 |
+ this is many bug reason much more than I have expected |
|
4 |
+ and passing query to execute method is DEPRECATED! |
|
2 | 5 |
- insert method id value is not copied to parameter |
3 | 6 |
if the key exists in parameter |
4 | 7 |
0.1737 |
... | ... |
@@ -361,12 +361,35 @@ sub execute { |
361 | 361 |
my $filter = ref $opt{filter} eq 'ARRAY' ? |
362 | 362 |
_array_to_hash($opt{filter}) : $opt{filter}; |
363 | 363 |
|
364 |
+ # Merge second parameter |
|
365 |
+ my @cleanup; |
|
366 |
+ if (ref $param eq 'ARRAY') { |
|
367 |
+ my $param2 = $param->[1]; |
|
368 |
+ $param = $param->[0]; |
|
369 |
+ for my $column (keys %$param2) { |
|
370 |
+ if (!exists $param->{$column}) { |
|
371 |
+ $param->{$column} = $param2->{$column}; |
|
372 |
+ push @cleanup, $column; |
|
373 |
+ } |
|
374 |
+ else { |
|
375 |
+ delete $param->{$_} for @cleanup; |
|
376 |
+ @cleanup = (); |
|
377 |
+ $param = $self->merge_param($param, $param2); |
|
378 |
+ last; |
|
379 |
+ } |
|
380 |
+ } |
|
381 |
+ } |
|
382 |
+ |
|
364 | 383 |
# Append |
365 | 384 |
$sql .= $opt{append} if defined $opt{append} && !ref $sql; |
366 | 385 |
|
367 | 386 |
# Query |
368 | 387 |
my $query; |
369 |
- if (ref $sql) { $query = $sql } |
|
388 |
+ if (ref $sql) { |
|
389 |
+ $query = $sql; |
|
390 |
+ warn "execute method receiving query object as first parameter is DEPRECATED!" . |
|
391 |
+ "because this is very buggy."; |
|
392 |
+ } |
|
370 | 393 |
else { |
371 | 394 |
$query = $opt{reuse}->{$sql} if $opt{reuse}; |
372 | 395 |
$query = $self->_create_query($sql,$opt{after_build_sql} || $opt{sqlfilter}) |
... | ... |
@@ -389,7 +412,6 @@ sub execute { |
389 | 412 |
my $main_table = @{$tables}[-1]; |
390 | 413 |
|
391 | 414 |
# Merge id to parameter |
392 |
- my @cleanup; |
|
393 | 415 |
if (defined $opt{id}) { |
394 | 416 |
croak "execute id option must be specified with primary_key option" |
395 | 417 |
unless $opt{primary_key}; |
... | ... |
@@ -402,7 +424,7 @@ sub execute { |
402 | 424 |
$statement eq 'delete' || $statement eq 'select'; |
403 | 425 |
next if exists $param->{$key}; |
404 | 426 |
$param->{$key} = $opt{id}->[$i]; |
405 |
- push @cleanup, $key; |
|
427 |
+ push @cleanup, $key;1 |
|
406 | 428 |
} |
407 | 429 |
} |
408 | 430 |
|
... | ... |
@@ -485,6 +507,7 @@ sub execute { |
485 | 507 |
|
486 | 508 |
# Remove id from parameter |
487 | 509 |
delete $param->{$_} for @cleanup; |
510 |
+ |
|
488 | 511 |
|
489 | 512 |
# DEBUG message |
490 | 513 |
if ($ENV{DBIX_CUSTOM_DEBUG}) { |
... | ... |
@@ -593,6 +616,7 @@ sub insert { |
593 | 616 |
|
594 | 617 |
# Merge id to parameter |
595 | 618 |
my @cleanup; |
619 |
+ my $id_param = {}; |
|
596 | 620 |
if (defined $opt{id}) { |
597 | 621 |
croak "insert id option must be specified with primary_key option" |
598 | 622 |
unless $opt{primary_key}; |
... | ... |
@@ -1051,9 +1075,6 @@ sub update { |
1051 | 1075 |
my $w = $self->_where_clause_and_param($opt{where}, $opt{where_param}, |
1052 | 1076 |
delete $opt{id}, $opt{primary_key}, $opt{table}); |
1053 | 1077 |
|
1054 |
- # Merge where parameter to parameter |
|
1055 |
- $param = $self->merge_param($param, $w->{param}) if keys %{$w->{param}}; |
|
1056 |
- |
|
1057 | 1078 |
# Update statement |
1058 | 1079 |
my $sql = "update "; |
1059 | 1080 |
$sql .= "$opt{prefix} " if defined $opt{prefix}; |
... | ... |
@@ -1061,7 +1082,7 @@ sub update { |
1061 | 1082 |
|
1062 | 1083 |
# Execute query |
1063 | 1084 |
$opt{statement} = 'update'; |
1064 |
- $self->execute($sql, $param, %opt); |
|
1085 |
+ $self->execute($sql, [$param, $w->{param}], %opt); |
|
1065 | 1086 |
} |
1066 | 1087 |
|
1067 | 1088 |
sub update_all { shift->update(allow_update_all => 1, @_) }; |
... | ... |
@@ -2580,38 +2601,12 @@ The above is same as the followin one. |
2580 | 2601 |
query => 1 |
2581 | 2602 |
|
2582 | 2603 |
C<execute> method return L<DBIx::Custom::Query> object, not executing SQL. |
2583 |
-You can check SQL or get statment handle. |
|
2604 |
+You can check SQL, column, or get statment handle. |
|
2584 | 2605 |
|
2585 | 2606 |
my $sql = $query->sql; |
2586 | 2607 |
my $sth = $query->sth; |
2587 | 2608 |
my $columns = $query->columns; |
2588 | 2609 |
|
2589 |
-If you want to execute SQL fast, you can do the following way. |
|
2590 |
- |
|
2591 |
- my $query; |
|
2592 |
- for my $row (@$rows) { |
|
2593 |
- $query ||= $dbi->insert($row, table => 'table1', query => 1); |
|
2594 |
- $dbi->execute($query, $row); |
|
2595 |
- } |
|
2596 |
- |
|
2597 |
-Statement handle is reused and SQL parsing is finished, |
|
2598 |
-so you can get more performance than normal way. |
|
2599 |
- |
|
2600 |
-If you want to execute SQL as possible as fast and don't need filtering. |
|
2601 |
-You can do the following way. |
|
2602 |
- |
|
2603 |
- my $query; |
|
2604 |
- my $sth; |
|
2605 |
- for my $row (@$rows) { |
|
2606 |
- $query ||= $dbi->insert($row, table => 'book', query => 1); |
|
2607 |
- $sth ||= $query->sth; |
|
2608 |
- $sth->execute(map { $row->{$_} } sort keys %$row); |
|
2609 |
- } |
|
2610 |
- |
|
2611 |
-Note that $row must be simple hash reference, such as |
|
2612 |
-{title => 'Perl', author => 'Ken'}. |
|
2613 |
-and don't forget to sort $row values by $row key asc order. |
|
2614 |
- |
|
2615 | 2610 |
=item C<primary_key> |
2616 | 2611 |
|
2617 | 2612 |
primary_key => 'id' |
... | ... |
@@ -3456,6 +3451,8 @@ L<DBIx::Custom> |
3456 | 3451 |
execute method's sqlfilter option # will be removed at 2017/1/1 |
3457 | 3452 |
|
3458 | 3453 |
# Others |
3454 |
+ execute($query, ...) # execute method receiving query object. |
|
3455 |
+ # this is removed at 2017/1/1 |
|
3459 | 3456 |
execute("select * from {= title}"); # execute method's |
3460 | 3457 |
# tag parsing functionality |
3461 | 3458 |
# will be removed at 2017/1/1 |
... | ... |
@@ -767,6 +767,32 @@ $result = $dbi->execute("select * from $table1"); |
767 | 767 |
$rows = $result->all; |
768 | 768 |
is($rows->[0]->{$key1}, $rows->[0]->{$key2}); |
769 | 769 |
|
770 |
+eval { $dbi->execute("drop table $table1") }; |
|
771 |
+$dbi->execute($create_table1_2); |
|
772 |
+$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3, $key4 => 4, $key5 => 5}); |
|
773 |
+$dbi->insert(table => $table1, param => {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10}); |
|
774 |
+$param = {$key2 => 11}; |
|
775 |
+$dbi->update($param, table => $table1, where => {$key1 => 1}); |
|
776 |
+is_deeply($param, {$key2 => 11}); |
|
777 |
+$result = $dbi->execute("select * from $table1 order by $key1"); |
|
778 |
+$rows = $result->all; |
|
779 |
+is_deeply($rows, [{$key1 => 1, $key2 => 11, $key3 => 3, $key4 => 4, $key5 => 5}, |
|
780 |
+ {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10}], |
|
781 |
+ "basic"); |
|
782 |
+ |
|
783 |
+eval { $dbi->execute("drop table $table1") }; |
|
784 |
+$dbi->execute($create_table1_2); |
|
785 |
+$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3, $key4 => 4, $key5 => 5}); |
|
786 |
+$dbi->insert(table => $table1, param => {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10}); |
|
787 |
+$param = {$key2 => 11}; |
|
788 |
+$dbi->update($param, table => $table1, where => {$key2 => 2}); |
|
789 |
+is_deeply($param, {$key2 => 11}); |
|
790 |
+$result = $dbi->execute("select * from $table1 order by $key1"); |
|
791 |
+$rows = $result->all; |
|
792 |
+is_deeply($rows, [{$key1 => 1, $key2 => 11, $key3 => 3, $key4 => 4, $key5 => 5}, |
|
793 |
+ {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10}], |
|
794 |
+ "basic"); |
|
795 |
+ |
|
770 | 796 |
test 'update_all'; |
771 | 797 |
eval { $dbi->execute("drop table $table1") }; |
772 | 798 |
$dbi->execute($create_table1_2); |