| ... | ... | 
                  @@ -2,6 +2,8 @@  | 
              
| 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 | 4 | 
                  - added EXPERIMENTAL exclude_table attribute  | 
              
| 5 | 
                  + - added EXPERIMENTAL show_typename method  | 
              |
| 6 | 
                  + - added EXPERIMENTAL show_datatype method  | 
              |
| 5 | 7 | 
                  0.1711  | 
              
| 6 | 8 | 
                  - renamed EXPERIMENTAL available_type_name to available_typename  | 
              
| 7 | 9 | 
                  - renamed EXPERIMENTAL available_data_type to available_datatype  | 
              
| ... | ... | 
                  @@ -73,16 +73,6 @@ sub available_datatype {
                 | 
              
| 73 | 73 | 
                  return $data_types;  | 
              
| 74 | 74 | 
                  }  | 
              
| 75 | 75 | 
                   | 
              
| 76 | 
                  -sub show_datatype {
                 | 
              |
| 77 | 
                  - my ($self, $table) = @_;  | 
              |
| 78 | 
                  -  | 
              |
| 79 | 
                  -  | 
              |
| 80 | 
                  -}  | 
              |
| 81 | 
                  -  | 
              |
| 82 | 
                  -sub show_typename {
                 | 
              |
| 83 | 
                  -  | 
              |
| 84 | 
                  -}  | 
              |
| 85 | 
                  -  | 
              |
| 86 | 76 | 
                   sub available_typename {
                 | 
              
| 87 | 77 | 
                  my $self = shift;  | 
              
| 88 | 78 | 
                   | 
              
| ... | ... | 
                  @@ -320,9 +310,6 @@ sub each_column {
                 | 
              
| 320 | 310 | 
                  }  | 
              
| 321 | 311 | 
                  }  | 
              
| 322 | 312 | 
                   | 
              
| 323 | 
                  -  | 
              |
| 324 | 
                  -  | 
              |
| 325 | 
                  -  | 
              |
