| ... | ... |
@@ -1,3 +1,5 @@ |
| 1 |
+0.24 |
|
| 2 |
+ - support full-qualified table name. |
|
| 1 | 3 |
0.23 |
| 2 | 4 |
- DBIx::Custom::Mapper::map method support |
| 3 | 5 |
{value => '%<value>%'} syntax
|
| ... | ... |
@@ -790,16 +790,32 @@ sub include_model {
|
| 790 | 790 |
if $@; |
| 791 | 791 |
|
| 792 | 792 |
# Search model modules |
| 793 |
+ $DB::single = 1; |
|
| 793 | 794 |
my $path = $INC{"$name_space.pm"};
|
| 794 | 795 |
$path =~ s/\.pm$//; |
| 795 | 796 |
opendir my $dh, $path |
| 796 | 797 |
or croak qq{Can't open directory "$path": $! } . _subname
|
| 797 |
- $model_infos = []; |
|
| 798 |
- while (my $module = readdir $dh) {
|
|
| 799 |
- push @$model_infos, $module |
|
| 800 |
- if $module =~ s/\.pm$//; |
|
| 798 |
+ my @modules; |
|
| 799 |
+ while (my $file = readdir $dh) {
|
|
| 800 |
+ my $file_abs = "$path/$file"; |
|
| 801 |
+ if (-d $file_abs) {
|
|
| 802 |
+ next if $file eq '.' || $file eq '..'; |
|
| 803 |
+ opendir my $fq_dh, $file_abs |
|
| 804 |
+ or croak qq{Can't open directory "$file_abs": $! } . _subname;
|
|
| 805 |
+ while (my $fq_file = readdir $fq_dh) {
|
|
| 806 |
+ my $fq_file_abs = "$file_abs/$fq_file"; |
|
| 807 |
+ push @modules, "${file}::$fq_file" if -f $fq_file_abs;
|
|
| 808 |
+ } |
|
| 809 |
+ close $fq_dh; |
|
| 810 |
+ } |
|
| 811 |
+ elsif(-f $file_abs) { push @modules, $file }
|
|
| 801 | 812 |
} |
| 802 | 813 |
close $dh; |
| 814 |
+ |
|
| 815 |
+ $model_infos = []; |
|
| 816 |
+ for my $module (@modules) {
|
|
| 817 |
+ if ($module =~ s/\.pm$//) { push @$model_infos, $module }
|
|
| 818 |
+ } |
|
| 803 | 819 |
} |
| 804 | 820 |
|
| 805 | 821 |
# Include models |
| ... | ... |
@@ -817,7 +833,12 @@ sub include_model {
|
| 817 | 833 |
$model_name ||= $model_class; |
| 818 | 834 |
$model_table ||= $model_name; |
| 819 | 835 |
} |
| 820 |
- else { $model_class = $model_name = $model_table = $model_info }
|
|
| 836 |
+ else {
|
|
| 837 |
+ $model_class = $model_name = $model_table = $model_info; |
|
| 838 |
+ $model_name =~ s/::/./; |
|
| 839 |
+ $model_table =~ s/::/./; |
|
| 840 |
+ } |
|
| 841 |
+ |
|
| 821 | 842 |
my $mclass = "${name_space}::$model_class";
|
| 822 | 843 |
croak qq{"$mclass" is invalid class name } . _subname
|
| 823 | 844 |
if $mclass =~ /[^\w:]/; |
| ... | ... |
@@ -3100,6 +3121,14 @@ You can get model object by C<model>. |
| 3100 | 3121 |
my $book_model = $dbi->model('book');
|
| 3101 | 3122 |
my $company_model = $dbi->model('company');
|
| 3102 | 3123 |
|
| 3124 |
+You can include full-qualified table name like C<main.book> |
|
| 3125 |
+ |
|
| 3126 |
+ lib / MyModel.pm |
|
| 3127 |
+ / MyModel / main / book.pm |
|
| 3128 |
+ / company.pm |
|
| 3129 |
+ |
|
| 3130 |
+ my $main_book = $self->model('main.book');
|
|
| 3131 |
+ |
|
| 3103 | 3132 |
See L<DBIx::Custom::Model> to know model features. |
| 3104 | 3133 |
|
| 3105 | 3134 |
=head2 C<like_value> |
| ... | ... |
@@ -2,7 +2,7 @@ use strict; |
| 2 | 2 |
use warnings; |
| 3 | 3 |
|
| 4 | 4 |
use FindBin; |
| 5 |
-use lib "$FindBin::Bin/common"; |
|
| 5 |
+use lib "$FindBin::Bin/common_fullqualified"; |
|
| 6 | 6 |
$ENV{DBIX_CUSTOM_TEST_RUN} = 1;
|
| 7 | 7 |
|
| 8 | 8 |
use DBIx::Custom; |
| ... | ... |
@@ -1325,7 +1325,6 @@ is_deeply($rows, [{$key1 => 1, $key2 => 2}], "filter");
|
| 1325 | 1325 |
eval { $dbi->execute("drop table $table2") };
|
| 1326 | 1326 |
$dbi->execute($create_table2); |
| 1327 | 1327 |
$dbi->insert({$key1 => 1, $key3 => 5}, table => $table2);
|
| 1328 |
-$DB::single = 1; |
|
| 1329 | 1328 |
$rows = $dbi->select( |
| 1330 | 1329 |
table => [$table1, $table2], |
| 1331 | 1330 |
column => "$table1.$key1 as " . u("${table1}_$key1")
|
| ... | ... |
@@ -0,0 +1,19 @@ |
| 1 |
+package MyDBI1; |
|
| 2 |
+ |
|
| 3 |
+use strict; |
|
| 4 |
+use warnings; |
|
| 5 |
+ |
|
| 6 |
+use base 'DBIx::Custom'; |
|
| 7 |
+ |
|
| 8 |
+sub connect {
|
|
| 9 |
+ my $self = shift->SUPER::connect(@_); |
|
| 10 |
+ |
|
| 11 |
+ $self->include_model( |
|
| 12 |
+ MyModel1 => [ |
|
| 13 |
+ $self->table1, |
|
| 14 |
+ $self->table2 |
|
| 15 |
+ ] |
|
| 16 |
+ ); |
|
| 17 |
+} |
|
| 18 |
+ |
|
| 19 |
+1; |
| ... | ... |
@@ -0,0 +1,13 @@ |
| 1 |
+package MyModel1::main::table1; |
|
| 2 |
+ |
|
| 3 |
+use DBIx::Custom::Model -base; |
|
| 4 |
+ |
|
| 5 |
+sub insert {
|
|
| 6 |
+ my ($self, $param) = @_; |
|
| 7 |
+ |
|
| 8 |
+ return $self->SUPER::insert(param => $param); |
|
| 9 |
+} |
|
| 10 |
+ |
|
| 11 |
+sub list { shift->select; }
|
|
| 12 |
+ |
|
| 13 |
+1; |
| ... | ... |
@@ -0,0 +1,17 @@ |
| 1 |
+package MyModel1::main::table2; |
|
| 2 |
+ |
|
| 3 |
+use strict; |
|
| 4 |
+use warnings; |
|
| 5 |
+ |
|
| 6 |
+use base 'DBIx::Custom::Model'; |
|
| 7 |
+ |
|
| 8 |
+ |
|
| 9 |
+sub insert {
|
|
| 10 |
+ my ($self, $param) = @_; |
|
| 11 |
+ |
|
| 12 |
+ return $self->SUPER::insert(param => $param); |
|
| 13 |
+} |
|
| 14 |
+ |
|
| 15 |
+sub list { shift->select; }
|
|
| 16 |
+ |
|
| 17 |
+1; |
| ... | ... |
@@ -0,0 +1,5 @@ |
| 1 |
+package MyModel4; |
|
| 2 |
+ |
|
| 3 |
+use base 'DBIx::Custom::Model'; |
|
| 4 |
+ |
|
| 5 |
+1; |
| ... | ... |
@@ -0,0 +1,9 @@ |
| 1 |
+package MyModel4::main::table1; |
|
| 2 |
+ |
|
| 3 |
+use MyModel4 -base; |
|
| 4 |
+ |
|
| 5 |
+has table => 'main.table1'; |
|
| 6 |
+ |
|
| 7 |
+sub list { shift->select }
|
|
| 8 |
+ |
|
| 9 |
+1; |
| ... | ... |
@@ -0,0 +1,8 @@ |
| 1 |
+package MyModel4::main::table2; |
|
| 2 |
+ |
|
| 3 |
+use base 'MyModel4'; |
|
| 4 |
+ |
|
| 5 |
+sub insert { shift->SUPER::insert(param => $_[0]) }
|
|
| 6 |
+sub list { shift->select }
|
|
| 7 |
+ |
|
| 8 |
+1; |
| ... | ... |
@@ -0,0 +1,5 @@ |
| 1 |
+package MyModel5; |
|
| 2 |
+ |
|
| 3 |
+use base 'DBIx::Custom::Model'; |
|
| 4 |
+ |
|
| 5 |
+1; |
| ... | ... |
@@ -0,0 +1,7 @@ |
| 1 |
+package MyModel5::main::table1; |
|
| 2 |
+ |
|
| 3 |
+use MyModel5 -base; |
|
| 4 |
+ |
|
| 5 |
+has primary_key => sub { ['key1', 'key2'] };
|
|
| 6 |
+ |
|
| 7 |
+1; |
| ... | ... |
@@ -0,0 +1,12 @@ |
| 1 |
+package MyModel5::main::table2; |
|
| 2 |
+ |
|
| 3 |
+use strict; |
|
| 4 |
+use warnings; |
|
| 5 |
+ |
|
| 6 |
+use base 'MyModel5'; |
|
| 7 |
+ |
|
| 8 |
+__PACKAGE__->attr(table => 'main.table2'); |
|
| 9 |
+ |
|
| 10 |
+__PACKAGE__->attr('primary_key' => sub { ['key1', 'key2'] });
|
|
| 11 |
+ |
|
| 12 |
+1; |
| ... | ... |
@@ -0,0 +1,13 @@ |
| 1 |
+package MyModel5::main::table3; |
|
| 2 |
+ |
|
| 3 |
+use strict; |
|
| 4 |
+use warnings; |
|
| 5 |
+ |
|
| 6 |
+use base 'MyModel5'; |
|
| 7 |
+ |
|
| 8 |
+__PACKAGE__->attr(name => 'main.table3'); |
|
| 9 |
+__PACKAGE__->attr(table => 'main.table3'); |
|
| 10 |
+ |
|
| 11 |
+__PACKAGE__->attr('primary_key' => sub { ['key1', 'key2'] });
|
|
| 12 |
+ |
|
| 13 |
+1; |
| ... | ... |
@@ -0,0 +1,5 @@ |
| 1 |
+package MyModel6; |
|
| 2 |
+ |
|
| 3 |
+use base 'DBIx::Custom::Model'; |
|
| 4 |
+ |
|
| 5 |
+1; |
| ... | ... |
@@ -0,0 +1,14 @@ |
| 1 |
+package MyModel6::main::table1; |
|
| 2 |
+ |
|
| 3 |
+use base 'MyModel6'; |
|
| 4 |
+ |
|
| 5 |
+__PACKAGE__->attr( |
|
| 6 |
+ join => sub {
|
|
| 7 |
+ [ |
|
| 8 |
+ 'left outer join main.table2 on main.table1.key1 = main.table2.key1' |
|
| 9 |
+ ] |
|
| 10 |
+ }, |
|
| 11 |
+ primary_key => sub { ['key1'] }
|
|
| 12 |
+); |
|
| 13 |
+ |
|
| 14 |
+1; |
| ... | ... |
@@ -0,0 +1,5 @@ |
| 1 |
+package MyModel6::main::table2; |
|
| 2 |
+ |
|
| 3 |
+use base 'MyModel6'; |
|
| 4 |
+ |
|
| 5 |
+1; |
| ... | ... |
@@ -0,0 +1,11 @@ |
| 1 |
+package MyModel6::main::table3; |
|
| 2 |
+ |
|
| 3 |
+use base 'MyModel6'; |
|
| 4 |
+ |
|
| 5 |
+__PACKAGE__->attr(filter => sub {
|
|
| 6 |
+ [ |
|
| 7 |
+ key1 => {in => sub { uc $_[0] }}
|
|
| 8 |
+ ] |
|
| 9 |
+}); |
|
| 10 |
+ |
|
| 11 |
+1; |
| ... | ... |
@@ -0,0 +1,5 @@ |
| 1 |
+package MyModel7; |
|
| 2 |
+ |
|
| 3 |
+use base 'DBIx::Custom::Model'; |
|
| 4 |
+ |
|
| 5 |
+1; |
| ... | ... |
@@ -0,0 +1,14 @@ |
| 1 |
+package MyModel7::main::table1; |
|
| 2 |
+ |
|
| 3 |
+use base 'MyModel7'; |
|
| 4 |
+ |
|
| 5 |
+__PACKAGE__->attr( |
|
| 6 |
+ primary_key => sub { ['key1'] },
|
|
| 7 |
+ join => sub {
|
|
| 8 |
+ [ |
|
| 9 |
+ 'left outer join main.table2 on main.table1.key1 = main.table2.key1' |
|
| 10 |
+ ] |
|
| 11 |
+ }, |
|
| 12 |
+); |
|
| 13 |
+ |
|
| 14 |
+1; |
| ... | ... |
@@ -0,0 +1,5 @@ |
| 1 |
+package MyModel7::main::table2; |
|
| 2 |
+ |
|
| 3 |
+use base 'MyModel7'; |
|
| 4 |
+ |
|
| 5 |
+1; |
| ... | ... |
@@ -0,0 +1,4 @@ |
| 1 |
+package MyModel8; |
|
| 2 |
+use DBIx::Custom::Model -base; |
|
| 3 |
+ |
|
| 4 |
+1; |
| ... | ... |
@@ -0,0 +1,7 @@ |
| 1 |
+package MyModel8::main::table1; |
|
| 2 |
+use MyModel8 -base; |
|
| 3 |
+ |
|
| 4 |
+has join => sub { ['left join main.table2 main.table2_alias on main.table1.key1 = main.table2_alias.key1'] };
|
|
| 5 |
+ |
|
| 6 |
+ |
|
| 7 |
+1; |
| ... | ... |
@@ -0,0 +1,10 @@ |
| 1 |
+package MyModel8::main::table2; |
|
| 2 |
+use MyModel8 -base; |
|
| 3 |
+ |
|
| 4 |
+has filter => sub {
|
|
| 5 |
+ {
|
|
| 6 |
+ key3 => {out => sub { $_[0] * 2}, in => sub { $_[0] * 3}, end => sub { $_[0] * 4 }}
|
|
| 7 |
+ } |
|
| 8 |
+}; |
|
| 9 |
+ |
|
| 10 |
+1; |
| ... | ... |
@@ -4,6 +4,7 @@ use warnings; |
| 4 | 4 |
use FindBin; |
| 5 | 5 |
use File::Basename qw/basename fileparse/; |
| 6 | 6 |
use File::Copy 'copy'; |
| 7 |
+use File::Path 'mkpath'; |
|
| 7 | 8 |
|
| 8 | 9 |
my $top = $FindBin::Bin; |
| 9 | 10 |
my $common = "$top/common"; |
| ... | ... |
@@ -31,14 +32,14 @@ for my $dir (@dirs) {
|
| 31 | 32 |
local $/; |
| 32 | 33 |
<$fh>; |
| 33 | 34 |
}; |
| 35 |
+ |
|
| 36 |
+ $content =~ s/::table(\d)/::main::table$1/g; |
|
| 37 |
+ $content =~ s/([^:])table(\d)/$1main.table$2/g; |
|
| 34 | 38 |
|
| 35 |
- $content =~ s/table(\d)/TABLE$1/g; |
|
| 36 |
- $content =~ s/TABLE2_alias/TABLE2_ALIAS/g; |
|
| 37 |
- $content =~ s/key(\d)/KEY$1/g; |
|
| 38 |
- |
|
| 39 |
+ mkpath "$common_fullqualified/$base_dir/main"; |
|
| 39 | 40 |
my $base_name = (fileparse($file, qr/\..+$/))[0]; |
| 40 |
- $base_name = uc $base_name; |
|
| 41 |
- my $new_file = "$common_fullqualified/$base_dir/$base_name.pm"; |
|
| 41 |
+ $base_name = $base_name; |
|
| 42 |
+ my $new_file = "$common_fullqualified/$base_dir/main/$base_name.pm"; |
|
| 42 | 43 |
|
| 43 | 44 |
open my $fh, '>', $new_file |
| 44 | 45 |
or die "Can't write file: $!"; |