| ... | ... | 
                  @@ -1,3 +1,5 @@  | 
              
| 1 | 
                  +0.1714  | 
              |
| 2 | 
                  + - fixed not backword compatible change in 0.1712 query_buider  | 
              |
| 1 | 3 | 
                  0.1713  | 
              
| 2 | 4 | 
                  - fixed memory leak and connection increasing bug when using model.  | 
              
| 3 | 5 | 
                  0.1712  | 
              
| ... | ... | 
                  @@ -1,7 +1,7 @@  | 
              
| 1 | 1 | 
                  package DBIx::Custom;  | 
              
| 2 | 2 | 
                  use Object::Simple -base;  | 
              
| 3 | 3 | 
                   | 
              
| 4 | 
                  -our $VERSION = '0.1713';  | 
              |
| 4 | 
                  +our $VERSION = '0.1714';  | 
              |
| 5 | 5 | 
                  use 5.008001;  | 
              
| 6 | 6 | 
                   | 
              
| 7 | 7 | 
                  use Carp 'croak';  | 
              
| ... | ... | 
                  @@ -15,7 +15,7 @@ use DBIx::Custom::Tag;  | 
              
| 15 | 15 | 
                  use DBIx::Custom::Order;  | 
              
| 16 | 16 | 
                  use DBIx::Custom::Util qw/_array_to_hash _subname/;  | 
              
| 17 | 17 | 
                  use Encode qw/encode encode_utf8 decode_utf8/;  | 
              
| 18 | 
                  -use Scalar::Util qw/weaken isweak/;  | 
              |
| 18 | 
                  +use Scalar::Util qw/weaken/;  | 
              |
| 19 | 19 | 
                   | 
              
| 20 | 20 | 
                   use constant DEBUG => $ENV{DBIX_CUSTOM_DEBUG} || 0;
                 | 
              
| 21 | 21 | 
                   use constant DEBUG_ENCODING => $ENV{DBIX_CUSTOM_DEBUG_ENCODING} || 'UTF-8';
                 | 
              
| ... | ... | 
                  @@ -52,6 +52,12 @@ has [qw/connector dsn password quote user exclude_table/],  | 
              
| 52 | 52 | 
                  },  | 
              
| 53 | 53 | 
                  last_sql => '',  | 
              
| 54 | 54 | 
                       models => sub { {} },
                 | 
              
| 55 | 
                  +    query_builder => sub {
                 | 
              |
| 56 | 
                  + my $self = shift;  | 
              |
| 57 | 
                  + my $builder = DBIx::Custom::QueryBuilder->new(dbi => $self);  | 
              |
| 58 | 
                  +        weaken $builder->{dbi};
                 | 
              |
| 59 | 
                  + return $builder;  | 
              |
| 60 | 
                  + },  | 
              |
| 55 | 61 | 
                  result_class => 'DBIx::Custom::Result',  | 
              
| 56 | 62 | 
                  safety_character => '\w',  | 
              
| 57 | 63 | 
                  separator => '.',  | 
              
