- EXPERIMENTAL update_or_insert need id and primary...
..._key option
... | ... |
@@ -1,4 +1,6 @@ |
1 | 1 |
0.1740 |
2 |
+ - EXPERIMENTAL update_or_insert need id and primary_key option |
|
3 |
+ and added option option |
|
2 | 4 |
- insert method created_at and updated_at option can receive scalar reference |
3 | 5 |
- update method updated_at option can receive scalar reference |
4 | 6 |
- select column option [COLUMN => ALIAS] syntax is DEPRECATED! |
... | ... |
@@ -1158,41 +1158,13 @@ sub update { |
1158 | 1158 |
sub update_all { shift->update(allow_update_all => 1, @_) }; |
1159 | 1159 |
|
1160 | 1160 |
sub update_or_insert { |
1161 |
- my $self = shift; |
|
1162 |
- |
|
1163 |
- # Options |
|
1164 |
- my $param = shift; |
|
1165 |
- my %opt = @_; |
|
1166 |
- my $id = $opt{id}; |
|
1167 |
- my $primary_key = $opt{primary_key}; |
|
1168 |
- $primary_key = [$primary_key] unless ref $primary_key eq 'ARRAY'; |
|
1169 |
- croak "update_or_insert method need primary_key option " . |
|
1170 |
- "when id is specified" . _subname |
|
1171 |
- if defined $id && !defined $primary_key; |
|
1172 |
- my $table = $opt{table}; |
|
1173 |
- croak qq{"table" option must be specified } . _subname |
|
1174 |
- unless defined $table; |
|
1175 |
- my $select_option = $opt{select_option}; |
|
1176 |
- my $reuse = $opt{reuse}; |
|
1177 |
- $opt{select_option}->{reuse} = $opt{reuse} if $opt{reuse}; |
|
1178 |
- |
|
1179 |
- my $rows = $self->select(table => $table, id => $id, |
|
1180 |
- primary_key => $primary_key, %$select_option)->all; |
|
1181 |
- |
|
1182 |
- croak "selected row count must be one or zero" . _subname |
|
1183 |
- if @$rows > 1; |
|
1184 |
- |
|
1185 |
- my $row = $rows->[0]; |
|
1186 |
- my @opt = (table => $table); |
|
1187 |
- push @opt, id => $id, primary_key => $primary_key if defined $id; |
|
1188 |
- push @opt, %opt; |
|
1189 |
- |
|
1190 |
- if ($row) { |
|
1191 |
- return $self->update($param, @opt); |
|
1192 |
- } |
|
1193 |
- else { |
|
1194 |
- return $self->insert($param, @opt); |
|
1195 |
- } |
|
1161 |
+ my ($self, $param, %opt) = @_; |
|
1162 |
+ croak "update_or_insert method need primary_key and id option " |
|
1163 |
+ unless defined $opt{id} && defined $opt{primary_key}; |
|
1164 |
+ my $statement_opt = $opt{option} || {}; |
|
1165 |
+ my $row = $self->select(%opt, %{$statement_opt->{select} || {}})->one; |
|
1166 |
+ return $row ? $self->update($param, %opt, %{$statement_opt->{update} || {}}) |
|
1167 |
+ : $self->insert($param, %opt, %{$statement_opt->{insert} || {}}); |
|
1196 | 1168 |
} |
1197 | 1169 |
|
1198 | 1170 |
sub update_timestamp { |
... | ... |
@@ -3319,34 +3291,48 @@ Options is same as C<update> method. |
3319 | 3291 |
|
3320 | 3292 |
=head2 C<update_or_insert EXPERIMENTAL> |
3321 | 3293 |
|
3322 |
- # Where |
|
3323 |
- $dbi->update_or_insert( |
|
3324 |
- {id => 1, title => 'Perl'}, |
|
3325 |
- table => 'book', |
|
3326 |
- where => {id => 1}, |
|
3327 |
- select_option => {append => 'for update'} |
|
3328 |
- ); |
|
3329 |
- |
|
3330 | 3294 |
# ID |
3331 | 3295 |
$dbi->update_or_insert( |
3332 | 3296 |
{title => 'Perl'}, |
3333 | 3297 |
table => 'book', |
3334 | 3298 |
id => 1, |
3335 | 3299 |
primary_key => 'id', |
3336 |
- select_option => {append => 'for update'} |
|
3300 |
+ option => { |
|
3301 |
+ select => { |
|
3302 |
+ append => 'for update' |
|
3303 |
+ } |
|
3304 |
+ } |
|
3337 | 3305 |
); |
3338 |
- |
|
3306 |
+ |
|
3339 | 3307 |
Update or insert. |
3340 | 3308 |
|
3341 |
-In both examples, the following SQL is executed. |
|
3309 |
+C<update_or_insert> method execute C<select> method first to find row. |
|
3310 |
+If the row is exists, C<update> is executed. |
|
3311 |
+If not, C<insert> is executed. |
|
3342 | 3312 |
|
3343 |
- # In case insert |
|
3344 |
- insert into book (id, title) values (?, ?) |
|
3345 |
- |
|
3346 |
- # In case update |
|
3347 |
- update book set (id = ?, title = ?) where book.id = ? |
|
3313 |
+C<OPTIONS> |
|
3314 |
+ |
|
3315 |
+C<update_or_insert> method use all common option |
|
3316 |
+in C<select>, C<update>, C<delete>, and has the following new ones. |
|
3317 |
+ |
|
3318 |
+=over 4 |
|
3319 |
+ |
|
3320 |
+=item C<option> |
|
3321 |
+ |
|
3322 |
+ option => { |
|
3323 |
+ select => { |
|
3324 |
+ append => '...' |
|
3325 |
+ }, |
|
3326 |
+ insert => { |
|
3327 |
+ prefix => '...' |
|
3328 |
+ }, |
|
3329 |
+ update => { |
|
3330 |
+ filter => {} |
|
3331 |
+ } |
|
3332 |
+ } |
|
3348 | 3333 |
|
3349 |
-The following opitons are available adding to C<update> option. |
|
3334 |
+If you want to pass option to each method, |
|
3335 |
+you can use C<option> option. |
|
3350 | 3336 |
|
3351 | 3337 |
=over 4 |
3352 | 3338 |
|
... | ... |
@@ -616,6 +616,7 @@ is($row->{$key2}, $row->{$key3}); |
616 | 616 |
test 'update_or_insert'; |
617 | 617 |
eval { $dbi->execute("drop table $table1") }; |
618 | 618 |
$dbi->execute($create_table1); |
619 |
+$DB::single = 1; |
|
619 | 620 |
$dbi->update_or_insert( |
620 | 621 |
{$key2 => 2}, |
621 | 622 |
table => $table1, |
... | ... |
@@ -634,15 +635,14 @@ $dbi->update_or_insert( |
634 | 635 |
$rows = $dbi->select(id => 1, table => $table1, primary_key => $key1)->all; |
635 | 636 |
is_deeply($rows, [{$key1 => 1, $key2 => 3}], "basic"); |
636 | 637 |
|
637 |
-eval { $dbi->execute("drop table $table1") }; |
|
638 |
-$dbi->execute($create_table1); |
|
639 |
-$dbi->update_or_insert( |
|
640 |
- {$key1 => 1, $key2 => 2}, |
|
641 |
- table => $table1, |
|
642 |
- where => {$key1 => 1} |
|
643 |
-); |
|
644 |
-$row = $dbi->select(id => 1, table => $table1, primary_key => $key1)->one; |
|
645 |
-is_deeply($row, {$key1 => 1, $key2 => 2}, "basic"); |
|
638 |
+eval { |
|
639 |
+ $dbi->update_or_insert( |
|
640 |
+ {$key2 => 3}, |
|
641 |
+ table => $table1, |
|
642 |
+ ); |
|
643 |
+}; |
|
644 |
+ |
|
645 |
+like($@, qr/primary_key/); |
|
646 | 646 |
|
647 | 647 |
test 'default_bind_filter'; |
648 | 648 |
$dbi->execute("delete from $table1"); |
... | ... |
@@ -47,16 +47,37 @@ $dbi->do('create table table1 (key1 varchar(255), key2 varchar(255)) engine=Inno |
47 | 47 |
|
48 | 48 |
test 'update_or_insert'; |
49 | 49 |
$dbi->delete_all(table => 'table1'); |
50 |
+$ENV{DBIX_CUSTOM_DEBUG} = 1; |
|
50 | 51 |
$dbi->update_or_insert( |
51 |
- {key1 => 1, key2 => 2}, |
|
52 |
+ {key2 => 2}, |
|
52 | 53 |
table => 'table1', |
53 |
- where => {key1 => 1}, |
|
54 |
- select_option => {append => 'for update'} |
|
54 |
+ id => 1, |
|
55 |
+ primary_key => 'key1', |
|
56 |
+ option => { |
|
57 |
+ select => {append => 'for update'}, |
|
58 |
+ insert => {append => ' #'}, |
|
59 |
+ update => {append => ' #'} |
|
60 |
+ } |
|
55 | 61 |
); |
56 | 62 |
|
57 | 63 |
my $row = $dbi->select(id => 1, table => 'table1', primary_key => 'key1')->one; |
58 | 64 |
is_deeply($row, {key1 => 1, key2 => 2}, "basic"); |
59 | 65 |
|
66 |
+$dbi->update_or_insert( |
|
67 |
+ {key2 => 3}, |
|
68 |
+ table => 'table1', |
|
69 |
+ id => 1, |
|
70 |
+ primary_key => 'key1', |
|
71 |
+ option => { |
|
72 |
+ select => {append => 'for update'}, |
|
73 |
+ insert => {append => ' #'}, |
|
74 |
+ update => {append => ' #'} |
|
75 |
+ } |
|
76 |
+); |
|
77 |
+ |
|
78 |
+my $row = $dbi->select(id => 1, table => 'table1', primary_key => 'key1')->one; |
|
79 |
+is_deeply($row, {key1 => 1, key2 => 3}, "basic"); |
|
80 |
+ |
|
60 | 81 |
# Test memory leaks |
61 | 82 |
for (1 .. 200) { |
62 | 83 |
$dbi = DBIx::Custom->connect( |