| ... | ... | 
                  @@ -85,7 +85,7 @@ sub connect {
                 | 
              
| 85 | 85 | 
                  my $connect_info = $self->connect_info;  | 
              
| 86 | 86 | 
                   | 
              
| 87 | 87 | 
                       foreach my $key (keys %{$self->connect_info}) {
                 | 
              
| 88 | 
                  -        croak("connect_info '$key' is invald")
                 | 
              |
| 88 | 
                  +        croak("connect_info '$key' is wrong name")
                 | 
              |
| 89 | 89 | 
                             unless $VALID_CONNECT_INFO{$key};
                 | 
              
| 90 | 90 | 
                  }  | 
              
| 91 | 91 | 
                   | 
              
| ... | ... | 
                  @@ -319,6 +319,7 @@ sub create_sql {
                 | 
              
| 319 | 319 | 
                   | 
              
| 320 | 320 | 
                  our $TAG_SYNTAX = <<'EOS';  | 
              
| 321 | 321 | 
                  [tag] [expand]  | 
              
| 322 | 
                  +{? name}         ?
                 | 
              |
| 322 | 323 | 
                   {= name}         name = ?
                 | 
              
| 323 | 324 | 
                   {<> name}        name <> ?
                 | 
              
| 324 | 325 | 
                   | 
              
| ... | ... | 
                  @@ -364,7 +365,7 @@ sub parse {
                 | 
              
| 364 | 365 | 
                  my ($tag_name, @args) = split /\s+/, $tag;  | 
              
| 365 | 366 | 
                   | 
              
| 366 | 367 | 
                  $tag ||= '';  | 
              
| 367 | 
                  -            croak("Tag '$tag' in SQL template is invalid.\n\n" .
                 | 
              |
| 368 | 
                  +            croak("Tag '$tag' in SQL template is not exist.\n\n" .
                 | 
              |
| 368 | 369 | 
                  "SQL template tag syntax\n$TAG_SYNTAX\n\n" .  | 
              
| 369 | 370 | 
                  "Your SQL template is \n$original_template\n\n")  | 
              
| 370 | 371 | 
                                 unless $VALID_TAG_NAMES{$tag_name};
                 | 
              
| ... | ... | 
                  @@ -486,6 +487,8 @@ Version 0.0101  | 
              
| 486 | 487 | 
                   | 
              
| 487 | 488 | 
                  =head2 add_filter  | 
              
| 488 | 489 | 
                   | 
              
| 490 | 
                  +  | 
              |
| 491 | 
                  +  | 
              |
| 489 | 492 | 
                  =head2 bind_filter  | 
              
| 490 | 493 | 
                   | 
              
| 491 | 494 | 
                  =head2 clone  | 
              
| ... | ... | 
                  @@ -164,7 +164,7 @@ use Scalar::Util qw/blessed/;  | 
              
| 164 | 164 | 
                  );  | 
              
| 165 | 165 | 
                       eval{$dbi->connect};
                 | 
              
| 166 | 166 | 
                   | 
              
| 167 | 
                  - like($@, qr/connect_info 'no_exist' is invald/, 'no exist');  | 
              |
| 167 | 
                  + like($@, qr/connect_info 'no_exist' is wrong name/, 'no exist');  | 
              |
| 168 | 168 | 
                  }  | 
              
| 169 | 169 | 
                   | 
              
| 170 | 170 | 
                   {
                 | 
              
| ... | ... | 
                  @@ -1,6 +1,7 @@  | 
              
| 1 | 1 | 
                  use Test::More;  | 
              
| 2 | 2 | 
                  use strict;  | 
              
| 3 | 3 | 
                  use warnings;  | 
              
| 4 | 
                  +use DBI;  | 
              |
| 4 | 5 | 
                   | 
              
| 5 | 6 | 
                   BEGIN {
                 | 
              
| 6 | 7 | 
                       eval { require DBD::SQLite; 1 }
                 | 
              
| ... | ... | 
                  @@ -12,14 +13,57 @@ BEGIN {
                 | 
              
| 12 | 13 | 
                       use_ok('DBI::Custom');
                 | 
              
| 13 | 14 | 
                  }  | 
              
| 14 | 15 | 
                   | 
              
| 15 | 
                  -my $dbi = DBI::Custom->new(  | 
              |
| 16 | 
                  -   connect_info => {data_source => 'dbi:SQLite:dbname=:memory:'}
                 | 
              |
| 17 | 
                  -);  | 
              |
| 16 | 
                  +package Test::DBI::Custom;  | 
              |
| 17 | 
                  +use Object::Simple;  | 
              |
| 18 | 18 | 
                   | 
              
| 19 | 
                  -$dbi->query_raw_sql("create table t1 (k1 char(10), k2 char(10))");
                 | 
              |
| 19 | 
                  +sub dbi : Attr {}
                 | 
              |
| 20 | 20 | 
                   | 
              
| 21 | 
                  -{
                 | 
              |
| 22 | 
                  -    $dbi->query("insert into t1 {insert_values}",{insert_values => {k1 => 1, k2 => 2}});
                 | 
              |
| 21 | 
                  +sub new {
                 | 
              |
| 22 | 
                  + my $self = shift->SUPER::new;  | 
              |
| 23 | 
                  + my $dbi = DBI::Custom->new->connect_info(data_source => 'dbi:SQLite:dbname=:memory:');  | 
              |
| 24 | 
                  +  | 
              |
| 25 | 
                  + $dbi->connect;  | 
              |
| 26 | 
                  + $self->dbi($dbi);  | 
              |
| 27 | 
                  + return $self;  | 
              |
| 28 | 
                  +}  | 
              |
| 29 | 
                  +  | 
              |
| 30 | 
                  +sub create_table {
                 | 
              |
| 31 | 
                  + my ($self, $create_table) = @_;  | 
              |
| 32 | 
                  + $self->dbi->query_raw_sql($create_table);  | 
              |
| 33 | 
                  + return $self;  | 
              |
| 34 | 
                  +}  | 
              |
| 35 | 
                  +  | 
              |
| 36 | 
                  +sub create_table1 {
                 | 
              |
| 37 | 
                  + my $self = shift;  | 
              |
| 38 | 
                  +    $self->create_table("create table t1 (k1 char(255), k2 char(255), k3 char(255), k4 char(255), k5 char(255));");
                 | 
              |
| 39 | 
                  + return $self;  | 
              |
| 40 | 
                  +}  | 
              |
| 41 | 
                  +  | 
              |
| 42 | 
                  +sub insert {
                 | 
              |
| 43 | 
                  + my ($self, @values_list) = @_;  | 
              |
| 44 | 
                  + my $table = ref $values_list[0] ? '' : shift;  | 
              |
| 45 | 
                  + $table ||= 't1';  | 
              |
| 46 | 
                  +  | 
              |
| 47 | 
                  +    foreach my $values (@values_list) {
                 | 
              |
| 48 | 
                  + my $sql = $self->dbi->query(  | 
              |
| 49 | 
                  +            "insert into $table {insert_values}", {insert_values => $values}
                 | 
              |
| 50 | 
                  + );  | 
              |
| 51 | 
                  + }  | 
              |
| 52 | 
                  + return $self;  | 
              |
| 53 | 
                  +}  | 
              |
| 54 | 
                  +  | 
              |
| 55 | 
                  +sub test {
                 | 
              |
| 56 | 
                  + my ($self, $code) = @_;  | 
              |
| 57 | 
                  + $code->($self->dbi);  | 
              |
| 58 | 
                  +}  | 
              |
| 59 | 
                  +  | 
              |
| 60 | 
                  +Object::Simple->build_class;  | 
              |
| 61 | 
                  +  | 
              |
| 62 | 
                  +package main;  | 
              |
| 63 | 
                  +my $t = Test::DBI::Custom->new;  | 
              |
| 64 | 
                  +  | 
              |
| 65 | 
                  +$t->new->create_table1->insert({k1 => 1, k2 => 2}, {k1 => 3, k2 => 4})->test(sub {
                 | 
              |
| 66 | 
                  + my $dbi = shift;  | 
              |
| 23 | 67 | 
                   | 
              
| 24 | 68 | 
                       $dbi->fetch_filter(sub {
                 | 
              
| 25 | 69 | 
                  my ($key, $value) = @_;  | 
              
| ... | ... | 
                  @@ -36,4 +80,5 @@ $dbi->query_raw_sql("create table t1 (k1 char(10), k2 char(10))");
                 | 
              
| 36 | 80 | 
                  $result->finish;  | 
              
| 37 | 81 | 
                   | 
              
| 38 | 82 | 
                  is_deeply(\@values, [3, 2]);  | 
              
| 39 | 
                  -}  | 
              |
| 83 | 
                  +});  | 
              |
| 84 | 
                  +  | 
              
| ... | ... | 
                  @@ -1,38 +0,0 @@  | 
              
| 1 | 
                  -use Test::More;  | 
              |
| 2 | 
                  -use strict;  | 
              |
| 3 | 
                  -use warnings;  | 
              |
| 4 | 
                  -  | 
              |
| 5 | 
                  -# user password database  | 
              |
| 6 | 
                  -our ($U, $P, $D) = connect_info();  | 
              |
| 7 | 
                  -  | 
              |
| 8 | 
                  -plan skip_all => 'private MySQL test' unless $U;  | 
              |
| 9 | 
                  -  | 
              |
| 10 | 
                  -plan 'no_plan';  | 
              |
| 11 | 
                  -  | 
              |
| 12 | 
                  -use DBI::Custom;  | 
              |
| 13 | 
                  -use Scalar::Util 'blessed';  | 
              |
| 14 | 
                  -{
                 | 
              |
| 15 | 
                  - my $dbi = DBI::Custom->new(  | 
              |
| 16 | 
                  -        connect_info => {
                 | 
              |
| 17 | 
                  - user => $U,  | 
              |
| 18 | 
                  - password => $P,  | 
              |
| 19 | 
                  - data_source => "dbi:mysql:$D"  | 
              |
| 20 | 
                  - }  | 
              |
| 21 | 
                  - );  | 
              |
| 22 | 
                  - $dbi->connect;  | 
              |
| 23 | 
                  -  | 
              |
| 24 | 
                  - ok(blessed $dbi->dbh);  | 
              |
| 25 | 
                  - can_ok($dbi->dbh, qw/prepare/);  | 
              |
| 26 | 
                  -}  | 
              |
| 27 | 
                  -  | 
              |
| 28 | 
                  -sub connect_info {
                 | 
              |
| 29 | 
                  - my $file = 'password.tmp';  | 
              |
| 30 | 
                  - open my $fh, '<', $file  | 
              |
| 31 | 
                  - or return;  | 
              |
| 32 | 
                  -  | 
              |
| 33 | 
                  - my ($user, $password, $database) = split(/\s/, (<$fh>)[0]);  | 
              |
| 34 | 
                  -  | 
              |
| 35 | 
                  - close $fh;  | 
              |
| 36 | 
                  -  | 
              |
| 37 | 
                  - return ($user, $password, $database);  | 
              |
| 38 | 
                  -}  |