| ... | ... | 
                  @@ -1,3 +1,5 @@  | 
              
| 1 | 
                  +0.1628  | 
              |
| 2 | 
                  + added examples  | 
              |
| 1 | 3 | 
                  0.1627  | 
              
| 2 | 4 | 
                  added insert, update, update_all, delete, delete_all, select method to DBIx::Custom::Table  | 
              
| 3 | 5 | 
                  added experimental txn_scope  | 
              
| ... | ... | 
                  @@ -1,6 +1,6 @@  | 
              
| 1 | 1 | 
                  package DBIx::Custom;  | 
              
| 2 | 2 | 
                   | 
              
| 3 | 
                  -our $VERSION = '0.1627';  | 
              |
| 3 | 
                  +our $VERSION = '0.1628';  | 
              |
| 4 | 4 | 
                   | 
              
| 5 | 5 | 
                  use 5.008001;  | 
              
| 6 | 6 | 
                  use strict;  | 
              
| ... | ... | 
                  @@ -540,9 +540,9 @@ You can change Result class if you need.  | 
              
| 540 | 540 | 
                  my $dbi = DBIx::Custom->connect(...);  | 
              
| 541 | 541 | 
                       $dbi->result_class('Your::Result');
                 | 
              
| 542 | 542 | 
                   | 
              
| 543 | 
                  -=head3 Custamize SQL builder object  | 
              |
| 543 | 
                  +=head3 Custamize query builder object  | 
              |
| 544 | 544 | 
                   | 
              
| 545 | 
                  -You can custamize SQL builder object  | 
              |
| 545 | 
                  +You can custamize query builder object  | 
              |
| 546 | 546 | 
                   | 
              
| 547 | 547 | 
                  my $dbi = DBIx::Custom->connect(...);  | 
              
| 548 | 548 | 
                  $dbi->query_builder->register_tag_processor(  | 
              
| ... | ... | 
                  @@ -572,4 +572,43 @@ These method can be called from L<DBIx::Custom> object directory.  | 
              
| 572 | 572 | 
                  $dbi->update_or_insert;  | 
              
| 573 | 573 | 
                  $dbi->find_or_create;  | 
              
| 574 | 574 | 
                   | 
              
| 575 | 
                  +=head2 EXAMPLES  | 
              |
| 576 | 
                  +  | 
              |
| 577 | 
                  +=head3 Limit clause  | 
              |
| 578 | 
                  +  | 
              |
| 579 | 
                  + my $rows = $dbi->select(  | 
              |
| 580 | 
                  + table => 'table1',  | 
              |
| 581 | 
                  +        where => {key1 => 1},
                 | 
              |
| 582 | 
                  +        append => "order by key2 {limit 1 0}" # {limit COUNT OFFSET}
                 | 
              |
| 583 | 
                  + )->fetch_hash_all;  | 
              |
| 584 | 
                  +  | 
              |
| 585 | 
                  +SQLite  | 
              |
| 586 | 
                  +  | 
              |
| 587 | 
                  + $dbi->query_builder->register_tag_processor(  | 
              |
| 588 | 
                  +        limit => sub {
                 | 
              |
| 589 | 
                  + my ($count, $offset) = @_;  | 
              |
| 590 | 
                  +  | 
              |
| 591 | 
                  + my $s = '';  | 
              |
| 592 | 
                  + $s .= "limit $count";  | 
              |
| 593 | 
                  + $s .= " offset $offset" if defined $offset;  | 
              |
| 594 | 
                  +  | 
              |
| 595 | 
                  + return [$s, []];  | 
              |
| 596 | 
                  + }  | 
              |
| 597 | 
                  + );  | 
              |
| 598 | 
                  +  | 
              |
| 599 | 
                  +MySQL  | 
              |
| 600 | 
                  +  | 
              |
| 601 | 
                  + $dbi->query_builder->register_tag_processor(  | 
              |
| 602 | 
                  +        limit => sub {
                 | 
              |
| 603 | 
                  + my ($count, $offset) = @_;  | 
              |
| 604 | 
                  +  | 
              |
| 605 | 
                  + my $s = '';  | 
              |
| 606 | 
                  + $offset = 0 unless defined $offset;  | 
              |
| 607 | 
                  + $s .= "limit $offset";  | 
              |
| 608 | 
                  + $s .= ", $count";  | 
              |
| 609 | 
                  +  | 
              |
| 610 | 
                  + return [$s, []];  | 
              |
| 611 | 
                  + }  | 
              |
| 612 | 
                  + );  | 
              |
| 613 | 
                  +  | 
              |
| 575 | 614 | 
                  =cut  | 
              
| ... | ... | 
                  @@ -57,7 +57,7 @@ sub DESTROY { }
                 | 
              
| 57 | 57 | 
                   | 
              
| 58 | 58 | 
                  =head1 NAME  | 
              
| 59 | 59 | 
                   | 
              
| 60 | 
                  -DBIx::Custom::Model - Table base class(experimental)  | 
              |
| 60 | 
                  +DBIx::Custom::Table - Table base class(experimental)  | 
              |
| 61 | 61 | 
                   | 
              
| 62 | 62 | 
                  =head1 SYNOPSIS  | 
              
| 63 | 63 | 
                   | 
              
| ... | ... | 
                  @@ -794,4 +794,39 @@ $table->delete_all;  | 
              
| 794 | 794 | 
                  $rows = $table->select->fetch_hash_all;  | 
              
| 795 | 795 | 
                  is_deeply($rows, [], "$test: delete_all");  | 
              
| 796 | 796 | 
                   | 
              
| 797 | 
                  +test 'limit';  | 
              |
| 798 | 
                  +$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
                 | 
              |
| 799 | 
                  +$dbi->execute($CREATE_TABLE->{0});
                 | 
              |
| 800 | 
                  +$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
                 | 
              |
| 801 | 
                  +$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 4});
                 | 
              |
