| ... | ... | 
                  @@ -1,6 +1,7 @@  | 
              
| 1 | 1 | 
                  0.1712  | 
              
| 2 | 2 | 
                  - you can set any string as separator  | 
              
| 3 | 3 | 
                  - fixed memory leak and connection increasing bug, and query_buider method return new object.  | 
              
| 4 | 
                  + - added EXPERIMENTAL system_table attribute  | 
              |
| 4 | 5 | 
                  0.1711  | 
              
| 5 | 6 | 
                  - renamed EXPERIMENTAL available_type_name to available_typename  | 
              
| 6 | 7 | 
                  - renamed EXPERIMENTAL available_data_type to available_datatype  | 
              
| ... | ... | 
                  @@ -19,7 +19,7 @@ use Encode qw/encode encode_utf8 decode_utf8/;  | 
              
| 19 | 19 | 
                   use constant DEBUG => $ENV{DBIX_CUSTOM_DEBUG} || 0;
                 | 
              
| 20 | 20 | 
                   use constant DEBUG_ENCODING => $ENV{DBIX_CUSTOM_DEBUG_ENCODING} || 'UTF-8';
                 | 
              
| 21 | 21 | 
                   | 
              
| 22 | 
                  -has [qw/connector dsn password quote user/],  | 
              |
| 22 | 
                  +has [qw/connector dsn password quote user system_table/],  | 
              |
| 23 | 23 | 
                  cache => 0,  | 
              
