Showing 3 changed files with 52 additions and 18 deletions
+1
Changes
... ...
@@ -1,4 +1,5 @@
1 1
 0.1639
2
+  improved delete() and update() where option. you can use DBIx::Custom::Where object
2 3
   added experimental not_exists()
3 4
 0.1638
4 5
   table object call dbi object method if not found method.
+22 -18
lib/DBIx/Custom.pm
... ...
@@ -259,12 +259,15 @@ sub delete {
259 259
         push @$clause, "{= $_}" for keys %$where;
260 260
         $w = $self->where;
261 261
         $w->clause($clause);
262
+        $w->param($where);
262 263
     }
263 264
     else { $w = $where }
264 265
     
265 266
     croak qq{"where" must be hash refernce or DBIx::Custom::Where object}
266 267
       unless ref $w eq 'DBIx::Custom::Where';
267 268
     
269
+    $where = $w->param;
270
+    
268 271
     croak qq{"where" must be specified}
269 272
       if "$w" eq '' && !$allow_delete_all;
270 273
 
... ...
@@ -640,33 +643,34 @@ sub update {
640 643
     # Update keys
641 644
     my @update_keys = keys %$param;
642 645
     
643
-    # Where keys
644
-    my @where_keys = keys %$where;
645
-    
646
-    # Not exists where keys
647
-    croak qq{"where" argument must be specified and } .
648
-          qq{contains the pairs of column name and value}
649
-      if !@where_keys && !$allow_update_all;
650
-    
651 646
     # Update clause
652 647
     my $update_clause = '{update_param ' . join(' ', @update_keys) . '}';
648
+
649
+    # Where
650
+    my $w;
651
+    if (ref $where eq 'HASH') {
652
+        my $clause = ['and'];
653
+        push @$clause, "{= $_}" for keys %$where;
654
+        $w = $self->where;
655
+        $w->clause($clause);
656
+        $w->param($where);
657
+    }
658
+    else { $w = $where }
653 659
     
654
-    # Where clause
655
-    my $where_clause = '';
656
-    my $new_where = {};
660
+    croak qq{"where" must be hash refernce or DBIx::Custom::Where object}
661
+      unless ref $w eq 'DBIx::Custom::Where';
657 662
     
658
-    if (@where_keys) {
659
-        $where_clause = 'where ';
660
-        $where_clause .= "{= $_} and " for @where_keys;
661
-        $where_clause =~ s/ and $//;
662
-    }
663
+    $where = $w->param;
664
+    
665
+    croak qq{"where" must be specified}
666
+      if "$w" eq '' && !$allow_update_all;
663 667
     
664 668
     # Source of SQL
665
-    my $source = "update $table $update_clause $where_clause";
669
+    my $source = "update $table $update_clause $w";
666 670
     $source .= " $append" if $append;
667 671
     
668 672
     # Rearrange parameters
669
-    foreach my $wkey (@where_keys) {
673
+    foreach my $wkey (keys %$where) {
670 674
         
671 675
         if (exists $param->{$wkey}) {
672 676
             $param->{$wkey} = [$param->{$wkey}]
+29
t/dbix-custom-core-sqlite.t
... ...
@@ -280,6 +280,25 @@ like($@, qr/noexist/, "invalid argument");
280 280
 eval{$dbi->update(table => 'table1')};
281 281
 like($@, qr/where/, "not contain where");
282 282
 
283
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
284
+$dbi->execute($CREATE_TABLE->{0});
285
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
286
+$where = $dbi->where;
287
+$where->clause(['and', '{= key1}', '{= key2}']);
288
+$where->param({key1 => 1, key2 => 2});
289
+$dbi->update(table => 'table1', param => {key1 => 3}, where => $where);
290
+$result = $dbi->select(table => 'table1');
291
+is_deeply($result->fetch_hash_all, [{key1 => 3, key2 => 2}], 'delete() where');
292
+
293
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
294
+$dbi->execute($CREATE_TABLE->{0});
295
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
296
+$where = $dbi->where;
297
+$where->clause(['and', '{= key2}']);
298
+$where->param({key2 => 2});
299
+$dbi->update(table => 'table1', param => {key1 => 3}, where => $where);
300
+$result = $dbi->select(table => 'table1');
301
+is_deeply($result->fetch_hash_all, [{key1 => 3, key2 => 2}], 'delete() where');
283 302
 
284 303
 test 'update_all';
285 304
 $dbi = DBIx::Custom->connect($NEW_ARGS->{0});
... ...
@@ -326,6 +345,16 @@ is_deeply($rows, [{key1 => 3, key2 => 4}], "delete multi key");
326 345
 eval{$dbi->delete(table => 'table1', noexist => 1)};
327 346
 like($@, qr/noexist/, "invalid argument");
328 347
 
348
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
349
+$dbi->execute($CREATE_TABLE->{0});
350
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
351
+$dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4});
352
+$where = $dbi->where;
353
+$where->clause(['and', '{= key1}', '{= key2}']);
354
+$where->param({ke1 => 1, key2 => 2});
355
+$dbi->delete(table => 'table1', where => $where);
356
+$result = $dbi->select(table => 'table1');
357
+is_deeply($result->fetch_hash_all, [{key1 => 3, key2 => 4}], 'delete() where');
329 358
 
330 359
 test 'delete error';
331 360
 $dbi = DBIx::Custom->connect($NEW_ARGS->{0});