| 802 | 
                  +$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 6});
                 | 
              |
| 803 | 
                  +$dbi->query_builder->register_tag_processor(  | 
              |
| 804 | 
                  +    limit => sub {
                 | 
              |
| 805 | 
                  + my ($count, $offset) = @_;  | 
              |
| 806 | 
                  +  | 
              |
| 807 | 
                  + my $s = '';  | 
              |
| 808 | 
                  + $s .= "limit $count";  | 
              |
| 809 | 
                  + $s .= " offset $offset" if defined $offset;  | 
              |
| 810 | 
                  +  | 
              |
| 811 | 
                  + return [$s, []];  | 
              |
| 812 | 
                  + }  | 
              |
| 813 | 
                  +);  | 
              |
| 814 | 
                  +$rows = $dbi->select(  | 
              |
| 815 | 
                  + table => 'table1',  | 
              |
| 816 | 
                  +  where => {key1 => 1},
                 | 
              |
| 817 | 
                  +  append => "order by key2 {limit 1 0}"
                 | 
              |
| 818 | 
                  +)->fetch_hash_all;  | 
              |
| 819 | 
                  +is_deeply($rows, [{key1 => 1, key2 => 2}], $test);
                 | 
              |
| 820 | 
                  +$rows = $dbi->select(  | 
              |
| 821 | 
                  + table => 'table1',  | 
              |
| 822 | 
                  +  where => {key1 => 1},
                 | 
              |
| 823 | 
                  +  append => "order by key2 {limit 2 1}"
                 | 
              |
| 824 | 
                  +)->fetch_hash_all;  | 
              |
| 825 | 
                  +is_deeply($rows, [{key1 => 1, key2 => 4},{key1 => 1, key2 => 6}], $test);
                 | 
              |
| 826 | 
                  +$rows = $dbi->select(  | 
              |
| 827 | 
                  + table => 'table1',  | 
              |
| 828 | 
                  +  where => {key1 => 1},
                 | 
              |
| 829 | 
                  +  append => "order by key2 {limit 1}"
                 | 
              |
| 830 | 
                  +)->fetch_hash_all;  | 
              |
| 831 | 
                  +is_deeply($rows, [{key1 => 1, key2 => 2}], $test);
                 | 
              |
| 797 | 832 | 
                   | 
              
| ... | ... | 
                  @@ -1,51 +1,99 @@  | 
              
| 1 | 
                  -use Test::More;  | 
              |
| 2 | 
                  -use strict;  | 
              |
| 3 | 
                  -use warnings;  | 
              |
| 4 | 
                  -  | 
              |
| 5 | 
                  -# user password database  | 
              |
| 6 | 
                  -our ($USER, $PASSWORD, $DATABASE) = connect_info();  | 
              |
| 7 | 
                  -  | 
              |
| 8 | 
                  -plan skip_all => 'private MySQL test' unless $USER;  | 
              |
| 9 | 
                  -  | 
              |
| 10 | 
                  -plan 'no_plan';  | 
              |
| 11 | 
                  -  | 
              |
| 12 | 
                  -# Function for test name  | 
              |
| 13 | 
                  -my $test;  | 
              |
| 14 | 
                  -sub test {
                 | 
              |
| 15 | 
                  - $test = shift;  | 
              |
| 16 | 
                  -}  | 
              |
