Showing 3 changed files with 84 additions and 22 deletions
+2
Changes
... ...
@@ -1,3 +1,5 @@
1
+0.1730
2
+    - fixed id option bug when column name is anbiguous
1 3
 0.1729
2 4
     - dbi_option attribute is renamed to option, dbi_option is DEPRECATED!
3 5
     - default_dbi_option is renamed to default_option, default_dbi_option
+20 -14
lib/DBIx/Custom.pm
... ...
@@ -1,7 +1,7 @@
1 1
 package DBIx::Custom;
2 2
 use Object::Simple -base;
3 3
 
4
-our $VERSION = '0.1728';
4
+our $VERSION = '0.1730';
5 5
 use 5.008001;
6 6
 
7 7
 use Carp 'croak';
... ...
@@ -249,7 +249,8 @@ sub delete {
249 249
     my $prefix = delete $args{prefix};
250 250
     
251 251
     # Where
252
-    $where = $self->_create_param_from_id($id, $primary_key) if defined $id;
252
+    $where = $self->_create_param_from_id($id, $primary_key, $table)
253
+      if defined $id;
253 254
     my $where_clause = '';
254 255
     if (ref $where eq 'ARRAY' && !ref $where->[0]) {
255 256
         $where_clause = "where " . $where->[0];
... ...
@@ -403,16 +404,11 @@ sub execute {
403 404
     warn "sqlfilter option is DEPRECATED" if $args{sqlfilter};
404 405
     my $id = delete $args{id};
405 406
     my $primary_key = delete $args{primary_key};
406
-    croak "insert method primary_key option " .
407
+    croak "execute method primary_key option " .
407 408
           "must be specified when id is specified " . _subname
408 409
       if defined $id && !defined $primary_key;
409 410
     $primary_key = [$primary_key] unless ref $primary_key eq 'ARRAY';
410 411
 
411
-    if (defined $id) {
412
-        my $id_param = $self->_create_param_from_id($id, $primary_key);
413
-        $param = $self->merge_param($id_param, $param);
414
-    }
415
-    
416 412
     # Check argument names
417 413
     foreach my $name (keys %args) {
418 414
         croak qq{"$name" is wrong option } . _subname
... ...
@@ -422,6 +418,7 @@ sub execute {
422 418
     $query = $self->_create_query($query, $after_build_sql) unless ref $query;
423 419
     
424 420
     # Save query
421
+    if (ref $query eq 'DBIx::Custom::Result') { $DB::single = 1 }
425 422
     $self->last_sql($query->sql);
426 423
 
427 424
     return $query if $query_return;
... ...
@@ -432,6 +429,11 @@ sub execute {
432 429
     # Tables
433 430
     unshift @$tables, @{$query->{tables} || []};
434 431
     my $main_table = @{$tables}[-1];
432
+
433
+    if (defined $id) {
434
+        my $id_param = $self->_create_param_from_id($id, $primary_key, $main_table);
435
+        $param = $self->merge_param($id_param, $param);
436
+    }
435 437
     
436 438
     # DEPRECATED! Cleanup tables
437 439
     $tables = $self->_remove_duplicate_table($tables, $main_table)
... ...
@@ -932,7 +934,7 @@ sub select {
932 934
     }
933 935
     else {
934 936
         my $main_table = $tables->[-1] || '';
935
-        $sql .= $self->_q($main_table);
937
+        $sql .= $self->_q($main_table) . ' ';
936 938
     }
937 939
     $sql =~ s/, $/ /;
938 940
     croak "Not found table name " . _subname
... ...
@@ -944,7 +946,8 @@ sub select {
944 946
     
945 947
     # Where
946 948
     my $where_clause = '';
947
-    $where = $self->_create_param_from_id($id, $primary_key) if defined $id;
949
+    $where = $self->_create_param_from_id($id, $primary_key, $tables->[-1])
950
+      if defined $id;
948 951
     if (ref $where eq 'ARRAY' && !ref $where->[0]) {
949 952
         $where_clause = "where " . $where->[0];
950 953
         $where_param = $where->[1];
... ...
@@ -1141,7 +1144,8 @@ sub update {
1141 1144
     my $assign_clause = $self->assign_clause($param, {wrap => $wrap});
1142 1145
 
1143 1146
     # Where
1144
-    $where = $self->_create_param_from_id($id, $primary_key) if defined $id;
1147
+    $where = $self->_create_param_from_id($id, $primary_key, $table)
1148
+      if defined $id;
1145 1149
     my $where_clause = '';
1146 1150
     if (ref $where eq 'ARRAY' && !ref $where->[0]) {
1147 1151
         $where_clause = "where " . $where->[0];
... ...
@@ -1315,7 +1319,7 @@ sub _create_bind_values {
1315 1319
 }
1316 1320
 
1317 1321
 sub _create_param_from_id {
1318
-    my ($self, $id, $primary_keys) = @_;
1322
+    my ($self, $id, $primary_keys, $table) = @_;
1319 1323
     
1320 1324
     # Create parameter
1321 1325
     my $param = {};
... ...
@@ -1328,7 +1332,9 @@ sub _create_param_from_id {
1328 1332
             . " (" . (caller 1)[3] . ")"
1329 1333
           unless @$primary_keys eq @$id;
1330 1334
         for(my $i = 0; $i < @$primary_keys; $i ++) {
1331
-           $param->{$primary_keys->[$i]} = $id->[$i];
1335
+           my $key = $primary_keys->[$i];
1336
+           $key = "$table." . $key if $table;
1337
+           $param->{$key} = $id->[$i];
1332 1338
         }
1333 1339
     }
1334 1340
     
... ...
@@ -2329,7 +2335,7 @@ and C<PrintError> option is false by default.
2329 2335
 
2330 2336
 =head2 C<count>
2331 2337
 
2332
-    my $count = $model->count(table => 'book');
2338
+    my $count = $dbi->count(table => 'book');
2333 2339
 
2334 2340
 Get rows count.
2335 2341
 
+62 -8
t/common.t
... ...
@@ -2806,7 +2806,7 @@ $result = $dbi->execute("select $key1 as h1, $key2 as h2 from $table1");
2806 2806
 is_deeply([map { lc } @{$result->header}], [qw/h1 h2/]);
2807 2807
 
2808 2808
 test 'Named placeholder :name(operater) syntax';
2809
-$dbi->execute("drop table $table1");
2809
+eval { $dbi->execute("drop table $table1") };
2810 2810
 $dbi->execute($create_table1_2);
2811 2811
 $dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3, $key4 => 4, $key5 => 5});
2812 2812
 $dbi->insert(table => $table1, param => {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10});
... ...
@@ -2836,7 +2836,7 @@ $rows = $result->all;
2836 2836
 is_deeply($rows, [{$key1 => 1, $key2 => 2, $key3 => 3, $key4 => 4, $key5 => 5}]);
2837 2837
 
2838 2838
 test 'high perfomance way';
2839
-$dbi->execute("drop table $table1");
2839
+eval { $dbi->execute("drop table $table1") };
2840 2840
 $dbi->execute($create_table1_highperformance);
2841 2841
 $rows = [
2842 2842
     {$key7 => 1, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 6, $key1 => 7},
... ...
@@ -2856,7 +2856,7 @@ $rows = [
2856 2856
     );
2857 2857
 }
2858 2858
 
2859
-$dbi->execute("drop table $table1");
2859
+eval { $dbi->execute("drop table $table1") };
2860 2860
 $dbi->execute($create_table1_highperformance);
2861 2861
 $rows = [
2862 2862
     {$key7 => 1, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 6, $key1 => 7},
... ...
@@ -2878,7 +2878,7 @@ $rows = [
2878 2878
     );
2879 2879
 }
2880 2880
 
2881
-$dbi->execute("drop table $table1");
2881
+eval { $dbi->execute("drop table $table1") };
2882 2882
 $dbi->execute($create_table1_highperformance);
2883 2883
 $rows = [
2884 2884
     {$key7 => 10, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 5},
... ...
@@ -2888,17 +2888,71 @@ $rows = [
2888 2888
     $model = $dbi->create_model(table => $table1, primary_key => $key1);
2889 2889
     my $query;
2890 2890
     foreach my $row (@$rows) {
2891
-      $query ||= $model->insert($row, id => 1, query => 1);
2892
-      $model->execute($query, $row, id => 1, filter => {$key7 => sub { $_[0] * 2 }});
2891
+      $query ||= $model->insert($row, query => 1);
2892
+      $model->execute($query, $row, filter => {$key7 => sub { $_[0] * 2 }});
2893 2893
     }
2894 2894
     is_deeply($dbi->select(table => $table1, append => 'order by key2')->all,
2895 2895
       [
2896
-          {$key7 => 20, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 5, $key1 => 1},
2897
-          {$key7 => 22, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 6, $key1 => 1},
2896
+          {$key7 => 20, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 5, $key1 => undef},
2897
+          {$key7 => 22, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 6, $key1 => undef},
2898 2898
       ]
2899 2899
     );
2900 2900
 }
2901 2901
 
2902
+test 'id option more';
2903
+eval { $dbi->execute("drop table $table1") };
2904
+$dbi->execute($create_table1_highperformance);
2905
+$row = {
2906
+    $key7 => 10, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 5, $key1 => 2
2907
+};
2908
+$model = $dbi->create_model(table => $table1, primary_key => $key1);
2909
+$model->insert($row);
2910
+$query = $model->update({$key7 => 11}, id => 1, query => 1);
2911
+$model->execute($query, {$key7 => 11}, id => 1, filter => {"$table1.$key1" => sub { $_[0] * 2 }});
2912
+is_deeply($dbi->select(table => $table1)->one,
2913
+    {$key7 => 11, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 5, $key1 => 2},
2914
+);
2915
+
2916
+eval { $dbi->execute("drop table $table1") };
2917
+eval { $dbi->execute("drop table $table2") };
2918
+$dbi->execute($create_table1);
2919
+$dbi->execute($create_table2);
2920
+$model = $dbi->create_model(table => $table1, primary_key => $key1);
2921
+$model->insert({$key1 => 1, $key2 => 2});
2922
+$model = $dbi->create_model(table => $table2, primary_key => $key1,
2923
+    join => ["left outer join $table1 on $table2.$key1 = $table1.$key1"]);
2924
+$model->insert({$key1 => 1, $key3 => 3});
2925
+$result = $model->select(
2926
+    column => {$table1 => ["$key2"]},
2927
+    id => 1
2928
+);
2929
+$DB::single = 1;
2930
+is_deeply($result->all, [{"$table1.$key2" => 2}]);
2931
+
2932
+eval { $dbi->execute("drop table $table1") };
2933
+$dbi->execute($create_table1_highperformance);
2934
+$row = {
2935
+    $key7 => 10, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 5, $key1 => 2
2936
+};
2937
+$model = $dbi->create_model(table => $table1, primary_key => $key1);
2938
+$model->insert($row);
2939
+$query = $model->delete(id => 1, query => 1);
2940
+$model->execute($query, {}, id => 1, , filter => {"$table1.$key1" => sub { $_[0] * 2 }});
2941
+is_deeply($dbi->select(table => $table1)->all, []);
2942
+
2943
+eval { $dbi->execute("drop table $table1") };
2944
+eval { $dbi->execute($create_table1_highperformance) };
2945
+$row = {
2946
+    $key7 => 10, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 5, $key1 => 2
2947
+};
2948
+$model = $dbi->create_model(table => $table1, primary_key => $key1);
2949
+$model->insert($row);
2950
+$query = $model->select(id => 1, query => 1);
2951
+$model->execute($query, {$key7 => 11}, id => 1, filter => {"$table1.$key1" => sub { $_[0] * 2 }});
2952
+is_deeply($dbi->select(table => $table1)->one,
2953
+    {$key7 => 10, $key6 => 2, $key5 => 3, $key4 => 4, $key3 => 5, $key2 => 5, $key1 => 2},
2954
+);
2955
+
2902 2956
 test 'result';
2903 2957
 $dbi = DBIx::Custom->connect;
2904 2958
 eval { $dbi->execute("drop table $table1") };