| 24 | 24 | 
                       cache_method => sub {
                 | 
              
| 25 | 25 | 
                           sub {
                 | 
              
| ... | ... | 
                  @@ -57,26 +57,45 @@ has [qw/connector dsn password quote user/],  | 
              
| 57 | 57 | 
                       stash => sub { {} },
                 | 
              
| 58 | 58 | 
                  tag_parse => 1;  | 
              
| 59 | 59 | 
                   | 
              
| 60 | 
                  -sub query_builder {
                 | 
              |
| 60 | 
                  +sub available_datatype {
                 | 
              |
| 61 | 61 | 
                  my $self = shift;  | 
              
| 62 | 
                  - my $builder = DBIx::Custom::QueryBuilder->new(dbi => $self);  | 
              |
| 63 | 62 | 
                   | 
              
| 64 | 
                  - # DEPRECATED  | 
              |
| 65 | 
                  - $builder->register_tag(  | 
              |
| 66 | 
                  - '?' => \&DBIx::Custom::Tag::placeholder,  | 
              |
| 67 | 
                  - '=' => \&DBIx::Custom::Tag::equal,  | 
              |
| 68 | 
                  - '<>' => \&DBIx::Custom::Tag::not_equal,  | 
              |
| 69 | 
                  - '>' => \&DBIx::Custom::Tag::greater_than,  | 
              |
| 70 | 
                  - '<' => \&DBIx::Custom::Tag::lower_than,  | 
              |
| 71 | 
                  - '>=' => \&DBIx::Custom::Tag::greater_than_equal,  | 
              |
| 72 | 
                  - '<=' => \&DBIx::Custom::Tag::lower_than_equal,  | 
              |
| 73 | 
                  - 'like' => \&DBIx::Custom::Tag::like,  | 
              |
| 74 | 
                  - 'in' => \&DBIx::Custom::Tag::in,  | 
              |
| 75 | 
                  - 'insert_param' => \&DBIx::Custom::Tag::insert_param,  | 
              |
| 76 | 
                  - 'update_param' => \&DBIx::Custom::Tag::update_param  | 
              |
| 77 | 
                  - );  | 
              |
| 78 | 
                  -    $builder->register_tag($self->{_tags} || {});
                 | 
              |
| 79 | 
                  - return $builder;  | 
              |
| 63 | 
                  + my $data_types = '';  | 
              |
| 64 | 
                  +    foreach my $i (-1000 .. 1000) {
                 | 
              |
| 65 | 
                  + my $type_info = $self->dbh->type_info($i);  | 
              |
| 66 | 
                  +         my $data_type = $type_info->{DATA_TYPE};
                 | 
              |
| 67 | 
                  +         my $type_name = $type_info->{TYPE_NAME};
                 | 
              |
| 68 | 
                  + $data_types .= "$data_type ($type_name)\n"  | 
              |
| 69 | 
                  + if defined $data_type;  | 
              |
| 70 | 
                  + }  | 
              |
| 71 | 
                  + return "Data Type maybe equal to Type Name" unless $data_types;  | 
              |
| 72 | 
                  + $data_types = "Data Type (Type name)\n" . $data_types;  | 
              |
| 73 | 
                  + return $data_types;  | 
              |
| 74 | 
                  +}  | 
              |
| 75 | 
                  +  | 
              |
| 76 | 
                  +sub show_datatype {
                 | 
              |
| 77 | 
                  + my ($self, $table) = @_;  | 
              |
| 78 | 
                  +  | 
              |
| 79 | 
                  +  | 
              |
| 80 | 
                  +}  | 
              |
| 81 | 
                  +  | 
              |
| 82 | 
                  +sub show_typename {
                 | 
              |
| 83 | 
                  +  | 
              |
| 84 | 
                  +}  | 
              |
| 85 | 
                  +  | 
              |
| 86 | 
                  +sub available_typename {
                 | 
              |
| 87 | 
                  + my $self = shift;  | 
              |
| 88 | 
                  +  | 
              |
| 89 | 
                  + # Type Names  | 
              |
| 90 | 
                  +    my $type_names = {};
                 | 
              |
| 91 | 
                  +    $self->each_column(sub {
                 | 
              |
| 92 | 
                  + my ($self, $table, $column, $column_info) = @_;  | 
              |
| 93 | 
                  +        $type_names->{$column_info->{TYPE_NAME}} = 1
                 | 
              |
| 94 | 
                  +          if $column_info->{TYPE_NAME};
                 | 
              |
| 95 | 
                  + });  | 
              |
| 96 | 
                  + my @output = sort keys %$type_names;  | 
              |
| 97 | 
                  + unshift @output, "Type Name";  | 
              |
| 98 | 
                  + return join "\n", @output;  | 
              |
| 80 | 99 | 
                  }  | 
              
| 81 | 100 | 
                   | 
              
| 82 | 101 | 
                  our $AUTOLOAD;  | 
              
| ... | ... | 
                  @@ -281,6 +300,8 @@ sub create_model {
                 | 
              
| 281 | 300 | 
                   | 
              
| 282 | 301 | 
                   sub each_column {
                 | 
              
| 283 | 302 | 
                  my ($self, $cb) = @_;  | 
              
| 303 | 
                  +  | 
              |
| 304 | 
                  + my $re = $self->system_table;  | 
              |
| 284 | 305 | 
                   | 
              
| 285 | 306 | 
                  # Iterate all tables  | 
              
| 286 | 307 | 
                  my $sth_tables = $self->dbh->table_info;  | 
              
| ... | ... | 
                  @@ -288,6 +309,7 @@ sub each_column {
                 | 
              
| 288 | 309 | 
                   | 
              
| 289 | 310 | 
                  # Table  | 
              
| 290 | 311 | 
                           my $table = $table_info->{TABLE_NAME};
                 | 
              
| 312 | 
                  + next if defined $re && $table =~ /$re/;  | 
              |
| 291 | 313 | 
                   | 
              
| 292 | 314 | 
                  # Iterate all columns  | 
              
| 293 | 315 | 
                  my $sth_columns = $self->dbh->column_info(undef, undef, $table, '%');  | 
              
| ... | ... | 
                  @@ -298,15 +320,21 @@ sub each_column {
                 | 
              
| 298 | 320 | 
                  }  | 
              
| 299 | 321 | 
                  }  | 
              
| 300 | 322 | 
                   | 
              
| 323 | 
                  +  | 
              |
| 324 | 
                  +  | 
              |
| 325 | 
                  +  | 
              |
| 301 | 326 | 
                   sub each_table {
                 | 
              
| 302 | 327 | 
                  my ($self, $cb) = @_;  | 
              
| 303 | 328 | 
                   | 
              
| 329 | 
                  + my $re = $self->system_table;  | 
              |
| 330 | 
                  +  | 
              |
| 304 | 331 | 
                  # Iterate all tables  | 
              
| 305 | 332 | 
                  my $sth_tables = $self->dbh->table_info;  | 
              
| 306 | 333 | 
                       while (my $table_info = $sth_tables->fetchrow_hashref) {
                 | 
              
| 307 | 334 | 
                   | 
              
| 308 | 335 | 
                  # Table  | 
              
| 309 | 336 | 
                           my $table = $table_info->{TABLE_NAME};
                 | 
              
| 337 | 
                  + next if defined $re && $table =~ /$re/;  | 
              |
| 310 | 338 | 
                  $self->$cb($table, $table_info);  | 
              
| 311 | 339 | 
                  }  | 
              
| 312 | 340 | 
                  }  | 
              
| ... | ... | 
                  @@ -741,6 +769,28 @@ sub order {
                 | 
              
| 741 | 769 | 
                  return DBIx::Custom::Order->new(dbi => $self, @_);  | 
              
| 742 | 770 | 
                  }  | 
              
| 743 | 771 | 
                   | 
              
| 772 | 
                  +sub query_builder {
                 | 
              |
| 773 | 
                  + my $self = shift;  | 
              |
| 774 | 
                  + my $builder = DBIx::Custom::QueryBuilder->new(dbi => $self);  | 
              |
| 775 | 
                  +  | 
              |
| 776 | 
                  + # DEPRECATED  | 
              |
| 777 | 
                  + $builder->register_tag(  | 
              |
| 778 | 
                  + '?' => \&DBIx::Custom::Tag::placeholder,  | 
              |
| 779 | 
                  + '=' => \&DBIx::Custom::Tag::equal,  | 
              |
| 780 | 
                  + '<>' => \&DBIx::Custom::Tag::not_equal,  | 
              |
| 781 | 
                  + '>' => \&DBIx::Custom::Tag::greater_than,  | 
              |
| 782 | 
                  + '<' => \&DBIx::Custom::Tag::lower_than,  | 
              |
| 783 | 
                  + '>=' => \&DBIx::Custom::Tag::greater_than_equal,  | 
              |
| 784 | 
                  + '<=' => \&DBIx::Custom::Tag::lower_than_equal,  | 
              |
| 785 | 
                  + 'like' => \&DBIx::Custom::Tag::like,  | 
              |
| 786 | 
                  + 'in' => \&DBIx::Custom::Tag::in,  | 
              |
| 787 | 
                  + 'insert_param' => \&DBIx::Custom::Tag::insert_param,  | 
              |
| 788 | 
                  + 'update_param' => \&DBIx::Custom::Tag::update_param  | 
              |
| 789 | 
                  + );  | 
              |
| 790 | 
                  +    $builder->register_tag($self->{_tags} || {});
                 | 
              |
| 791 | 
                  + return $builder;  | 
              |
| 792 | 
                  +}  | 
              |
| 793 | 
                  +  | 
              |
| 744 | 794 | 
                   sub register_filter {
                 | 
              
| 745 | 795 | 
                  my $self = shift;  | 
              
| 746 | 796 | 
                   | 
              
| ... | ... | 
                  @@ -899,37 +949,6 @@ sub setup_model {
                 | 
              
| 899 | 949 | 
                  return $self;  | 
              
| 900 | 950 | 
                  }  | 
              
| 901 | 951 | 
                   | 
              
| 902 | 
                  -sub available_datatype {
                 | 
              |
| 903 | 
                  - my $self = shift;  | 
              |
| 904 | 
                  -  | 
              |
| 905 | 
                  - my $data_types = '';  | 
              |
| 906 | 
                  -    foreach my $i (-1000 .. 1000) {
                 | 
              |
| 907 | 
                  - my $type_info = $self->dbh->type_info($i);  | 
              |
| 908 | 
                  -         my $data_type = $type_info->{DATA_TYPE};
                 | 
              |
| 909 | 
                  -         my $type_name = $type_info->{TYPE_NAME};
                 | 
              |
| 910 | 
                  - $data_types .= "$data_type ($type_name)\n"  | 
              |
| 911 | 
                  - if defined $data_type;  | 
              |
| 912 | 
                  - }  | 
              |
| 913 | 
                  - return "Data Type maybe equal to Type Name" unless $data_types;  | 
              |
| 914 | 
                  - $data_types = "Data Type (Type name)\n" . $data_types;  | 
              |
| 915 | 
                  - return $data_types;  | 
              |
| 916 | 
                  -}  | 
              |
| 917 | 
                  -  | 
              |
| 918 | 
                  -sub available_typename {
                 | 
              |
| 919 | 
                  - my $self = shift;  | 
              |
| 920 | 
                  -  | 
              |
| 921 | 
                  - # Type Names  | 
              |
| 922 | 
                  -    my $type_names = {};
                 | 
              |
| 923 | 
                  -    $self->each_column(sub {
                 | 
              |
| 924 | 
                  - my ($self, $table, $column, $column_info) = @_;  | 
              |
| 925 | 
                  -        $type_names->{$column_info->{TYPE_NAME}} = 1
                 | 
              |
| 926 | 
                  -          if $column_info->{TYPE_NAME};
                 | 
              |
| 927 | 
                  - });  | 
              |
| 928 | 
                  - my @output = sort keys %$type_names;  | 
              |
| 929 | 
                  - unshift @output, "Type Name";  | 
              |
| 930 | 
                  - return join "\n", @output;  | 
              |
| 931 | 
                  -}  | 
              |
| 932 | 
                  -  | 
              |
| 933 | 952 | 
                   sub type_rule {
                 | 
              
| 934 | 953 | 
                  my $self = shift;  | 
              
| 935 | 954 | 
                   | 
              
| ... | ... | 
                  @@ -1995,6 +2014,18 @@ Note that you don't have to specify like '[\w]'.  | 
              
| 1995 | 2014 | 
                  Separator whichi join table and column.  | 
              
| 1996 | 2015 | 
                  This is used by C<column> and C<mycolumn> method.  | 
              
| 1997 | 2016 | 
                   | 
              
| 2017 | 
                  +=head2 C<system_table EXPERIMENTAL>  | 
              |
| 2018 | 
                  +  | 
              |
| 2019 | 
                  + my $system_table = $self->system_table;  | 
              |
| 2020 | 
                  + $dbi = $self->system_table(qr/pg_/);  | 
              |
| 2021 | 
                  +  | 
              |
| 2022 | 
                  +Regex matching system table.  | 
              |
| 2023 | 
                  +this regex match is used by C<each_table> method and C<each_column> method  | 
              |
| 2024 | 
                  +System table is ignored.  | 
              |
| 2025 | 
                  +C<type_rule> method and C<setup_model> method call  | 
              |
| 2026 | 
                  +C<each_table>, so if you set C<system_table> properly,  | 
              |
| 2027 | 
                  +The performance is up.  | 
              |
| 2028 | 
                  +  | 
              |
| 1998 | 2029 | 
                  =head2 C<tag_parse>  | 
              
| 1999 | 2030 | 
                   | 
              
| 2000 | 2031 | 
                  my $tag_parse = $dbi->tag_parse(0);  | 
              
| ... | ... | 
                  @@ -30,6 +30,37 @@ use DBIx::Custom;  | 
              
| 30 | 30 | 
                  has dsn => "dbi:Pg:dbname=dbix_custom";  | 
              
| 31 | 31 | 
                  has user => 'dbix_custom';  | 
              
| 32 | 32 | 
                  has password => 'dbix_custom';  | 
              
| 33 | 
                  +    has system_table => sub {
                 | 
              |
| 34 | 
                  +  | 
              |
| 35 | 
                  + return qr/^(  | 
              |
| 36 | 
                  + pg_|column_|role_|view_|sql_  | 
              |
| 37 | 
                  + |applicable_roles  | 
              |
| 38 | 
                  + |check_constraints  | 
              |
| 39 | 
                  + |columns  | 
              |
| 40 | 
                  + |constraint_column_usage  | 
              |
| 41 | 
                  + |constraint_table_usage  | 
              |
| 42 | 
                  + |data_type_privileges  | 
              |
| 43 | 
                  + |domain_constraints  | 
              |
| 44 | 
                  + |domain_udt_usage  | 
              |
| 45 | 
                  + |domains  | 
              |
| 46 | 
                  + |element_types  | 
              |
| 47 | 
                  + |enabled_roles  | 
              |
| 48 | 
                  + |information_schema_catalog_name  | 
              |
| 49 | 
                  + |key_column_usage  | 
              |
| 50 | 
                  + |parameters  | 
              |
| 51 | 
                  + |referential_constraints  | 
              |
| 52 | 
                  + |routine_privileges  | 
              |
| 53 | 
                  + |routines  | 
              |
| 54 | 
                  + |schemata  | 
              |
| 55 | 
                  + |table_constraints  | 
              |
| 56 | 
                  + |table_privileges  | 
              |
| 57 | 
                  + |tables  | 
              |
| 58 | 
                  + |triggered_update_columns  | 
              |
| 59 | 
                  + |triggers  | 
              |
| 60 | 
                  + |usage_privileges  | 
              |
| 61 | 
                  + |views  | 
              |
| 62 | 
                  + )/x  | 
              |
| 63 | 
                  + };  | 
              |
| 33 | 64 | 
                   | 
              
| 34 | 65 | 
                       sub create_table1 { 'create table table1 (key1 varchar(255), key2 varchar(255));' }
                 | 
              
| 35 | 66 | 
                       sub create_table1_2 {'create table table1 (key1 varchar(255), key2 varchar(255), '
                 |