Showing 2 changed files with 163 additions and 20 deletions
+34 -19
lib/DBI/Custom.pm
... ...
@@ -235,10 +235,13 @@ sub execute {
235 235
     # Execute error
236 236
     if (my $execute_error = $@) {
237 237
         require Data::Dumper;
238
-        my $sql         = $query->{sql} || '';
239
-        my $params_dump = Data::Dumper->Dump([$params], ['*params']);
238
+        my $sql              = $query->{sql} || '';
239
+        my $key_infos_dump   = Data::Dumper->Dump([$query->key_infos], ['*key_infos']);
240
+        my $params_dump      = Data::Dumper->Dump([$params], ['*params']);
240 241
         
241
-        croak("$execute_error<Your SQL>\n$sql\n<Your parameters>\n$params_dump");
242
+        croak("$execute_error" . 
243
+              "<Your SQL>\n$sql\n" . 
244
+              "<Your parameters>\n$params_dump");
242 245
     }
243 246
     
244 247
     # Return resultset if select statement is executed
... ...
@@ -269,6 +272,7 @@ sub _build_bind_values {
269 272
     my @bind_values;
270 273
     
271 274
     # Create bind values
275
+    KEY_INFOS :
272 276
     foreach my $key_info (@$key_infos) {
273 277
         # Set variable
274 278
         my $access_keys  = $key_info->{access_keys};
... ...
@@ -333,6 +337,7 @@ sub _build_bind_values {
333 337
                     
334 338
                     # Key is found
335 339
                     $found = 1;
340
+                    next KEY_INFOS;
336 341
                 }
337 342
                 # First or middle key
338 343
                 else {
... ...
@@ -432,13 +437,14 @@ sub last_insert_id {
432 437
 # Insert
433 438
 sub insert {
434 439
     my ($self, $table, $insert_params, $query_edit_cb) = @_;
440
+    $table         ||= '';
435 441
     $insert_params ||= {};
436 442
     
437 443
     # Insert keys
438 444
     my @insert_keys = keys %$insert_params;
439 445
     
440 446
     # Not exists insert keys
441
-    croak("key-value pairs must be specified to 'insert' second argument")
447
+    croak("Key-value pairs for insert must be specified to 'insert' second argument")
442 448
       unless @insert_keys;
443 449
     
444 450
     # Templte for insert
... ...
@@ -460,36 +466,41 @@ sub insert {
460 466
     return $ret_val;
461 467
 }
462 468
 
469
+# Update
463 470
 sub update {
464 471
     my ($self, $table, $update_params,
465 472
         $where_params, $query_edit_cb, $options) = @_;
466 473
     
474
+    $table         ||= '';
467 475
     $update_params ||= {};
468 476
     $where_params  ||= {};
469 477
     
470 478
     # Update keys
471
-    my @update_keys = keys %$where_params;
479
+    my @update_keys = keys %$update_params;
472 480
     
473 481
     # Not exists update kyes
474
-    croak("Update key must be specified")
482
+    croak("Key-value pairs for update must be specified to 'update' second argument")
475 483
       unless @update_keys;
476 484
     
477 485
     # Where keys
478 486
     my @where_keys = keys %$where_params;
479 487
     
480 488
     # Not exists where keys
481
-    croak("Where key must be specified")
489
+    croak("Key-value pairs for where clause must be specified to 'update' third argument")
482 490
       if !@where_keys && !$options->{allow_update_all};
483 491
     
484 492
     # Update clause
485 493
     my $update_clause = '{update ' . join(' ', @update_keys) . '}';
486 494
     
487 495
     # Where clause
488
-    my $where_clause = 'where ';
489
-    foreach my $where_key (@where_keys) {
490
-        $where_clause .= "{= $where_key} && ";
496
+    my $where_clause = '';
497
+    if (@where_keys) {
498
+        $where_clause = 'where ';
499
+        foreach my $where_key (@where_keys) {
500
+            $where_clause .= "{= $where_key} && ";
501
+        }
502
+        $where_clause =~ s/ && $//;
491 503
     }
492
-    $where_clause =~ s/ && $//;
493 504
     
494 505
     # Template for update
495 506
     my $template = "update $table $update_clause $where_clause";
... ...
@@ -524,21 +535,25 @@ sub update_all {
524 535
 # Delete
525 536
 sub delete {
526 537
     my ($self, $table, $where_params, $query_edit_cb, $options) = @_;
538
+    $table        ||= '';
527 539
     $where_params ||= {};
528 540
     
529 541
     # Where keys
530 542
     my @where_keys = keys %$where_params;
531 543
     
532 544
     # Not exists where keys
533
-    croak("Where key must be specified")
534
-      if !@where_keys && !$options->{allow_update_all};
545
+    croak("Key-value pairs for where clause must be specified to 'delete' second argument")
546
+      if !@where_keys && !$options->{allow_delete_all};
535 547
     
536 548
     # Where clause
537
-    my $where_clause = 'where ';
538
-    foreach my $where_key (@where_keys) {
539
-        $where_clause .= "{= $where_key} && ";
549
+    my $where_clause = '';
550
+    if (@where_keys) {
551
+        $where_clause = 'where ';
552
+        foreach my $where_key (@where_keys) {
553
+            $where_clause .= "{= $where_key} && ";
554
+        }
555
+        $where_clause =~ s/ && $//;
540 556
     }
541
-    $where_clause =~ s/ && $//;
542 557
     
543 558
     # Template for delete
544 559
     my $template = "delete from $table $where_clause";
... ...
@@ -561,8 +576,8 @@ sub delete {
561 576
 
562 577
 # Delete all rows
563 578
 sub delete_all {
564
-    my ($self, $table, $query_edit_cb) = @_;
565
-    return $self->delete($table, {}, $query_edit_cb, {allow_delete_all => 1});
579
+    my ($self, $table) = @_;
580
+    return $self->delete($table, {}, undef, {allow_delete_all => 1});
566 581
 }
567 582
 
568 583
 sub _query_caches     : ClassAttr { type => 'hash',
+129 -1
t/02-sqlite.t
... ...
@@ -494,8 +494,136 @@ $result = $dbi->execute($SELECT_TMPL->{0});
494 494
 $rows   = $result->fetch_all_hash;
495 495
 is_deeply($rows, [{key1 => 3, key2 => 2}], "$test : edit_query_callback");
496 496
 
497
+
498
+test 'insert error';
497 499
 eval{$dbi->insert('table1')};
498
-like($@, qr/key-value pairs must be specified to 'insert' second argument/, "$test : insert key-value not specifed");
500
+like($@, qr/Key-value pairs for insert must be specified to 'insert' second argument/, "$test : insert key-value not specifed");
499 501
 
500 502
 eval{$dbi->insert('table1', {key1 => 1, key2 => 2}, 'aaa')};
501 503
 like($@, qr/Query edit callback must be code reference/, "$test : query edit callback not code ref");
504
+
505
+
506
+test 'update';
507
+$dbi = DBI::Custom->new($NEW_ARGS->{0});
508
+$dbi->do($CREATE_TABLE->{1});
509
+$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
510
+$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
511
+$dbi->update('table1', {key2 => 11}, {key1 => 1});
512
+$result = $dbi->execute($SELECT_TMPL->{0});
513
+$rows   = $result->fetch_all_hash;
514
+is_deeply($rows, [{key1 => 1, key2 => 11, key3 => 3, key4 => 4, key5 => 5},
515
+                  {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
516
+                  "$test : basic");
517
+                  
518
+$dbi->do("delete from table1");
519
+$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
520
+$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
521
+$dbi->update('table1', {key2 => 12}, {key2 => 2});
522
+$result = $dbi->execute($SELECT_TMPL->{0});
523
+$rows   = $result->fetch_all_hash;
524
+is_deeply($rows, [{key1 => 1, key2 => 12, key3 => 3, key4 => 4, key5 => 5},
525
+                  {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
526
+                  "$test : update key same as search key");
527
+
528
+$dbi->do("delete from table1");
529
+$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
530
+$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
531
+$dbi->update('table1', {key2 => 11}, {key1 => 1}, sub {
532
+    my $query = shift;
533
+    $query->bind_filter(sub {
534
+        my ($key, $value) = @_;
535
+        if ($key eq 'key2') {
536
+            return $value * 2;
537
+        }
538
+        return $value;
539
+    });
540
+});
541
+$result = $dbi->execute($SELECT_TMPL->{0});
542
+$rows   = $result->fetch_all_hash;
543
+is_deeply($rows, [{key1 => 1, key2 => 22, key3 => 3, key4 => 4, key5 => 5},
544
+                  {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
545
+                  "$test : query edit callback");
546
+
547
+
548
+test 'update error';
549
+$dbi = DBI::Custom->new($NEW_ARGS->{0});
550
+$dbi->do($CREATE_TABLE->{1});
551
+eval{$dbi->update('table1')};
552
+like($@, qr/Key-value pairs for update must be specified to 'update' second argument/,
553
+         "$test : update key-value pairs not specified");
554
+
555
+eval{$dbi->update('table1', {key2 => 1})};
556
+like($@, qr/Key-value pairs for where clause must be specified to 'update' third argument/,
557
+         "$test : where key-value pairs not specified");
558
+
559
+eval{$dbi->update('table1', {key2 => 1}, {key2 => 3}, 'aaa')};
560
+like($@, qr/Query edit callback must be code reference/, 
561
+         "$test : query edit callback not code reference");
562
+
563
+
564
+test 'update_all';
565
+$dbi = DBI::Custom->new($NEW_ARGS->{0});
566
+$dbi->do($CREATE_TABLE->{1});
567
+$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
568
+$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
569
+$dbi->update_all('table1', {key2 => 10}, sub {
570
+    my $query = shift;
571
+    $query->bind_filter(sub {
572
+        my ($key, $value) = @_;
573
+        return $value * 2;
574
+    })
575
+});
576
+$result = $dbi->execute($SELECT_TMPL->{0});
577
+$rows   = $result->fetch_all_hash;
578
+is_deeply($rows, [{key1 => 1, key2 => 20, key3 => 3, key4 => 4, key5 => 5},
579
+                  {key1 => 6, key2 => 20, key3 => 8, key4 => 9, key5 => 10}],
580
+                  "$test : query edit callback");
581
+
582
+
583
+test 'delete';
584
+$dbi = DBI::Custom->new($NEW_ARGS->{0});
585
+$dbi->do($CREATE_TABLE->{0});
586
+$dbi->insert('table1', {key1 => 1, key2 => 2});
587
+$dbi->insert('table1', {key1 => 3, key2 => 4});
588
+$dbi->delete('table1', {key1 => 1});
589
+$result = $dbi->execute($SELECT_TMPL->{0});
590
+$rows   = $result->fetch_all_hash;
591
+is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : basic");
592
+
593
+$dbi->do("delete from table1;");
594
+$dbi->insert('table1', {key1 => 1, key2 => 2});
595
+$dbi->insert('table1', {key1 => 3, key2 => 4});
596
+$dbi->delete('table1', {key2 => 1}, sub {
597
+    my $query = shift;
598
+    $query->bind_filter(sub {
599
+        my ($key, $value) = @_;
600
+        return $value * 2;
601
+    });
602
+});
603
+$result = $dbi->execute($SELECT_TMPL->{0});
604
+$rows   = $result->fetch_all_hash;
605
+is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : query edit callback");
606
+
607
+test 'delete error';
608
+$dbi = DBI::Custom->new($NEW_ARGS->{0});
609
+$dbi->do($CREATE_TABLE->{0});
610
+eval{$dbi->delete('table1')};
611
+like($@, qr/Key-value pairs for where clause must be specified to 'delete' second argument/,
612
+         "$test : where key-value pairs not specified");
613
+
614
+eval{$dbi->delete('table1', {key1 => 1}, 'aaa')};
615
+like($@, qr/Query edit callback must be code reference/, 
616
+         "$test : query edit callback not code ref");
617
+
618
+
619
+test 'delete_all';
620
+$dbi = DBI::Custom->new($NEW_ARGS->{0});
621
+$dbi->do($CREATE_TABLE->{0});
622
+$dbi->insert('table1', {key1 => 1, key2 => 2});
623
+$dbi->insert('table1', {key1 => 3, key2 => 4});
624
+$dbi->delete_all('table1');
625
+$result = $dbi->execute($SELECT_TMPL->{0});
626
+$rows   = $result->fetch_all_hash;
627
+is_deeply($rows, [], "$test : basic");
628
+
629
+