| ... | ... | 
                  @@ -14,9 +14,8 @@ sub user        : ClassObjectAttr { initialize => {clone => 'scalar'} }
                 | 
              
| 14 | 14 | 
                   sub password    : ClassObjectAttr { initialize => {clone => 'scalar'} }
                 | 
              
| 15 | 15 | 
                   sub data_source : ClassObjectAttr { initialize => {clone => 'scalar'} }
                 | 
              
| 16 | 16 | 
                   sub database    : ClassObjectAttr { initialize => {clone => 'scalar'} }
                 | 
              
| 17 | 
                  -  | 
              |
| 18 | 17 | 
                   sub dbi_options : ClassObjectAttr { initialize => {clone => 'hash', 
                 | 
              
| 19 | 
                  -                                                  default => sub { {} } } }
                 | 
              |
| 18 | 
                  +                                                   default => sub { {} } } }
                 | 
              |
| 20 | 19 | 
                   | 
              
| 21 | 20 | 
                   sub bind_filter  : ClassObjectAttr { initialize => {clone => 'scalar'} }
                 | 
              
| 22 | 21 | 
                   sub fetch_filter : ClassObjectAttr { initialize => {clone => 'scalar'} }
                 | 
              
| ... | ... | 
                  @@ -213,7 +212,8 @@ sub execute {
                 | 
              
| 213 | 212 | 
                   | 
              
| 214 | 213 | 
                  # Execute  | 
              
| 215 | 214 | 
                  my $sth = $query->sth;  | 
              
| 216 | 
                  - my $ret_val = $sth->execute(@$bind_values);  | 
              |
| 215 | 
                  +    my $ret_val = eval{$sth->execute(@$bind_values)};
                 | 
              |
| 216 | 
                  + croak($@) if $@;  | 
              |
| 217 | 217 | 
                   | 
              
| 218 | 218 | 
                  # Return resultset if select statement is executed  | 
              
| 219 | 219 | 
                       if ($sth->{NUM_OF_FIELDS}) {
                 | 
              
| ... | ... | 
                  @@ -238,7 +238,7 @@ sub _build_bind_values {
                 | 
              
| 238 | 238 | 
                  # binding values  | 
              
| 239 | 239 | 
                  my @bind_values;  | 
              
| 240 | 240 | 
                   | 
              
| 241 | 
                  - # Filter and sdd bind values  | 
              |
| 241 | 
                  + # Create bind values  | 
              |
| 242 | 242 | 
                       foreach my $key_info (@$key_infos) {
                 | 
              
| 243 | 243 | 
                           my $filtering_key = $key_info->{key};
                 | 
              
| 244 | 244 | 
                           my $access_keys = $key_info->{access_keys};
                 | 
              
| ... | ... | 
                  @@ -247,6 +247,7 @@ sub _build_bind_values {
                 | 
              
| 247 | 247 | 
                           my $table        = $key_info->{table}        || '';
                 | 
              
| 248 | 248 | 
                           my $column       = $key_info->{column}       || '';
                 | 
              
| 249 | 249 | 
                   | 
              
| 250 | 
                  + my $found;  | 
              |
| 250 | 251 | 
                  ACCESS_KEYS :  | 
              
| 251 | 252 | 
                           foreach my $access_key (@$access_keys) {
                 | 
              
| 252 | 253 | 
                  my $root_params = $params;  | 
              
| ... | ... | 
                  @@ -278,7 +279,7 @@ sub _build_bind_values {
                 | 
              
| 278 | 279 | 
                                               push @bind_values, scalar $root_params->{$key};
                 | 
              
| 279 | 280 | 
                  }  | 
              
| 280 | 281 | 
                  }  | 
              
| 281 | 
                  - return @bind_values;  | 
              |
| 282 | 
                  + $found = 1;  | 
              |
| 282 | 283 | 
                  }  | 
              
| 283 | 284 | 
                   | 
              
| 284 | 285 | 
                                   if ($key eq 'ARRAY') {
                 | 
              
| ... | ... | 
                  @@ -290,8 +291,17 @@ sub _build_bind_values {
                 | 
              
| 290 | 291 | 
                  }  | 
              
| 291 | 292 | 
                  }  | 
              
| 292 | 293 | 
                  }  | 
              
| 293 | 
                  -        croak("Cannot find key");
                 | 
              |
| 294 | 
                  +  | 
              |
| 295 | 
                  +        unless ($found) {
                 | 
              |
| 296 | 
                  + require Data::Dumper;  | 
              |
| 297 | 
                  + my $key_info_dump = Data::Dumper->Dump([$key_info], ['*key_info']);  | 
              |
| 298 | 
                  + my $params_dump = Data::Dumper->Dump([$params], ['*params']);  | 
              |
| 299 | 
                  +            croak("Key not found\n\n" . 
                 | 
              |
| 300 | 
                  + "<Key information>\n$key_info_dump\n\n" .  | 
              |
| 301 | 
                  + "<Your parameters>\n$params_dump\n");  | 
              |
| 302 | 
                  + }  | 
              |
| 294 | 303 | 
                  }  | 
              
| 304 | 
                  + return \@bind_values;  | 
              |
| 295 | 305 | 
                  }  | 
              
| 296 | 306 | 
                   | 
              
| 297 | 307 | 
                   | 
              
| ... | ... | 
                  @@ -553,6 +563,8 @@ If tranzation is died, rollback is execute.  | 
              
| 553 | 563 | 
                   | 
              
| 554 | 564 | 
                  Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>  | 
              
| 555 | 565 | 
                   | 
              
| 566 | 
                  +Github L<http://github.com/yuki-kimoto>  | 
              |
| 567 | 
                  +  | 
              |
| 556 | 568 | 
                  =head1 COPYRIGHT & LICENSE  | 
              
| 557 | 569 | 
                   | 
              
| 558 | 570 | 
                  Copyright 2009 Yuki Kimoto, all rights reserved.  | 
              
| ... | ... | 
                  @@ -105,30 +105,28 @@ $result = $dbi->execute($query);  | 
              
| 105 | 105 | 
                  @rows = $result->fetch_all;  | 
              
| 106 | 106 | 
                  is_deeply(\@rows, [[1, 2], [3, 4]], "$test : fetch_all_hash list context");  | 
              
| 107 | 107 | 
                   | 
              
| 108 | 
                  -__END__  | 
              |
| 109 | 
                  -  | 
              |
| 110 | 108 | 
                  test 'Filter';  | 
              
| 111 | 109 | 
                  $dbi->reconnect;  | 
              
| 112 | 
                  -$dbi->dbh->do($CREATE_TABLE->{0});
                 | 
              |
| 110 | 
                  +$dbi->do($CREATE_TABLE->{0});
                 | 
              |
| 113 | 111 | 
                   | 
              
| 114 | 112 | 
                   $insert_tmpl  = "insert into table1 {insert_values key1 key2};";
                 | 
              
| 115 | 113 | 
                  $insert_query = $dbi->create_query($insert_tmpl);  | 
              
| 116 | 114 | 
                   $insert_query->bind_filter(sub {
                 | 
              
| 117 | 
                  - my ($key, $value) = @_;  | 
              |
| 118 | 
                  -    if ($key eq 'key1') {
                 | 
              |
| 115 | 
                  + my ($key, $value, $table, $column) = @_;  | 
              |
| 116 | 
                  +    if ($key eq 'key1' && $table eq '' && $column eq 'key1') {
                 | 
              |
| 119 | 117 | 
                  return $value * 2;  | 
              
| 120 | 118 | 
                  }  | 
              
| 121 | 119 | 
                  return $value;  | 
              
| 122 | 120 | 
                  });  | 
              
| 123 | 
                  -$DB::single = 1;  | 
              |
| 121 | 
                  +  | 
              |
| 124 | 122 | 
                   $ret_val = $dbi->execute($insert_query, {key1 => 1, key2 => 2});
                 | 
              
| 125 | 123 | 
                  ok($ret_val, "Insert success return value");  | 
              
| 126 | 124 | 
                   | 
              
| 127 | 
                  -$select_tmpl = "select k1, k2 from table1";  | 
              |
| 128 | 
                  -$select_query = $dbi->create_query($select_query);  | 
              |
| 125 | 
                  +$select_tmpl = "select key1, key2 from table1";  | 
              |
| 126 | 
                  +$select_query = $dbi->create_query($select_tmpl);  | 
              |
| 129 | 127 | 
                   $select_query->fetch_filter(sub {
                 | 
              
| 130 | 
                  - my ($key, $value);  | 
              |
| 131 | 
                  -    if ($key eq 'key2') {
                 | 
              |
| 128 | 
                  + my ($key, $value, $type, $sth, $i) = @_;  | 
              |
| 129 | 
                  +    if ($key eq 'key2' && $type =~ /char/ && $sth->can('execute') && $i == 1) {
                 | 
              |
| 132 | 130 | 
                  return $value * 3;  | 
              
| 133 | 131 | 
                  }  | 
              
| 134 | 132 | 
                  return $value;  | 
              
| ... | ... | 
                  @@ -136,7 +134,7 @@ $select_query->fetch_filter(sub {
                 | 
              
| 136 | 134 | 
                  $result = $dbi->execute($select_query);  | 
              
| 137 | 135 | 
                   | 
              
| 138 | 136 | 
                  $rows = $result->fetch_all_hash;  | 
              
| 139 | 
                  -is_deeply($rows, {k1 => 2, k2 => 6}, "$test : bind_filter fetch_filter");
                 | 
              |
| 137 | 
                  +is_deeply($rows, [{key1 => 2, key2 => 6}], "$test : bind_filter fetch_filter");
                 | 
              |
| 140 | 138 | 
                   | 
              
| 141 | 139 | 
                  __END__  | 
              
| 142 | 140 | 
                   |