| ... | ... | @@ -1,3 +1,7 @@ | 
| 1 | +0.1689 | |
| 2 | + - added EXPERIMENTAL available_data_type | |
| 3 | + - simplified type_rule | |
| 4 | + - changed type_rule arguments format. | |
| 1 | 5 | 0.1688 | 
| 2 | 6 | - fixed bug that model insert, update, delete select can't | 
| 3 | 7 | odd number arguments | 
| ... | ... | @@ -1,6 +1,6 @@ | 
| 1 | 1 | package DBIx::Custom; | 
| 2 | 2 |  | 
| 3 | -our $VERSION = '0.1688'; | |
| 3 | +our $VERSION = '0.1689'; | |
| 4 | 4 |  | 
| 5 | 5 | use 5.008001; | 
| 6 | 6 | use strict; | 
| ... | ... | @@ -1005,7 +1005,7 @@ sub setup_model { | 
| 1005 | 1005 |  sub available_data_type { | 
| 1006 | 1006 | my $self = shift; | 
| 1007 | 1007 |  | 
| 1008 | - my $data_types = "Data Type (Type name)\n"; | |
| 1008 | + my $data_types = ''; | |
| 1009 | 1009 |      foreach my $i (-1000 .. 1000) { | 
| 1010 | 1010 | my $type_info = $self->dbh->type_info($i); | 
| 1011 | 1011 |           my $data_type = $type_info->{DATA_TYPE}; | 
| ... | ... | @@ -1013,6 +1013,8 @@ sub available_data_type { | 
| 1013 | 1013 | $data_types .= "$data_type ($type_name)\n" | 
| 1014 | 1014 | if defined $data_type; | 
| 1015 | 1015 | } | 
| 1016 | + return "Data Type maybe equal to Type Name" unless $data_types; | |
| 1017 | + $data_types = "Data Type (Type name)\n" . $data_types; | |
| 1016 | 1018 | return $data_types; | 
| 1017 | 1019 | } | 
| 1018 | 1020 |  | 
| ... | ... | @@ -1020,15 +1022,17 @@ sub type_rule { | 
| 1020 | 1022 | my $self = shift; | 
| 1021 | 1023 |  | 
| 1022 | 1024 |      if (@_) { | 
| 1023 | - my $type_rule = _array_to_hash([@_]); | |
| 1025 | +        my $type_rule = ref $_[0] eq 'HASH' ? $_[0] : {@_}; | |
| 1026 | +        $type_rule->{from} = _array_to_hash($type_rule->{from}); | |
| 1027 | +        $type_rule->{into} = _array_to_hash($type_rule->{into}); | |
| 1024 | 1028 |          $self->{type_rule} = $type_rule; | 
| 1025 | 1029 |          $self->{_into} ||= {}; | 
| 1026 | 1030 |          $self->each_column(sub { | 
| 1027 | 1031 | my ($dbi, $table, $column, $column_info) = @_; | 
| 1028 | 1032 |  | 
| 1029 | 1033 |              my $type = $column_info->{TYPE_NAME}; | 
| 1030 | -            if ($type_rule->{$type} && | |
| 1031 | -                (my $rule = $type_rule->{$type}->{into})) | |
| 1034 | +            if ($type_rule->{into} && | |
| 1035 | +                (my $rule = $type_rule->{into}->{$type})) | |
| 1032 | 1036 |              { | 
| 1033 | 1037 |                  $self->{_into}{$table}{$column} = $rule; | 
| 1034 | 1038 | } | 
| ... | ... | @@ -1845,6 +1849,12 @@ L<DBIx::Custom> inherits all methods from L<Object::Simple> | 
| 1845 | 1849 | and use all methods of L<DBI> | 
| 1846 | 1850 | and implements the following new ones. | 
| 1847 | 1851 |  | 
| 1852 | +=head2 C<available_data_type> EXPERIMENTAL | |
| 1853 | + | |
| 1854 | + print $dbi->available_data_type; | |
| 1855 | + | |
| 1856 | +Get available data type. | |
| 1857 | + | |
| 1848 | 1858 | =head2 C<apply_filter> | 
| 1849 | 1859 |  | 
| 1850 | 1860 | $dbi->apply_filter( | 
| ... | ... | @@ -2366,17 +2376,40 @@ Register filters, used by C<filter> option of many methods. | 
| 2366 | 2376 | =head2 C<type_rule> EXPERIMENTAL | 
| 2367 | 2377 |  | 
| 2368 | 2378 | $dbi->type_rule( | 
| 2369 | -        DATE => { | |
| 2370 | -            from => sub { ... }, | |
| 2371 | -            into => sub { ... } | |
| 2379 | +        into => { | |
| 2380 | +            DATE => sub { ... }, | |
| 2381 | +            DATETIME => sub { ... } | |
| 2372 | 2382 | }, | 
| 2373 | -        DATETIME => { | |
| 2374 | -            from => sub { ... } | |
| 2375 | -            into => sub { ... } | |
| 2383 | +        from => { | |
| 2384 | + # DATE | |
| 2385 | +            9 => sub { ... }, | |
| 2386 | + | |
| 2387 | + # DATETIME or TIMESTAMP | |
| 2388 | +            11 => sub { ... }, | |
| 2376 | 2389 | } | 
| 2377 | 2390 | ); | 
| 2378 | 2391 |  | 
| 2379 | -Filter based on type. | |
| 2392 | +Filtering rule when data is send into and get from database. | |
| 2393 | +This has a little complex problem. | |
| 2394 | +In C<into> you can specify type name as same as type name defined | |
| 2395 | +by create table, such as C<DATETIME> or C<DATE>. | |
| 2396 | +but in C<from> you can't specify type name defined by create table. | |
| 2397 | +You must specify data type, this is internal one. | |
| 2398 | +You get all data type by C<available_data_type>. | |
| 2399 | + | |
| 2400 | + print $dbi->available_data_type; | |
| 2401 | + | |
| 2402 | +You can also specify multiple types | |
| 2403 | + | |
| 2404 | + $dbi->type_rule( | |
| 2405 | + into => [ | |
| 2406 | +            [qw/DATE DATETIME/] => sub { ... }, | |
| 2407 | + ], | |
| 2408 | +        from => { | |
| 2409 | + # DATE | |
| 2410 | +            [qw/9 11/] => sub { ... }, | |
| 2411 | + } | |
| 2412 | + ); | |
| 2380 | 2413 |  | 
| 2381 | 2414 | =head2 C<select> | 
| 2382 | 2415 |  | 
| ... | ... | @@ -111,8 +111,8 @@ sub fetch { | 
| 111 | 111 |  | 
| 112 | 112 |      for (my $i = 0; $i < @$columns; $i++) { | 
| 113 | 113 |  | 
| 114 | -        if (!$self->type_rule_off && $type_rule->{$types->[$i]} && | |
| 115 | -            (my $rule = $type_rule->{$types->[$i]}->{from})) | |
| 114 | +        if (!$self->type_rule_off && $type_rule->{from} && | |
| 115 | +            (my $rule = $type_rule->{from}->{$types->[$i]})) | |
| 116 | 116 |          { | 
| 117 | 117 | $row[$i] = $rule->($row[$i]); | 
| 118 | 118 | } | 
| ... | ... | @@ -181,8 +181,8 @@ sub fetch_hash { | 
| 181 | 181 |      for (my $i = 0; $i < @$columns; $i++) { | 
| 182 | 182 |  | 
| 183 | 183 | # Type rule | 
| 184 | -        if (!$self->type_rule_off && $type_rule->{$types->[$i]} && | |
| 185 | -            (my $rule = $type_rule->{$types->[$i]}->{from})) | |
| 184 | +        if (!$self->type_rule_off && $type_rule->{from} && | |
| 185 | +            (my $rule = $type_rule->{from}->{$types->[$i]})) | |
| 186 | 186 |          { | 
| 187 | 187 | $row->[$i] = $rule->($row->[$i]); | 
| 188 | 188 | } | 
| ... | ... | @@ -2583,8 +2583,8 @@ is_deeply($result->one, | 
| 2583 | 2583 | test 'type_rule from'; | 
| 2584 | 2584 | $dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); | 
| 2585 | 2585 | $dbi->type_rule( | 
| 2586 | -    Date => { | |
| 2587 | -        from => sub { uc $_[0] } | |
| 2586 | +    from => { | |
| 2587 | +        Date => sub { uc $_[0] } | |
| 2588 | 2588 | } | 
| 2589 | 2589 | ); | 
| 2590 | 2590 |  $dbi->execute("create table table1 (key1 Date, key2 datetime)"); | 
| ... | ... | @@ -2600,8 +2600,8 @@ test 'type_rule into'; | 
| 2600 | 2600 | $dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); | 
| 2601 | 2601 |  $dbi->execute("create table table1 (key1 Date, key2 datetime)"); | 
| 2602 | 2602 | $dbi->type_rule( | 
| 2603 | -    Date => { | |
| 2604 | -        into => sub { uc $_[0] } | |
| 2603 | +    into => { | |
| 2604 | +        Date => sub { uc $_[0] } | |
| 2605 | 2605 | } | 
| 2606 | 2606 | ); | 
| 2607 | 2607 |  $dbi->insert({key1 => 'a'}, table => 'table1'); | 
| ... | ... | @@ -2611,9 +2611,9 @@ is($result->one->{key1}, 'A'); | 
| 2611 | 2611 | $dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); | 
| 2612 | 2612 |  $dbi->execute("create table table1 (key1 Date, key2 datetime)"); | 
| 2613 | 2613 | $dbi->type_rule( | 
| 2614 | -    [qw/Date datetime/] => { | |
| 2615 | -        into => sub { uc $_[0] } | |
| 2616 | - } | |
| 2614 | + into => [ | |
| 2615 | +         [qw/Date datetime/] => sub { uc $_[0] } | |
| 2616 | + ] | |
| 2617 | 2617 | ); | 
| 2618 | 2618 |  $dbi->insert({key1 => 'a', key2 => 'b'}, table => 'table1'); | 
| 2619 | 2619 | $result = $dbi->select(table => 'table1'); | 
| ... | ... | @@ -2625,9 +2625,9 @@ $dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); | 
| 2625 | 2625 |  $dbi->execute("create table table1 (key1 Date, key2 datetime)"); | 
| 2626 | 2626 |  $dbi->insert({key1 => 'a', key2 => 'B'}, table => 'table1'); | 
| 2627 | 2627 | $dbi->type_rule( | 
| 2628 | -    [qw/Date datetime/] => { | |
| 2629 | -        into => sub { uc $_[0] } | |
| 2630 | - } | |
| 2628 | + into => [ | |
| 2629 | +        [qw/Date datetime/] => sub { uc $_[0] } | |
| 2630 | + ] | |
| 2631 | 2631 | ); | 
| 2632 | 2632 | $result = $dbi->execute( | 
| 2633 | 2633 | "select * from table1 where key1 = :key1 and key2 = :table1.key2;", | 
| ... | ... | @@ -2641,9 +2641,9 @@ $dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); | 
| 2641 | 2641 |  $dbi->execute("create table table1 (key1 Date, key2 datetime)"); | 
| 2642 | 2642 |  $dbi->insert({key1 => 'A', key2 => 'B'}, table => 'table1'); | 
| 2643 | 2643 | $dbi->type_rule( | 
| 2644 | -    [qw/Date datetime/] => { | |
| 2645 | -        into => sub { uc $_[0] } | |
| 2646 | - } | |
| 2644 | + into => [ | |
| 2645 | +        [qw/Date datetime/] => sub { uc $_[0] } | |
| 2646 | + ] | |
| 2647 | 2647 | ); | 
| 2648 | 2648 | $result = $dbi->execute( | 
| 2649 | 2649 | "select * from table1 where key1 = :key1 and key2 = :table1.key2;", | 
| ... | ... | @@ -2659,9 +2659,11 @@ test 'type_rule_off'; | 
| 2659 | 2659 | $dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); | 
| 2660 | 2660 |  $dbi->execute("create table table1 (key1 Date, key2 datetime)"); | 
| 2661 | 2661 | $dbi->type_rule( | 
| 2662 | -    Date => { | |
| 2663 | -        from => sub { $_[0] * 2 }, | |
| 2664 | -        into => sub { $_[0] * 3 }, | |
| 2662 | +    from => { | |
| 2663 | +        Date => sub { $_[0] * 2 }, | |
| 2664 | + }, | |
| 2665 | +    into => { | |
| 2666 | +        Date => sub { $_[0] * 2 }, | |
| 2665 | 2667 | } | 
| 2666 | 2668 | ); | 
| 2667 | 2669 |  $dbi->insert({key1 => 2}, table => 'table1', type_rule_off => 1); | 
| ... | ... | @@ -2671,9 +2673,11 @@ is($result->fetch->[0], 2); | 
| 2671 | 2673 | $dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); | 
| 2672 | 2674 |  $dbi->execute("create table table1 (key1 Date, key2 datetime)"); | 
| 2673 | 2675 | $dbi->type_rule( | 
| 2674 | -    Date => { | |
| 2675 | -        from => sub { $_[0] * 2 }, | |
| 2676 | -        into => sub { $_[0] * 3 }, | |
| 2676 | +    from => { | |
| 2677 | +        DATE => sub { $_[0] * 2 }, | |
| 2678 | + }, | |
| 2679 | +    into => { | |
| 2680 | +        DATE => sub { $_[0] * 3 }, | |
| 2677 | 2681 | } | 
| 2678 | 2682 | ); | 
| 2679 | 2683 |  $dbi->insert({key1 => 2}, table => 'table1', type_rule_off => 1); | 
| ... | ... | @@ -135,35 +135,30 @@ $dbi = DBIx::Custom->connect( | 
| 135 | 135 | ); | 
| 136 | 136 |  eval{$dbi->execute("create table date_test (date DATE, datetime DATETIME)")}; | 
| 137 | 137 | $dbi->type_rule( | 
| 138 | -    DATE => { | |
| 139 | -        into=> sub { | |
| 138 | +    into => { | |
| 139 | +        DATE=> sub { | |
| 140 | 140 | my $date = shift; | 
| 141 | 141 | $date =~ s/aaaaa//g; | 
| 142 | 142 | return $date; | 
| 143 | 143 | }, | 
| 144 | - }, | |
| 145 | -    DATETIME => { | |
| 146 | -        into => sub { | |
| 144 | +        DATETIME => sub { | |
| 147 | 145 | my $date = shift; | 
| 148 | 146 | $date =~ s/ccccc//g; | 
| 149 | 147 | return $date; | 
| 150 | - | |
| 151 | 148 | }, | 
| 152 | 149 | }, | 
| 153 | - # DATE | |
| 154 | -    9 => { | |
| 155 | -        from => sub { | |
| 156 | - my $date = shift; | |
| 157 | - $date .= 'bbbbb'; | |
| 158 | - return $date; | |
| 159 | - } | |
| 160 | - }, | |
| 161 | - # DATETIME or TIMPESTANM | |
| 162 | -    11 => { | |
| 163 | -        from => sub { | |
| 164 | - my $date = shift; | |
| 165 | - $date .= 'ddddd'; | |
| 166 | - return $date; | |
| 150 | +    from => { | |
| 151 | + # DATE | |
| 152 | +        9 => sub { | |
| 153 | + my $date = shift; | |
| 154 | + $date .= 'bbbbb'; | |
| 155 | + return $date; | |
| 156 | + }, | |
| 157 | + # DATETIME or TIMPESTANM | |
| 158 | +        11 => sub { | |
| 159 | + my $date = shift; | |
| 160 | + $date .= 'ddddd'; | |
| 161 | + return $date; | |
| 167 | 162 | } | 
| 168 | 163 | } | 
| 169 | 164 | ); |