... | ... |
@@ -1,3 +1,7 @@ |
1 |
+0.1738 |
|
2 |
+ - insert method id value is not copied to parameter |
|
3 |
+ if the key exists in parameter |
|
4 |
+ |
|
1 | 5 |
0.1737 |
2 | 6 |
- micro optimization |
3 | 7 |
- fixed DEBUG messsage bug |
... | ... |
@@ -1,7 +1,7 @@ |
1 | 1 |
package DBIx::Custom; |
2 | 2 |
use Object::Simple -base; |
3 | 3 |
|
4 |
-our $VERSION = '0.1737'; |
|
4 |
+our $VERSION = '0.1738'; |
|
5 | 5 |
use 5.008001; |
6 | 6 |
|
7 | 7 |
use Carp 'croak'; |
... | ... |
@@ -252,6 +252,7 @@ sub delete { |
252 | 252 |
$sql .= "from " . $self->_q($opt{table}) . " $w->{clause} "; |
253 | 253 |
|
254 | 254 |
# Execute query |
255 |
+ $opt{statement} = 'delete'; |
|
255 | 256 |
$self->execute($sql, $w->{param}, %opt); |
256 | 257 |
} |
257 | 258 |
|
... | ... |
@@ -372,6 +373,7 @@ sub execute { |
372 | 373 |
$query = $opt{reuse}->{$sql} if $opt{reuse}; |
373 | 374 |
$query = $self->_create_query($sql,$opt{after_build_sql} || $opt{sqlfilter}) |
374 | 375 |
unless $query; |
376 |
+ $query->statement($opt{statement} || ''); |
|
375 | 377 |
$opt{reuse}->{$sql} = $query if $opt{reuse}; |
376 | 378 |
} |
377 | 379 |
|
... | ... |
@@ -387,13 +389,23 @@ sub execute { |
387 | 389 |
# Tables |
388 | 390 |
unshift @$tables, @{$query->{tables} || []}; |
389 | 391 |
my $main_table = @{$tables}[-1]; |
390 |
- |
|
391 |
- # Convert id to parameter |
|
392 |
+ |
|
393 |
+ # Merge id to parameter |
|
394 |
+ my @cleanup; |
|
392 | 395 |
if (defined $opt{id}) { |
393 |
- $opt{statement} ||= ''; |
|
394 |
- my $id_param = $self->_id_to_param($opt{id}, $opt{primary_key}, |
|
395 |
- $opt{statement} eq 'insert' ? undef : $main_table); |
|
396 |
- $param = $self->merge_param($id_param, $param); |
|
396 |
+ croak "execute id option must be specified with primary_key option" |
|
397 |
+ unless $opt{primary_key}; |
|
398 |
+ $opt{primary_key} = [$opt{primary_key}] unless ref $opt{primary_key}; |
|
399 |
+ $opt{id} = [$opt{id}] unless ref $opt{id}; |
|
400 |
+ my $statement = $query->statement; |
|
401 |
+ for (my $i = 0; $i < @{$opt{primary_key}}; $i++) { |
|
402 |
+ my $key = $opt{primary_key}->[$i]; |
|
403 |
+ $key = "$main_table.$key" if $statement eq 'update' || |
|
404 |
+ $statement eq 'delete' || $statement eq 'select'; |
|
405 |
+ next if exists $param->{$key}; |
|
406 |
+ $param->{$key} = $opt{id}->[$i]; |
|
407 |
+ push @cleanup, $key; |
|
408 |
+ } |
|
397 | 409 |
} |
398 | 410 |
|
399 | 411 |
# Cleanup tables(DEPRECATED!) |
... | ... |
@@ -472,6 +484,9 @@ sub execute { |
472 | 484 |
|
473 | 485 |
$self->_croak($@, qq{. Following SQL is executed.\n} |
474 | 486 |
. qq{$query->{sql}\n} . _subname) if $@; |
487 |
+ |
|
488 |
+ # Remove id from parameter |
|
489 |
+ delete $param->{$_} for @cleanup; |
|
475 | 490 |
|
476 | 491 |
# DEBUG message |
477 | 492 |
if ($ENV{DBIX_CUSTOM_DEBUG}) { |
... | ... |
@@ -579,15 +594,17 @@ sub insert { |
579 | 594 |
} |
580 | 595 |
|
581 | 596 |
# Merge id to parameter |
597 |
+ my @cleanup; |
|
582 | 598 |
if (defined $opt{id}) { |
583 |
- croak "insert primary_key option must be specified with id option" |
|
599 |
+ croak "insert id option must be specified with primary_key option" |
|
584 | 600 |
unless $opt{primary_key}; |
585 | 601 |
$opt{primary_key} = [$opt{primary_key}] unless ref $opt{primary_key}; |
586 | 602 |
$opt{id} = [$opt{id}] unless ref $opt{id}; |
587 | 603 |
for (my $i = 0; $i < @{$opt{primary_key}}; $i++) { |
588 | 604 |
my $key = $opt{primary_key}->[$i]; |
589 |
- croak "id already contain in parameter" if exists $param->{$key}; |
|
605 |
+ next if exists $param->{$key}; |
|
590 | 606 |
$param->{$key} = $opt{id}->[$i]; |
607 |
+ push @cleanup, $key; |
|
591 | 608 |
} |
592 | 609 |
} |
593 | 610 |
|
... | ... |
@@ -598,7 +615,7 @@ sub insert { |
598 | 615 |
. $self->values_clause($param, {wrap => $opt{wrap}}) . " "; |
599 | 616 |
|
600 | 617 |
# Remove id from parameter |
601 |
- if (defined $opt{id}) { delete $param->{$_} for @{$opt{primary_key}} } |
|
618 |
+ delete $param->{$_} for @cleanup; |
|
602 | 619 |
|
603 | 620 |
# Execute query |
604 | 621 |
$opt{statement} = 'insert'; |
... | ... |
@@ -879,6 +896,7 @@ sub select { |
879 | 896 |
if $opt{relation}; |
880 | 897 |
|
881 | 898 |
# Execute query |
899 |
+ $opt{statement} = 'select'; |
|
882 | 900 |
my $result = $self->execute($sql, $w->{param}, %opt); |
883 | 901 |
|
884 | 902 |
$result; |
... | ... |
@@ -1050,6 +1068,7 @@ sub update { |
1050 | 1068 |
$sql .= $self->_q($opt{table}) . " set $assign_clause $w->{clause} "; |
1051 | 1069 |
|
1052 | 1070 |
# Execute query |
1071 |
+ $opt{statement} = 'update'; |
|
1053 | 1072 |
$self->execute($sql, $param, %opt); |
1054 | 1073 |
} |
1055 | 1074 |
|
... | ... |
@@ -4,7 +4,7 @@ use Object::Simple -base; |
4 | 4 |
use Carp 'croak'; |
5 | 5 |
use DBIx::Custom::Util '_subname'; |
6 | 6 |
|
7 |
-has 'sth', |
|
7 |
+has [qw/sth statement/], |
|
8 | 8 |
sql => '', |
9 | 9 |
columns => sub { [] }; |
10 | 10 |
|
... | ... |
@@ -577,7 +577,6 @@ $dbi->update_or_insert( |
577 | 577 |
$row = $dbi->select(id => 1, table => $table1, primary_key => $key1)->one; |
578 | 578 |
is_deeply($row, {$key1 => 1, $key2 => 2}, "basic"); |
579 | 579 |
|
580 |
- |
|
581 | 580 |
test 'default_bind_filter'; |
582 | 581 |
$dbi->execute("delete from $table1"); |
583 | 582 |
$dbi->register_filter( |
... | ... |
@@ -2308,6 +2307,22 @@ is($dbi->select(table => $table1)->one->{$key1}, 1); |
2308 | 2307 |
is($dbi->select(table => $table1)->one->{$key2}, 2); |
2309 | 2308 |
is($dbi->select(table => $table1)->one->{$key3}, 3); |
2310 | 2309 |
|
2310 |
+$dbi = DBIx::Custom->connect; |
|
2311 |
+eval { $dbi->execute("drop table $table1") }; |
|
2312 |
+$dbi->execute($create_table1_2); |
|
2313 |
+$param = {$key3 => 3, $key2 => 4}; |
|
2314 |
+$DB::single = 1; |
|
2315 |
+$dbi->insert( |
|
2316 |
+ $param, |
|
2317 |
+ primary_key => [$key1, $key2], |
|
2318 |
+ table => $table1, |
|
2319 |
+ id => [1, 2], |
|
2320 |
+); |
|
2321 |
+is($dbi->select(table => $table1)->one->{$key1}, 1); |
|
2322 |
+is($dbi->select(table => $table1)->one->{$key2}, 4); |
|
2323 |
+is($dbi->select(table => $table1)->one->{$key3}, 3); |
|
2324 |
+is_deeply($param, {$key3 => 3, $key2 => 4}); |
|
2325 |
+ |
|
2311 | 2326 |
test 'model insert id and primary_key option'; |
2312 | 2327 |
$dbi = MyDBI6->connect; |
2313 | 2328 |
eval { $dbi->execute("drop table $table1") }; |