| 17 | 
                  -  | 
              |
| 18 | 
                  -  | 
              |
| 19 | 
                  -# Functions for tests  | 
              |
| 20 | 
                  -sub connect_info {
                 | 
              |
| 21 | 
                  - my $file = 'password.tmp';  | 
              |
| 22 | 
                  - open my $fh, '<', $file  | 
              |
| 23 | 
                  - or return;  | 
              |
| 24 | 
                  -  | 
              |
| 25 | 
                  - my ($user, $password, $database) = split(/\s/, (<$fh>)[0]);  | 
              |
| 26 | 
                  -  | 
              |
| 27 | 
                  - close $fh;  | 
              |
| 28 | 
                  -  | 
              |
| 29 | 
                  - return ($user, $password, $database);  | 
              |
| 30 | 
                  -}  | 
              |
| 31 | 
                  -  | 
              |
| 32 | 
                  -  | 
              |
| 33 | 
                  -# Varialbes for tests  | 
              |
| 34 | 
                  -my $dbi;  | 
              |
| 35 | 
                  -my $dbname;  | 
              |
| 36 | 
                  -  | 
              |
| 37 | 
                  -use DBIx::Custom::MySQL;  | 
              |
| 38 | 
                  -  | 
              |
| 39 | 
                  -test 'connect';  | 
              |
| 40 | 
                  -$dbi = DBIx::Custom::MySQL->new(user => $USER, password => $PASSWORD,  | 
              |
| 41 | 
                  - database => $DATABASE, host => 'localhost', port => '10000');  | 
              |
| 42 | 
                  -$dbi->connect;  | 
              |
| 43 | 
                  -like($dbi->data_source, qr/dbi:mysql:database=.*;host=localhost;port=10000;/, "$test : created data source");  | 
              |
| 44 | 
                  -is(ref $dbi->dbh, 'DBI::db', $test);  | 
              |
| 45 | 
                  -  | 
              |
| 46 | 
                  -test 'attributes';  | 
              |
| 47 | 
                  -$dbi = DBIx::Custom::MySQL->new;  | 
              |
| 48 | 
                  -$dbi->host('a');
                 | 
              |
| 49 | 
                  -is($dbi->host, 'a', "$test: host");  | 
              |
| 50 | 
                  -$dbi->port('b');
                 | 
              |
| 51 | 
                  -is($dbi->port, 'b', "$test: port");  | 
              |
| 1 | 
                  +use Test::More;  | 
              |
| 2 | 
                  +use strict;  | 
              |
| 3 | 
                  +use warnings;  | 
              |
| 4 | 
                  +  | 
              |
| 5 | 
                  +# user password database  | 
              |
| 6 | 
                  +our ($USER, $PASSWORD, $DATABASE) = connect_info();  | 
              |
| 7 | 
                  +  | 
              |
| 8 | 
                  +plan skip_all => 'private MySQL test' unless $USER;  | 
              |
| 9 | 
                  +  | 
              |
| 10 | 
                  +plan 'no_plan';  | 
              |
| 11 | 
                  +  | 
              |
| 12 | 
                  +# Function for test name  | 
              |
| 13 | 
                  +my $test;  | 
              |
| 14 | 
                  +sub test {
                 | 
              |
| 15 | 
                  + $test = shift;  | 
              |
| 16 | 
                  +}  | 
              |
| 17 | 
                  +  | 
              |
| 18 | 
                  +  | 
              |
| 19 | 
                  +# Functions for tests  | 
              |
| 20 | 
                  +sub connect_info {
                 | 
              |
| 21 | 
                  + my $file = 'password.tmp';  | 
              |
| 22 | 
                  + open my $fh, '<', $file  | 
              |
| 23 | 
                  + or return;  | 
              |
| 24 | 
                  +  | 
              |
| 25 | 
                  + my ($user, $password, $database) = split(/\s/, (<$fh>)[0]);  | 
              |
| 26 | 
                  +  | 
              |
| 27 | 
                  + close $fh;  | 
              |
| 28 | 
                  +  | 
              |
| 29 | 
                  + return ($user, $password, $database);  | 
              |
| 30 | 
                  +}  | 
              |
| 31 | 
                  +  | 
              |
| 32 | 
                  +  | 
              |
| 33 | 
                  +# Varialbes for tests  | 
              |
| 34 | 
                  +my $dbi;  | 
              |
| 35 | 
                  +my $dbname;  | 
              |
| 36 | 
                  +my $rows;  | 
              |
| 37 | 
                  +  | 
              |