| 326 | 313 | 
                   sub each_table {
                 | 
              
| 327 | 314 | 
                  my ($self, $cb) = @_;  | 
              
| 328 | 315 | 
                   | 
              
| ... | ... | 
                  @@ -949,6 +936,39 @@ sub setup_model {
                 | 
              
| 949 | 936 | 
                  return $self;  | 
              
| 950 | 937 | 
                  }  | 
              
| 951 | 938 | 
                   | 
              
| 939 | 
                  +sub show_datatype {
                 | 
              |
| 940 | 
                  + my ($self, $table) = @_;  | 
              |
| 941 | 
                  + croak "Table name must be specified" unless defined $table;  | 
              |
| 942 | 
                  + print "$table\n";  | 
              |
| 943 | 
                  +  | 
              |
| 944 | 
                  + my $result = $self->select(table => $table, where => "'0' <> '0'");  | 
              |
| 945 | 
                  + my $sth = $result->sth;  | 
              |
| 946 | 
                  +  | 
              |
| 947 | 
                  +    my $columns = $sth->{NAME};
                 | 
              |
| 948 | 
                  +    my $data_types = $sth->{TYPE};
                 | 
              |
| 949 | 
                  +  | 
              |
| 950 | 
                  +    for (my $i = 0; $i < @$columns; $i++) {
                 | 
              |
| 951 | 
                  + my $column = $columns->[$i];  | 
              |
| 952 | 
                  + my $data_type = $data_types->[$i];  | 
              |
| 953 | 
                  + print "$column: $data_type\n";  | 
              |
| 954 | 
                  + }  | 
              |
| 955 | 
                  +}  | 
              |
| 956 | 
                  +  | 
              |
| 957 | 
                  +sub show_typename {
                 | 
              |
| 958 | 
                  + my ($self, $t) = @_;  | 
              |
| 959 | 
                  + croak "Table name must be specified" unless defined $t;  | 
              |
| 960 | 
                  + print "$t\n";  | 
              |
| 961 | 
                  +  | 
              |
| 962 | 
                  +    $self->each_column(sub {
                 | 
              |
| 963 | 
                  + my ($self, $table, $column, $infos) = @_;  | 
              |
| 964 | 
                  + return unless $table eq $t;  | 
              |
| 965 | 
                  +        my $typename = $infos->{TYPE_NAME};
                 | 
              |
| 966 | 
                  + print "$column: $typename\n";  | 
              |
| 967 | 
                  + });  | 
              |
| 968 | 
                  +  | 
              |
| 969 | 
                  + return $self;  | 
              |
| 970 | 
                  +}  | 
              |
| 971 | 
                  +  | 
              |
| 952 | 972 | 
                   sub type_rule {
                 | 
              
| 953 | 973 | 
                  my $self = shift;  | 
              
| 954 | 974 | 
                   | 
              
| ... | ... | 
                  @@ -3124,6 +3144,30 @@ C<columns> of model object is automatically set, parsing database information.  | 
              
| 3124 | 3144 | 
                  If environment variable C<DBIX_CUSTOM_DEBUG> is set to true,  | 
              
| 3125 | 3145 | 
                  executed SQL and bind values are printed to STDERR.  | 
              
| 3126 | 3146 | 
                   | 
              
| 3147 | 
                  +=head2 C<show_datatype EXPERIMENTAL>  | 
              |
| 3148 | 
                  +  | 
              |
| 3149 | 
                  + $dbi->show_datatype($table);  | 
              |
| 3150 | 
                  +  | 
              |
| 3151 | 
                  +Show data type of the columns of specified table.  | 
              |
| 3152 | 
                  +  | 
              |
| 3153 | 
                  + book  | 
              |
| 3154 | 
                  + title: 5  | 
              |
| 3155 | 
                  + issue_date: 91  | 
              |
| 3156 | 
                  +  | 
              |
| 3157 | 
                  +This data type is used in C<type_rule>'s C<from1> and C<from2>.  | 
              |
| 3158 | 
                  +  | 
              |
| 3159 | 
                  +=head2 C<show_typename EXPERIMENTAL>  | 
              |
| 3160 | 
                  +  | 
              |
| 3161 | 
                  + $dbi->show_typename($table);  | 
              |
| 3162 | 
                  +  | 
              |
| 3163 | 
                  +Show type name of the columns of specified table.  | 
              |
| 3164 | 
                  +  | 
              |
| 3165 | 
                  + book  | 
              |
| 3166 | 
                  + title: varchar  | 
              |
| 3167 | 
                  + issue_date: date  | 
              |
| 3168 | 
                  +  | 
              |
| 3169 | 
                  +This type name is used in C<type_rule>'s C<into1> and C<into2>.  | 
              |
| 3170 | 
                  +  | 
              |
| 3127 | 3171 | 
                  =head2 C<DBIX_CUSTOM_DEBUG_ENCODING>  | 
              
| 3128 | 3172 | 
                   | 
              
| 3129 | 3173 | 
                  DEBUG output encoding. Default to UTF-8.  | 
              
| ... | ... | 
                  @@ -3150,6 +3194,7 @@ L<DBIx::Custom>  | 
              
| 3150 | 3194 | 
                  default_bind_filter # will be removed at 2017/1/1  | 
              
| 3151 | 3195 | 
                  default_fetch_filter # will be removed at 2017/1/1  | 
              
| 3152 | 3196 | 
                  insert_param_tag # will be removed at 2017/1/1  | 
              
| 3197 | 
                  + register_tag # will be removed at 2017/1/1  | 
              |
| 3153 | 3198 | 
                  register_tag_processor # will be removed at 2017/1/1  | 
              
| 3154 | 3199 | 
                  update_param_tag # will be removed at 2017/1/1  | 
              
| 3155 | 3200 | 
                   | 
              
| ... | ... | 
                  @@ -30,7 +30,7 @@ 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 {
                 | 
              |
| 33 | 
                  +    has exclude_table => sub {
                 | 
              |
| 34 | 34 | 
                   | 
              
| 35 | 35 | 
                  return qr/^(  | 
              
| 36 | 36 | 
                  pg_|column_|role_|view_|sql_  | 
              
| ... | ... | 
                  @@ -45,6 +45,7 @@ use DBIx::Custom;  | 
              
| 45 | 45 | 
                  |domains  | 
              
| 46 | 46 | 
                  |element_types  | 
              
| 47 | 47 | 
                  |enabled_roles  | 
              
| 48 | 
                  + |information_schema  | 
              |
| 48 | 49 | 
                  |information_schema_catalog_name  | 
              
| 49 | 50 | 
                  |key_column_usage  | 
              
| 50 | 51 | 
                  |parameters  | 
              
| ... | ... | 
                  @@ -195,23 +195,11 @@ my $binary;  | 
              
| 195 | 195 | 
                  # Drop table  | 
              
| 196 | 196 | 
                   eval { $dbi->execute('drop table table1') };
                 | 
              
| 197 | 197 | 
                   | 
              
| 198 | 
                  -  | 
              |
| 199 | 
                  -  | 
              |
| 200 | 
                  -  | 
              |
| 201 | 
                  -  | 
              |
| 202 | 
                  -  | 
              |
| 203 | 
                  -  | 
              |
| 204 | 
                  -  | 
              |
| 205 | 
                  -  | 
              |
| 206 | 
                  -  | 
              |
| 207 | 
                  -  | 
              |
| 208 | 
                  -  | 
              |
| 209 | 
                  -  | 
              |
| 210 | 
                  -  | 
              |
| 211 | 198 | 
                  test 'type_rule into';  | 
              
| 212 | 199 | 
                  $dbi = DBIx::Custom->connect;  | 
              
| 213 | 200 | 
                   eval { $dbi->execute('drop table table1') };
                 | 
              
| 214 | 201 | 
                  $dbi->execute($create_table1_type);  | 
              
| 202 | 
                  +$DB::single = 1;  | 
              |
| 215 | 203 | 
                  $dbi->type_rule(  | 
              
| 216 | 204 | 
                       into1 => {
                 | 
              
| 217 | 205 | 
                           $date_typename => sub { '2010-' . $_[0] }
                 | 
              
| ... | ... | 
                  @@ -179,78 +179,7 @@ my $binary;  | 
              
| 179 | 179 | 
                  $dbi = DBIx::Custom->connect;  | 
              
| 180 | 180 | 
                   | 
              
| 181 | 181 | 
                  ### a little complex test  | 
              
| 182 | 
                  -test 'type_rule into';  | 
              |
| 183 | 
                  -$dbi = DBIx::Custom->connect;  | 
              |
| 184 | 
                  -$dbi->execute("create table table1 (key1 Date, key2 datetime)");
                 | 
              |
| 185 | 
                  -$dbi->type_rule(  | 
              |
| 186 | 
                  -    into1 => {
                 | 
              |
| 187 | 
                  -        date => sub { uc $_[0] }
                 | 
              |
| 188 | 
                  - }  | 
              |
| 189 | 
                  -);  | 
              |
| 190 | 
                  -$dbi->insert({key1 => 'a'}, table => 'table1');
                 | 
              |
| 191 | 
                  -$result = $dbi->select(table => 'table1');  | 
              |
| 192 | 
                  -is($result->one->{key1}, 'A');
                 | 
              |
| 193 | 182 | 
                   | 
              
| 194 | 
                  -$dbi = DBIx::Custom->connect;  | 
              |
| 195 | 
                  -$dbi->execute("create table table1 (key1 date, key2 datetime)");
                 | 
              |
| 196 | 
                  -$dbi->type_rule(  | 
              |
| 197 | 
                  - into1 => [  | 
              |
| 198 | 
                  -         [qw/date datetime/] => sub { uc $_[0] }
                 | 
              |
| 199 | 
                  - ]  | 
              |
| 200 | 
                  -);  | 
              |
| 201 | 
                  -$dbi->insert({key1 => 'a', key2 => 'b'}, table => 'table1');
                 | 
              |
| 202 | 
                  -$result = $dbi->select(table => 'table1');  | 
              |
| 203 | 
                  -$row = $result->one;  | 
              |
| 204 | 
                  -is($row->{key1}, 'A');
                 | 
              |
| 205 | 
                  -is($row->{key2}, 'B');
                 | 
              |
| 206 | 
                  -  | 
              |
| 207 | 
                  -$dbi = DBIx::Custom->connect;  | 
              |
| 208 | 
                  -$dbi->execute("create table table1 (key1 Date, key2 datetime)");
                 | 
              |
| 209 | 
                  -$dbi->insert({key1 => 'a', key2 => 'B'}, table => 'table1');
                 | 
              |
| 210 | 
                  -$dbi->type_rule(  | 
              |
| 211 | 
                  - into1 => [  | 
              |
| 212 | 
                  -        [qw/date datetime/] => sub { uc $_[0] }
                 | 
              |
| 213 | 
                  - ]  | 
              |
| 214 | 
                  -);  | 
              |
| 215 | 
                  -$result = $dbi->execute(  | 
              |
| 216 | 
                  - "select * from table1 where key1 = :key1 and key2 = :table1.key2;",  | 
              |
| 217 | 
                  -    param => {key1 => 'a', 'table1.key2' => 'b'}
                 | 
              |
| 218 | 
                  -);  | 
              |
| 219 | 
                  -$row = $result->one;  | 
              |
| 220 | 
                  -is($row->{key1}, 'a');
                 | 
              |
| 221 | 
                  -is($row->{key2}, 'B');
                 | 
              |
| 222 | 
                  -  | 
              |
| 223 | 
                  -$dbi = DBIx::Custom->connect;  | 
              |
| 224 | 
                  -$dbi->execute("create table table1 (key1 Date, key2 datetime)");
                 | 
              |
| 225 | 
                  -$dbi->insert({key1 => 'A', key2 => 'B'}, table => 'table1');
                 | 
              |
| 226 | 
                  -$dbi->type_rule(  | 
              |
| 227 | 
                  - into1 => [  | 
              |
| 228 | 
                  -        [qw/date datetime/] => sub { uc $_[0] }
                 | 
              |
| 229 | 
                  - ]  | 
              |
| 230 | 
                  -);  | 
              |
| 231 | 
                  -$result = $dbi->execute(  | 
              |
| 232 | 
                  - "select * from table1 where key1 = :key1 and key2 = :table1.key2;",  | 
              |
| 233 | 
                  -    param => {key1 => 'a', 'table1.key2' => 'b'},
                 | 
              |
| 234 | 
                  - table => 'table1'  | 
              |
| 235 | 
                  -);  | 
              |
| 236 | 
                  -$row = $result->one;  | 
              |
| 237 | 
                  -is($row->{key1}, 'A');
                 | 
              |
| 238 | 
                  -is($row->{key2}, 'B');
                 | 
              |
| 239 | 
                  -  | 
              |
| 240 | 
                  -$dbi = DBIx::Custom->connect;  | 
              |
| 241 | 
                  -$dbi->execute("create table table1 (key1 date, key2 datetime)");
                 | 
              |
| 242 | 
                  -$dbi->register_filter(twice => sub { $_[0] * 2 });
                 | 
              |
| 243 | 
                  -$dbi->type_rule(  | 
              |
| 244 | 
                  -    from1 => {
                 | 
              |
| 245 | 
                  - date => 'twice',  | 
              |
| 246 | 
                  - },  | 
              |
| 247 | 
                  -    into1 => {
                 | 
              |
| 248 | 
                  - date => 'twice',  | 
              |
| 249 | 
                  - }  | 
              |
| 250 | 
                  -);  | 
              |
| 251 | 
                  -$dbi->insert({key1 => 2}, table => 'table1');
                 | 
              |
| 252 | 
                  -$result = $dbi->select(table => 'table1');  | 
              |
| 253 | 
                  -is($result->fetch->[0], 8);  | 
              |
| 254 | 183 | 
                   | 
              
| 255 | 184 | 
                  test 'type_rule and filter order';  | 
              
| 256 | 185 | 
                  $dbi = DBIx::Custom->connect;  |