| ... | ... | 
                  @@ -252,9 +258,7 @@ sub delete {
                 | 
              
| 252 | 258 | 
                   | 
              
| 253 | 259 | 
                   sub delete_all { shift->delete(allow_delete_all => 1, @_) }
                 | 
              
| 254 | 260 | 
                   | 
              
| 255 | 
                  -sub DESTROY {
                 | 
              |
| 256 | 
                  -  | 
              |
| 257 | 
                  -}  | 
              |
| 261 | 
                  +sub DESTROY { }
                 | 
              |
| 258 | 262 | 
                   | 
              
| 259 | 263 | 
                   sub create_model {
                 | 
              
| 260 | 264 | 
                  my $self = shift;  | 
              
| ... | ... | 
                  @@ -269,7 +273,7 @@ sub create_model {
                 | 
              
| 269 | 273 | 
                   | 
              
| 270 | 274 | 
                  # Create model  | 
              
| 271 | 275 | 
                  my $model = $model_class->new($args);  | 
              
| 272 | 
                  - weaken $self unless isweak $self;  | 
              |
| 276 | 
                  +    weaken $model->{dbi};
                 | 
              |
| 273 | 277 | 
                  $model->name($model_name) unless $model->name;  | 
              
| 274 | 278 | 
                  $model->table($model_table) unless $model->table;  | 
              
| 275 | 279 | 
                   | 
              
| ... | ... | 
                  @@ -746,24 +750,9 @@ sub new {
                 | 
              
| 746 | 750 | 
                           croak qq{"$attr" is wrong name } . _subname
                 | 
              
| 747 | 751 | 
                  unless $self->can($attr);  | 
              
| 748 | 752 | 
                  }  | 
              
| 749 | 
                  -  | 
              |
| 750 | 
                  - return $self;  | 
              |
| 751 | 
                  -}  | 
              |
| 752 | 
                  -  | 
              |
| 753 | 
                  -my $not_exists = bless {}, 'DBIx::Custom::NotExists';
                 | 
              |
| 754 | 
                  -sub not_exists { $not_exists }
                 | 
              |
| 755 | 
                  -  | 
              |
| 756 | 
                  -sub order {
                 | 
              |
| 757 | 
                  - my $self = shift;  | 
              |
| 758 | 
                  - return DBIx::Custom::Order->new(dbi => $self, @_);  | 
              |
| 759 | 
                  -}  | 
              |
| 760 | 753 | 
                   | 
              
| 761 | 
                  -sub query_builder {
                 | 
              |
| 762 | 
                  - my $self = shift;  | 
              |
| 763 | 
                  - my $builder = DBIx::Custom::QueryBuilder->new(dbi => $self);  | 
              |
| 764 | 
                  -  | 
              |
| 765 | 754 | 
                  # DEPRECATED  | 
              
| 766 | 
                  - $builder->register_tag(  | 
              |
| 755 | 
                  +    $self->{_tags} = {
                 | 
              |
| 767 | 756 | 
                  '?' => \&DBIx::Custom::Tag::placeholder,  | 
              
| 768 | 757 | 
                  '=' => \&DBIx::Custom::Tag::equal,  | 
              
| 769 | 758 | 
                  '<>' => \&DBIx::Custom::Tag::not_equal,  | 
              
| ... | ... | 
                  @@ -775,9 +764,17 @@ sub query_builder {
                 | 
              
| 775 | 764 | 
                  'in' => \&DBIx::Custom::Tag::in,  | 
              
| 776 | 765 | 
                  'insert_param' => \&DBIx::Custom::Tag::insert_param,  | 
              
| 777 | 766 | 
                  'update_param' => \&DBIx::Custom::Tag::update_param  | 
              
| 778 | 
                  - );  | 
              |
| 779 | 
                  -    $builder->register_tag($self->{_tags} || {});
                 | 
              |
| 780 | 
                  - return $builder;  | 
              |
| 767 | 
                  + };  | 
              |
| 768 | 
                  +  | 
              |
| 769 | 
                  + return $self;  | 
              |
| 770 | 
                  +}  | 
              |
| 771 | 
                  +  | 
              |
| 772 | 
                  +my $not_exists = bless {}, 'DBIx::Custom::NotExists';
                 | 
              |
| 773 | 
                  +sub not_exists { $not_exists }
                 | 
              |
| 774 | 
                  +  | 
              |
| 775 | 
                  +sub order {
                 | 
              |
| 776 | 
                  + my $self = shift;  | 
              |
| 777 | 
                  + return DBIx::Custom::Order->new(dbi => $self, @_);  | 
              |
| 781 | 778 | 
                  }  | 
              
| 782 | 779 | 
                   | 
              
| 783 | 780 | 
                   sub register_filter {
                 | 
              
| ... | ... | 
                  @@ -248,8 +248,9 @@ sub _parse_tag {
                 | 
              
| 248 | 248 | 
                  next;  | 
              
| 249 | 249 | 
                  }  | 
              
| 250 | 250 | 
                  # Get tag  | 
              
| 251 | 
                  +            $self->dbi->{_tags} ||= {};
                 | 
              |
| 251 | 252 | 
                               my $tag = $self->tag_processors->{$tag_name}
                 | 
              
| 252 | 
                  -                             || $self->tags->{$tag_name};
                 | 
              |
| 253 | 
                  +                             || $self->dbi->{_tags}->{$tag_name};
                 | 
              |
| 253 | 254 | 
                  # Tag is not registered  | 
              
| 254 | 255 | 
                               croak qq{Tag "$tag_name" is not registered } . _subname
                 | 
              
| 255 | 256 | 
                  unless $tag;  | 
              
| ... | ... | 
                  @@ -4,6 +4,7 @@ use warnings;  | 
              
| 4 | 4 | 
                  use Encode qw/encode_utf8/;  | 
              
| 5 | 5 | 
                  use FindBin;  | 
              
| 6 | 6 | 
                  use lib "$FindBin::Bin/common";  | 
              
| 7 | 
                  +use Scalar::Util 'isweak';  | 
              |
| 7 | 8 | 
                   | 
              
| 8 | 9 | 
                  my $dbi;  | 
              
| 9 | 10 | 
                   | 
              
| ... | ... | 
                  @@ -208,6 +209,7 @@ $dbi->insert({key1 => '01-01'}, table => 'table1');
                 | 
              
| 208 | 209 | 
                  $result = $dbi->select(table => 'table1');  | 
              
| 209 | 210 | 
                   is($result->one->{key1}, '2010-01-01');
                 | 
              
| 210 | 211 | 
                   | 
              
| 212 | 
                  +$DB::single = 1;  | 
              |
| 211 | 213 | 
                  $dbi = DBIx::Custom->connect;  | 
              
| 212 | 214 | 
                   eval { $dbi->execute('drop table table1') };
                 | 
              
| 213 | 215 | 
                  $dbi->execute($create_table1_type);  | 
              
| ... | ... | 
                  @@ -3142,6 +3144,7 @@ is_deeply($result->all, [{'table1-key1' => 1, 'table1-key2' => 3},
                 | 
              
| 3142 | 3144 | 
                     {'table1-key1' => 2, 'table1-key2' => 2}]);
                 | 
              
| 3143 | 3145 | 
                   | 
              
| 3144 | 3146 | 
                  test 'tag_parse';  | 
              
| 3147 | 
                  +$DB::single = 1;  | 
              |
| 3145 | 3148 | 
                  $dbi = DBIx::Custom->connect;  | 
              
| 3146 | 3149 | 
                  $dbi->tag_parse(0);  | 
              
| 3147 | 3150 | 
                   eval { $dbi->execute('drop table table1') };
                 | 
              
| ... | ... | 
                  @@ -3327,14 +3330,16 @@ $datas = [  | 
              
| 3327 | 3330 | 
                   | 
              
| 3328 | 3331 | 
                   for (my $i = 0; $i < @$datas; $i++) {
                 | 
              
| 3329 | 3332 | 
                  my $data = $datas->[$i];  | 
              
| 3330 | 
                  - my $builder = DBIx::Custom->new->query_builder;  | 
              |
| 3333 | 
                  + my $dbi = DBIx::Custom->new;  | 
              |
| 3334 | 
                  + my $builder = $dbi->query_builder;  | 
              |
| 3331 | 3335 | 
                       my $query = $builder->build_query($data->{source});
                 | 
              
| 3332 | 3336 | 
                       is($query->{sql}, $data->{sql_expected}, "$data->{name} : sql");
                 | 
              
| 3333 | 3337 | 
                       is_deeply($query->columns, $data->{columns_expected}, "$data->{name} : columns");
                 | 
              
| 3334 | 3338 | 
                  }  | 
              
| 3335 | 3339 | 
                   | 
              
| 3336 | 
                  -$builder = DBIx::Custom->new->query_builder;  | 
              |
| 3337 | 
                  -$ret_val = $builder->register_tag(  | 
              |
| 3340 | 
                  +$dbi = DBIx::Custom->new;  | 
              |
| 3341 | 
                  +$builder = $dbi->query_builder;  | 
              |
| 3342 | 
                  +$dbi->register_tag(  | 
              |
| 3338 | 3343 | 
                       p => sub {
                 | 
              
| 3339 | 3344 | 
                  my @args = @_;  | 
              
| 3340 | 3345 | 
                   | 
              
| ... | ... | 
                  @@ -3347,9 +3352,6 @@ $ret_val = $builder->register_tag(  | 
              
| 3347 | 3352 | 
                   $query = $builder->build_query("{p a b}");
                 | 
              
| 3348 | 3353 | 
                   is($query->{sql}, "? a b;", "register_tag sql");
                 | 
              
| 3349 | 3354 | 
                   is_deeply($query->{columns}, [2], "register_tag columns");
                 | 
              
| 3350 | 
                  -isa_ok($ret_val, 'DBIx::Custom::QueryBuilder');  | 
              |
| 3351 | 
                  -  | 
              |
| 3352 | 
                  -$builder = DBIx::Custom->new->query_builder;  | 
              |
| 3353 | 3355 | 
                   | 
              
| 3354 | 3356 | 
                   eval{$builder->build_query('{? }')};
                 | 
              
| 3355 | 3357 | 
                   like($@, qr/\QColumn name must be specified in tag "{? }"/, "? not arguments");
                 | 
              
| ... | ... | 
                  @@ -3357,35 +3359,33 @@ like($@, qr/\QColumn name must be specified in tag "{? }"/, "? not arguments");
                 | 
              
| 3357 | 3359 | 
                   eval{$builder->build_query("{a }")};
                 | 
              
| 3358 | 3360 | 
                  like($@, qr/\QTag "a" is not registered/, "tag not exist");  | 
              
| 3359 | 3361 | 
                   | 
              
| 3360 | 
                  -$builder->register_tag({
                 | 
              |
| 3362 | 
                  +$dbi->register_tag({
                 | 
              |
| 3361 | 3363 | 
                  q => 'string'  | 
              
| 3362 | 3364 | 
                  });  | 
              
| 3363 | 3365 | 
                   | 
              
| 3364 | 3366 | 
                   eval{$builder->build_query("{q}", {})};
                 | 
              
| 3365 | 3367 | 
                  like($@, qr/Tag "q" must be sub reference/, "tag not code ref");  | 
              
| 3366 | 3368 | 
                   | 
              
| 3367 | 
                  -$builder->register_tag({
                 | 
              |
| 3369 | 
                  +$dbi->register_tag({
                 | 
              |
| 3368 | 3370 | 
                      r => sub {} 
                 | 
              
| 3369 | 3371 | 
                  });  | 
              
| 3370 | 3372 | 
                   | 
              
| 3371 | 3373 | 
                   eval{$builder->build_query("{r}")};
                 | 
              
| 3372 | 3374 | 
                  like($@, qr/\QTag "r" must return [STRING, ARRAY_REFERENCE]/, "tag return noting");  | 
              
| 3373 | 3375 | 
                   | 
              
| 3374 | 
                  -$builder->register_tag({
                 | 
              |
| 3376 | 
                  +$dbi->register_tag({
                 | 
              |
| 3375 | 3377 | 
                      s => sub { return ["a", ""]} 
                 | 
              
| 3376 | 3378 | 
                  });  | 
              
| 3377 | 3379 | 
                   | 
              
| 3378 | 3380 | 
                   eval{$builder->build_query("{s}")};
                 | 
              
| 3379 | 3381 | 
                  like($@, qr/\QTag "s" must return [STRING, ARRAY_REFERENCE]/, "tag return not array columns");  | 
              
| 3380 | 3382 | 
                   | 
              
| 3381 | 
                  -$builder->register_tag(  | 
              |
| 3383 | 
                  +$dbi->register_tag(  | 
              |
| 3382 | 3384 | 
                       t => sub {return ["a", []]}
                 | 
              
| 3383 | 3385 | 
                  );  | 
              
| 3384 | 3386 | 
                   | 
              
| 3385 | 3387 | 
                   | 
              
| 3386 | 
                  -test 'General error case';  | 
              |
| 3387 | 
                  -$builder = DBIx::Custom->new->query_builder;  | 
              |
| 3388 | 
                  -$builder->register_tag(  | 
              |
| 3388 | 
                  +$dbi->register_tag(  | 
              |
| 3389 | 3389 | 
                       a => sub {
                 | 
              
| 3390 | 3390 | 
                  return ["? ? ?", ['']];  | 
              
| 3391 | 3391 | 
                  }  |