| 38 | 
                  +# Constant varialbes for test  | 
              |
| 39 | 
                  +my $CREATE_TABLE = {
                 | 
              |
| 40 | 
                  + 0 => 'create table table1 (key1 char(255), key2 char(255));'  | 
              |
| 41 | 
                  +};  | 
              |
| 42 | 
                  +  | 
              |
| 43 | 
                  +  | 
              |
| 44 | 
                  +use DBIx::Custom::MySQL;  | 
              |
| 45 | 
                  +  | 
              |
| 46 | 
                  +test 'connect';  | 
              |
| 47 | 
                  +$dbi = DBIx::Custom::MySQL->new(user => $USER, password => $PASSWORD,  | 
              |
| 48 | 
                  + database => $DATABASE, host => 'localhost', port => '10000');  | 
              |
| 49 | 
                  +$dbi->connect;  | 
              |
| 50 | 
                  +like($dbi->data_source, qr/dbi:mysql:database=.*;host=localhost;port=10000;/, "$test : created data source");  | 
              |
| 51 | 
                  +is(ref $dbi->dbh, 'DBI::db', $test);  | 
              |
| 52 | 
                  +  | 
              |
| 53 | 
                  +test 'attributes';  | 
              |
| 54 | 
                  +$dbi = DBIx::Custom::MySQL->new;  | 
              |
| 55 | 
                  +$dbi->host('a');
                 | 
              |
| 56 | 
                  +is($dbi->host, 'a', "$test: host");  | 
              |
| 57 | 
                  +$dbi->port('b');
                 | 
              |
| 58 | 
                  +is($dbi->port, 'b', "$test: port");  | 
              |
| 59 | 
                  +  | 
              |
| 60 | 
                  +test 'limit';  | 
              |
| 61 | 
                  +$dbi = DBIx::Custom->connect(  | 
              |
| 62 | 
                  + data_source => "dbi:mysql:database=$DATABASE",  | 
              |
| 63 | 
                  + user => $USER,  | 
              |
| 64 | 
                  + password => $PASSWORD  | 
              |
| 65 | 
                  +);  | 
              |
| 66 | 
                  +$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
                 | 
              |
| 67 | 
                  +$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 4});
                 | 
              |
| 68 | 
                  +$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 6});
                 | 
              |
| 69 | 
                  +$dbi->query_builder->register_tag_processor(  | 
              |
| 70 | 
                  +    limit => sub {
                 | 
              |
| 71 | 
                  + my ($count, $offset) = @_;  | 
              |
| 72 | 
                  +  | 
              |
| 73 | 
                  + my $s = '';  | 
              |
| 74 | 
                  + $offset = 0 unless defined $offset;  | 
              |
| 75 | 
                  + $s .= "limit $offset";  | 
              |
| 76 | 
                  + $s .= ", $count";  | 
              |
| 77 | 
                  +  | 
              |
| 78 | 
                  + return [$s, []];  | 
              |
| 79 | 
                  + }  | 
              |
| 80 | 
                  +);  | 
              |
| 81 | 
                  +$rows = $dbi->select(  | 
              |
| 82 | 
                  + table => 'table1',  | 
              |
| 83 | 
                  +  where => {key1 => 1},
                 | 
              |
| 84 | 
                  +  append => "order by key2 {limit 1 0}"
                 | 
              |
| 85 | 
                  +)->fetch_hash_all;  | 
              |
| 86 | 
                  +is_deeply($rows, [{key1 => 1, key2 => 2}], $test);
                 | 
              |
| 87 | 
                  +$rows = $dbi->select(  | 
              |
| 88 | 
                  + table => 'table1',  | 
              |
| 89 | 
                  +  where => {key1 => 1},
                 | 
              |
| 90 | 
                  +  append => "order by key2 {limit 2 1}"
                 | 
              |
| 91 | 
                  +)->fetch_hash_all;  | 
              |
| 92 | 
                  +is_deeply($rows, [{key1 => 1, key2 => 4},{key1 => 1, key2 => 6}], $test);
                 | 
              |
| 93 | 
                  +$rows = $dbi->select(  | 
              |
| 94 | 
                  + table => 'table1',  | 
              |
| 95 | 
                  +  where => {key1 => 1},
                 | 
              |
| 96 | 
                  +  append => "order by key2 {limit 1}"
                 | 
              |
| 97 | 
                  +)->fetch_hash_all;  | 
              |
| 98 | 
                  +is_deeply($rows, [{key1 => 1, key2 => 2}], $test);
                 | 
              |
| 99 | 
                  +$dbi->delete_all(table => 'table1');  |