Showing 4 changed files with 138 additions and 159 deletions
+1
Changes
... ...
@@ -1,5 +1,6 @@
1 1
 0.1687
2 2
     - added EXPERIMENTAL type_rule method
3
+    - added EXPERIMENTAL execute() type_rule_off option
3 4
 0.1686
4 5
     - select() column option can receive array reference in array.
5 6
       This is EXPERIMENTAL
+101 -156
lib/DBIx/Custom.pm
... ...
@@ -22,7 +22,7 @@ use Encode qw/encode encode_utf8 decode_utf8/;
22 22
 use constant DEBUG => $ENV{DBIX_CUSTOM_DEBUG} || 0;
23 23
 use constant DEBUG_ENCODING => $ENV{DBIX_CUSTOM_DEBUG_ENCODING} || 'UTF-8';
24 24
 
25
-our @COMMON_ARGS = qw/table query filter type id primary_key/;
25
+our @COMMON_ARGS = qw/table query filter type id primary_key type_rule_off/;
26 26
 
27 27
 __PACKAGE__->attr(
28 28
     [qw/connector dsn password user/],
... ...
@@ -442,6 +442,7 @@ sub execute {
442 442
     $filter = _array_to_hash($filter);
443 443
     my $type = delete $args{type};
444 444
     $type = _array_to_hash($type);
445
+    my $type_rule_off = delete $args{type_rule_off};
445 446
     
446 447
     # Check argument names
447 448
     foreach my $name (keys %args) {
... ...
@@ -489,21 +490,23 @@ sub execute {
489 490
 
490 491
     # Type rule
491 492
     my $applied_filter = {};
492
-    foreach my $name (keys %$param) {
493
-        my $table;
494
-        my $column;
495
-        if ($name =~ /(?:(.+)\.)?(.+)/) {
496
-            $table = $1;
497
-            $column = $2;
498
-        }
499
-        $table ||= $main_table;
500
-        
501
-        my $into = $self->{_into} || {};
502
-        if (defined $table && $into->{$table} &&
503
-            (my $rule = $into->{$table}->{$column}))
504
-        {
505
-            $applied_filter->{$column} = $rule;
506
-            $applied_filter->{"$table.$column"} = $rule;
493
+    unless ($type_rule_off) {
494
+        foreach my $name (keys %$param) {
495
+            my $table;
496
+            my $column;
497
+            if ($name =~ /(?:(.+)\.)?(.+)/) {
498
+                $table = $1;
499
+                $column = $2;
500
+            }
501
+            $table ||= $main_table;
502
+            
503
+            my $into = $self->{_into} || {};
504
+            if (defined $table && $into->{$table} &&
505
+                (my $rule = $into->{$table}->{$column}))
506
+            {
507
+                $applied_filter->{$column} = $rule;
508
+                $applied_filter->{"$table.$column"} = $rule;
509
+            }
507 510
         }
508 511
     }
509 512
     
... ...
@@ -591,6 +594,7 @@ sub execute {
591 594
             filter => $filter->{in} || {},
592 595
             end_filter => $filter->{end} || {},
593 596
             type_rule => $self->type_rule,
597
+            type_rule_off => $type_rule_off
594 598
         );
595 599
 
596 600
         return $result;
... ...
@@ -2050,6 +2054,28 @@ filter name registerd by C<register_filter()>.
2050 2054
     );
2051 2055
 
2052 2056
 These filters are added to the C<out> filters, set by C<apply_filter()>.
2057
+C<filter> option is also available
2058
+by C<insert()>, C<update()>, C<delete()>, C<select()>
2059
+
2060
+=item C<type>
2061
+
2062
+Specify database data type.
2063
+
2064
+    type => [image => DBI::SQL_BLOB]
2065
+    type => [[qw/image audio/] => DBI::SQL_BLOB]
2066
+
2067
+This is used to bind paramter by C<bind_param()> of statment handle.
2068
+
2069
+    $sth->bind_param($pos, $value, DBI::SQL_BLOB);
2070
+
2071
+C<type> option is also available
2072
+by C<insert()>, C<update()>, C<delete()>, C<select()>.
2073
+
2074
+=item C<type_rule_off> EXPERIMENTAL
2075
+
2076
+    type_rule_off => 1
2077
+
2078
+Trun type rule off.
2053 2079
 
2054 2080
 =back
2055 2081
 
... ...
@@ -2098,34 +2124,7 @@ Append statement to last of SQL. This is string.
2098 2124
 
2099 2125
 =item C<filter>
2100 2126
 
2101
-Filter, executed before data is send to database. This is array reference.
2102
-Filter value is code reference or
2103
-filter name registerd by C<register_filter()>.
2104
-
2105
-    # Basic
2106
-    $dbi->delete(
2107
-        filter => {
2108
-            title  => sub { uc $_[0] }
2109
-            author => sub { uc $_[0] }
2110
-        }
2111
-    );
2112
-    
2113
-    # At once (use array reference)
2114
-    $dbi->delete(
2115
-        filter => [
2116
-            [qw/title author/]  => sub { uc $_[0] }
2117
-        ]
2118
-    );
2119
-    
2120
-    # Filter name
2121
-    $dbi->delete(
2122
-        filter => {
2123
-            title  => 'upper_case',
2124
-            author => 'upper_case'
2125
-        }
2126
-    );
2127
-
2128
-These filters are added to the C<out> filters, set by C<apply_filter()>.
2127
+Same as C<execute> method's C<filter> option.
2129 2128
 
2130 2129
 =item C<query>
2131 2130
 
... ...
@@ -2162,6 +2161,14 @@ The above is same as the followin ones.
2162 2161
 
2163 2162
 See C<id> option.
2164 2163
 
2164
+=item C<type>
2165
+
2166
+Same as C<execute> method's C<type> option.
2167
+
2168
+=item C<type_rule_off> EXPERIMENTAL
2169
+
2170
+Same as C<execute> method's C<type_rule_off> option.
2171
+
2165 2172
 =back
2166 2173
 
2167 2174
 =head2 C<delete_all>
... ...
@@ -2208,45 +2215,56 @@ Append statement to last of SQL. This is string.
2208 2215
 
2209 2216
 =item C<filter>
2210 2217
 
2211
-Filter, executed before data is send to database. This is array reference.
2212
-Filter value is code reference or
2213
-filter name registerd by C<register_filter()>.
2218
+Same as C<execute> method's C<filter> option.
2219
+
2220
+=item C<query>
2221
+
2222
+Get L<DBIx::Custom::Query> object instead of executing SQL.
2223
+This is true or false value.
2224
+
2225
+    my $query = $dbi->insert(query => 1);
2226
+
2227
+You can check SQL.
2228
+
2229
+    my $sql = $query->sql;
2230
+
2231
+=item C<id>
2232
+
2233
+Insert using primary_key.
2214 2234
 
2215
-    # Basic
2216 2235
     $dbi->insert(
2217
-        filter => {
2218
-            title  => sub { uc $_[0] }
2219
-            author => sub { uc $_[0] }
2220
-        }
2236
+        primary_key => 'id',
2237
+        id => 4,
2238
+        param => {title => 'Perl', author => 'Ken'}
2221 2239
     );
2222
-    
2223
-    # At once (use array reference)
2240
+
2224 2241
     $dbi->insert(
2225
-        filter => [
2226
-            [qw/title author/]  => sub { uc $_[0] }
2227
-        ]
2242
+        primary_key => ['id1', 'id2'],
2243
+        id => [4, 5],
2244
+        param => {title => 'Perl', author => 'Ken'}
2228 2245
     );
2229
-    
2230
-    # Filter name
2246
+
2247
+The above is same as the followin ones.
2248
+
2231 2249
     $dbi->insert(
2232
-        filter => {
2233
-            title  => 'upper_case',
2234
-            author => 'upper_case'
2235
-        }
2250
+        param => {id => 4, title => 'Perl', author => 'Ken'}
2236 2251
     );
2237 2252
 
2238
-These filters are added to the C<out> filters, set by C<apply_filter()>.
2253
+    $dbi->insert(
2254
+        param => {id1 => 4, id2 => 5, title => 'Perl', author => 'Ken'}
2255
+    );
2239 2256
 
2240
-=item C<query>
2257
+=item C<primary_key>
2241 2258
 
2242
-Get L<DBIx::Custom::Query> object instead of executing SQL.
2243
-This is true or false value.
2259
+See C<id> description.
2244 2260
 
2245
-    my $query = $dbi->insert(query => 1);
2261
+=item C<type>
2246 2262
 
2247
-You can check SQL.
2263
+Same as C<execute> method's C<type> option.
2248 2264
 
2249
-    my $sql = $query->sql;
2265
+=item C<type_rule_off> EXPERIMENTAL
2266
+
2267
+Turn type rule off.
2250 2268
 
2251 2269
 =back
2252 2270
 
... ...
@@ -2576,34 +2594,7 @@ This option is for Oracle and SQL Server paging process.
2576 2594
 
2577 2595
 =item C<filter>
2578 2596
 
2579
-Filter, executed before data is send to database. This is array reference.
2580
-Filter value is code reference or
2581
-filter name registerd by C<register_filter()>.
2582
-
2583
-    # Basic
2584
-    $dbi->select(
2585
-        filter => {
2586
-            title  => sub { uc $_[0] }
2587
-            author => sub { uc $_[0] }
2588
-        }
2589
-    );
2590
-    
2591
-    # At once (use array reference)
2592
-    $dbi->select(
2593
-        filter => [
2594
-            [qw/title author/]  => sub { uc $_[0] }
2595
-        ]
2596
-    );
2597
-    
2598
-    # Filter name
2599
-    $dbi->select(
2600
-        filter => {
2601
-            title  => 'upper_case',
2602
-            author => 'upper_case'
2603
-        }
2604
-    );
2605
-
2606
-These filters are added to the C<out> filters, set by C<apply_filter()>.
2597
+Same as C<execute> method's C<filter> option.
2607 2598
 
2608 2599
 =item C<query>
2609 2600
 
... ...
@@ -2618,14 +2609,11 @@ You can check SQL.
2618 2609
 
2619 2610
 =item C<type>
2620 2611
 
2621
-Specify database data type.
2622
-
2623
-    $dbi->select(type => [image => DBI::SQL_BLOB]);
2624
-    $dbi->select(type => [[qw/image audio/] => DBI::SQL_BLOB]);
2612
+Same as C<execute> method's C<type> option.
2625 2613
 
2626
-This is used to bind paramter by C<bind_param()> of statment handle.
2614
+=item C<type_rule_off> EXPERIMENTAL
2627 2615
 
2628
-    $sth->bind_param($pos, $value, DBI::SQL_BLOB);
2616
+Same as C<execute> method's C<type_rule_off> option.
2629 2617
 
2630 2618
 =back
2631 2619
 
... ...
@@ -2693,34 +2681,7 @@ Append statement to last of SQL. This is string.
2693 2681
 
2694 2682
 =item C<filter>
2695 2683
 
2696
-Filter, executed before data is send to database. This is array reference.
2697
-Filter value is code reference or
2698
-filter name registerd by C<register_filter()>.
2699
-
2700
-    # Basic
2701
-    $dbi->update(
2702
-        filter => {
2703
-            title  => sub { uc $_[0] }
2704
-            author => sub { uc $_[0] }
2705
-        }
2706
-    );
2707
-    
2708
-    # At once (use array reference)
2709
-    $dbi->update(
2710
-        filter => [
2711
-            [qw/title author/]  => sub { uc $_[0] }
2712
-        ]
2713
-    );
2714
-    
2715
-    # Filter name
2716
-    $dbi->update(
2717
-        filter => {
2718
-            title  => 'upper_case',
2719
-            author => 'upper_case'
2720
-        }
2721
-    );
2722
-
2723
-These filters are added to the C<out> filters, set by C<apply_filter()>.
2684
+Same as C<execute> method's C<filter> option.
2724 2685
 
2725 2686
 =item C<query>
2726 2687
 
... ...
@@ -2733,30 +2694,6 @@ You can check SQL.
2733 2694
 
2734 2695
     my $sql = $query->sql;
2735 2696
 
2736
-Insert using primary_key.
2737
-
2738
-    $dbi->insert(
2739
-        primary_key => 'id',
2740
-        id => 4,
2741
-        param => {title => 'Perl', author => 'Ken'}
2742
-    );
2743
-
2744
-    $dbi->insert(
2745
-        primary_key => ['id1', 'id2'],
2746
-        id => [4, 5],
2747
-        param => {title => 'Perl', author => 'Ken'}
2748
-    );
2749
-
2750
-The above is same as the followin ones.
2751
-
2752
-    $dbi->insert(
2753
-        param => {id => 4, title => 'Perl', author => 'Ken'}
2754
-    );
2755
-
2756
-    $dbi->insert(
2757
-        param => {id1 => 4, id2 => 5, title => 'Perl', author => 'Ken'}
2758
-    );
2759
-
2760 2697
 =item C<id>
2761 2698
 
2762 2699
 update using primary_key.
... ...
@@ -2789,6 +2726,14 @@ The above is same as the followin ones.
2789 2726
 
2790 2727
 See C<id> option.
2791 2728
 
2729
+=item C<type>
2730
+
2731
+Same as C<execute> method's C<type> option.
2732
+
2733
+=item C<type_rule_off> EXPERIMENTAL
2734
+
2735
+Turn type rule off.
2736
+
2792 2737
 =back
2793 2738
 
2794 2739
 =head2 C<update_all>
+10 -3
lib/DBIx/Custom/Result.pm
... ...
@@ -9,7 +9,7 @@ use Carp 'croak';
9 9
 use DBIx::Custom::Util qw/_array_to_hash _subname/;
10 10
 
11 11
 __PACKAGE__->attr(
12
-    [qw/filters sth type_rule/],
12
+    [qw/filters sth type_rule type_rule_off/],
13 13
     stash => sub { {} }
14 14
 );
15 15
 
... ...
@@ -111,7 +111,7 @@ sub fetch {
111 111
     
112 112
     for (my $i = 0; $i < @$columns; $i++) {
113 113
         
114
-        if ($type_rule->{$types->[$i]} &&
114
+        if (!$self->type_rule_off && $type_rule->{$types->[$i]} &&
115 115
             (my $rule = $type_rule->{$types->[$i]}->{from}))
116 116
         {
117 117
             $row[$i] = $rule->($row[$i]);
... ...
@@ -181,7 +181,7 @@ sub fetch_hash {
181 181
     for (my $i = 0; $i < @$columns; $i++) {
182 182
         
183 183
         # Type rule
184
-        if ($type_rule->{$types->[$i]} &&
184
+        if (!$self->type_rule_off && $type_rule->{$types->[$i]} &&
185 185
             (my $rule = $type_rule->{$types->[$i]}->{from}))
186 186
         {
187 187
             $row->[$i] = $rule->($row->[$i]);
... ...
@@ -389,6 +389,13 @@ Resistered filters.
389 389
 
390 390
 Statement handle of L<DBI>.
391 391
 
392
+=head2 C<type_rule_off> EXPERIMENTAL
393
+
394
+    my $type_rule_off = $result->type_rule_off;
395
+    $result = $result->type_rule_off(1);
396
+
397
+Turn type rule off.
398
+
392 399
 =head1 METHODS
393 400
 
394 401
 L<DBIx::Custom::Result> inherits all methods from L<Object::Simple>
+26
t/dbix-custom-core-sqlite.t
... ...
@@ -2636,4 +2636,30 @@ $row = $result->one;
2636 2636
 is($row->{key1}, 'A');
2637 2637
 is($row->{key2}, 'B');
2638 2638
 
2639
+
2640
+test 'type_rule_off';
2641
+$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:');
2642
+$dbi->execute("create table table1 (key1 Date, key2 datetime)");
2643
+$dbi->type_rule(
2644
+    Date => {
2645
+        from => sub { $_[0] * 2 },
2646
+        into => sub { $_[0] * 3 },
2647
+    }
2648
+);
2649
+$dbi->insert({key1 => 2}, table => 'table1', type_rule_off => 1);
2650
+$result = $dbi->select(table => 'table1', type_rule_off => 1);
2651
+is($result->fetch->[0], 2);
2652
+
2653
+$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:');
2654
+$dbi->execute("create table table1 (key1 Date, key2 datetime)");
2655
+$dbi->type_rule(
2656
+    Date => {
2657
+        from => sub { $_[0] * 2 },
2658
+        into => sub { $_[0] * 3 },
2659
+    }
2660
+);
2661
+$dbi->insert({key1 => 2}, table => 'table1', type_rule_off => 1);
2662
+$result = $dbi->select(table => 'table1', type_rule_off => 1);
2663
+is($result->one->{key1}, 2);
2664
+
2639 2665
 =cut