| ... | ... |
@@ -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), '
|