... | ... |
@@ -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; |