Showing 3 changed files with 49 additions and 24 deletions
+17 -6
lib/DBIx/Custom.pm
... ...
@@ -153,13 +153,14 @@ sub column {
153 153
   my $separator = $self->separator;
154 154
   
155 155
   # . is replaced
156
-  $table =~ s/\./$separator/g;
156
+  my $t = $table;
157
+  $t =~ s/\./$separator/g;
157 158
   
158 159
   # Column clause
159 160
   my @column;
160 161
   $columns ||= [];
161 162
   push @column, $self->_tq($table) . "." . $self->q($_) .
162
-    " as " . $self->q("${table}${separator}$_")
163
+    " as " . $self->q("${t}${separator}$_")
163 164
     for @$columns;
164 165
   
165 166
   return join (', ', @column);
... ...
@@ -290,7 +291,7 @@ sub create_model {
290 291
 
291 292
 sub each_column {
292 293
   my ($self, $cb, %options) = @_;
293
-
294
+  
294 295
   my $user_column_info = $self->user_column_info;
295 296
   
296 297
   if ($user_column_info) {
... ...
@@ -790,7 +791,6 @@ sub include_model {
790 791
       if $@;
791 792
     
792 793
     # Search model modules
793
-    $DB::single = 1;
794 794
     my $path = $INC{"$name_space.pm"};
795 795
     $path =~ s/\.pm$//;
796 796
     opendir my $dh, $path
... ...
@@ -1113,12 +1113,16 @@ sub select {
1113 1113
 }
1114 1114
 
1115 1115
 sub setup_model {
1116
-  my $self = shift;
1116
+  my ($self, %opt) = @_;
1117 1117
   
1118 1118
   # Setup model
1119 1119
   $self->each_column(
1120 1120
     sub {
1121 1121
       my ($self, $table, $column, $column_info) = @_;
1122
+      my $database = $column_info->{TABLE_SCHEM};
1123
+      return if exists $opt{database} && $opt{database} ne $database;
1124
+      
1125
+      $table = "$database.$table" if exists $opt{prefix};
1122 1126
       if (my $model = $self->models->{$table}) {
1123 1127
         push @{$model->columns}, $column;
1124 1128
       }
... ...
@@ -1656,7 +1660,7 @@ sub _push_join {
1656 1660
       
1657 1661
       my @j_clauses = reverse split /\s(and|on)\s/, $j_clause;
1658 1662
       my $c = $self->{safety_character};
1659
-      my $join_re = qr/([$c]+)\.[$c]+[^$c].*?([$c]+)\.[$c]+/sm;
1663
+      my $join_re = qr/((?:[$c]+?\.[$c]+?)|(?:[$c]+?))\.[$c]+[^$c].*?((?:[$c]+?\.[$c]+?)|(?:[$c]+?))\.[$c]+/sm;
1660 1664
       for my $clause (@j_clauses) {
1661 1665
         if ($clause =~ $join_re) {
1662 1666
           $table1 = $1;
... ...
@@ -3404,10 +3408,17 @@ See also L<DBIx::Custom::Where> to know how to create where clause.
3404 3408
 =head2 C<setup_model>
3405 3409
 
3406 3410
   $dbi->setup_model;
3411
+  $dbi->setup_model(database => 'main');
3412
+  $dbi->setup_model(database => 'main', prefix => 1);
3407 3413
 
3408 3414
 Setup all model objects.
3409 3415
 C<columns> of model object is automatically set, parsing database information.
3410 3416
 
3417
+If C<database> option is specified, only the database is searched.
3418
+
3419
+If C<prefix> option is specified, Target model is qualified by dabtabase name
3420
+like C<main.book>.
3421
+
3411 3422
 =head2 C<type_rule>
3412 3423
 
3413 3424
   $dbi->type_rule(
+1
t/common-sqlite-fullqualified.t
... ...
@@ -39,6 +39,7 @@ use DBIx::Custom;
39 39
   has key8 => $key8;
40 40
   has key9 => $key9;
41 41
   has key10 => $key10;
42
+  has setup_model_args => sub { [database => 'main', prefix => 1] };
42 43
   
43 44
   my $date_typename = 'Date';
44 45
   my $datetime_typename = 'Datetime';
+31 -18
t/common.t
... ...
@@ -23,6 +23,18 @@ sub u($) {
23 23
   return $value;
24 24
 }
25 25
 
26
+sub u2($) {
27
+  my $value = shift;
28
+  $value =~ s/\./__/g;
29
+  return $value;
30
+}
31
+
32
+sub hy($) {
33
+  my $value = shift;
34
+  $value =~ s/\./-/g;
35
+  return $value;
36
+}
37
+
26 38
 # Constant
27 39
 my $table1 = $dbi->table1;
28 40
 my $table2 = $dbi->table2;
... ...
@@ -52,6 +64,7 @@ my $date_typename = $dbi->date_typename;
52 64
 my $datetime_typename = $dbi->datetime_typename;
53 65
 my $date_datatype = $dbi->date_datatype;
54 66
 my $datetime_datatype = $dbi->datetime_datatype;
67
+my $setup_model_args = $dbi->can('setup_model_args') ? $dbi->setup_model_args : [];
55 68
 
56 69
 # Variables
57 70
 my $builder;
... ...
@@ -2479,7 +2492,7 @@ eval { $dbi->execute("drop table $table2") };
2479 2492
 $dbi->execute($create_table1);
2480 2493
 $dbi->execute($create_table2);
2481 2494
 $dbi->separator('__');
2482
-$dbi->setup_model;
2495
+$dbi->setup_model(@$setup_model_args);
2483 2496
 $dbi->insert({$key1 => 1, $key2 => 2}, table => $table1);
2484 2497
 $dbi->insert({$key1 => 1, $key3 => 3}, table => $table2);
2485 2498
 $model = $dbi->model($table1);
... ...
@@ -2488,7 +2501,7 @@ $result = $model->select(
2488 2501
   where => {"$table1.$key1" => 1}
2489 2502
 );
2490 2503
 is_deeply($result->one,
2491
-        {$key1 => 1, $key2 => 2, "${table2}__$key1" => 1, "${table2}__$key3" => 3});
2504
+        {$key1 => 1, $key2 => 2, u2"${table2}__$key1" => 1, u2"${table2}__$key3" => 3});
2492 2505
 
2493 2506
 test 'values_clause';
2494 2507
 $dbi = DBIx::Custom->connect;
... ...
@@ -2522,7 +2535,7 @@ eval { $dbi->execute("drop table $table1") };
2522 2535
 eval { $dbi->execute("drop table $table2") };
2523 2536
 $dbi->execute($create_table1);
2524 2537
 $dbi->execute($create_table2);
2525
-$dbi->setup_model;
2538
+$dbi->setup_model(@$setup_model_args);
2526 2539
 $dbi->insert({$key1 => 1, $key2 => 2}, table => $table1);
2527 2540
 $dbi->insert({$key1 => 1, $key3 => 3}, table => $table2);
2528 2541
 $model = $dbi->model($table1);
... ...
@@ -2599,23 +2612,23 @@ $dbi->insert({$key1 => 1, $key3 => 4}, table => $table2);
2599 2612
 $dbi->insert({$key1 => 2, $key3 => 5}, table => $table2);
2600 2613
 $rows = $dbi->select(
2601 2614
   table => $table1,
2602
-  column => "$table1.$key1 as ${table1}_$key1, $key2, $key3",
2615
+  column => "$table1.$key1 as " . u("${table1}_$key1") . ", $key2, $key3",
2603 2616
   where   => {"$table1.$key2" => 3},
2604 2617
   join  => ["inner join (select * from $table2 where {= $table2.$key3})" . 
2605
-            " $table2 on $table1.$key1 = $table2.$key1"],
2618
+            " \"$table2\" on $table1.$key1 = \"$table2\".$key1"],
2606 2619
   param => {"$table2.$key3" => 5}
2607 2620
 )->all;
2608
-is_deeply($rows, [{"${table1}_$key1" => 2, $key2 => 3, $key3 => 5}]);
2621
+is_deeply($rows, [{u"${table1}_$key1" => 2, $key2 => 3, $key3 => 5}]);
2609 2622
 
2610 2623
 $rows = $dbi->select(
2611 2624
   table => $table1,
2612
-  column => "$table1.$key1 as ${table1}_$key1, $key2, $key3",
2625
+  column => "$table1.$key1 as " . u("${table1}_$key1") . ", $key2, $key3",
2613 2626
   where   => {"$table1.$key2" => 3},
2614 2627
   join  => "inner join (select * from $table2 where {= $table2.$key3})" . 
2615
-           " $table2 on $table1.$key1 = $table2.$key1",
2628
+           " \"$table2\" on $table1.$key1 = \"$table2\".$key1",
2616 2629
   param => {"$table2.$key3" => 5}
2617 2630
 )->all;
2618
-is_deeply($rows, [{"${table1}_$key1" => 2, $key2 => 3, $key3 => 5}]);
2631
+is_deeply($rows, [{u"${table1}_$key1" => 2, $key2 => 3, $key3 => 5}]);
2619 2632
 
2620 2633
 test 'select() string where';
2621 2634
 $dbi = DBIx::Custom->connect;
... ...
@@ -2981,7 +2994,7 @@ eval { $dbi->execute("drop table $table1") };
2981 2994
 eval { $dbi->execute("drop table $table2") };
2982 2995
 $dbi->execute($create_table1);
2983 2996
 $dbi->execute($create_table2);
2984
-$dbi->setup_model;
2997
+$dbi->setup_model(@$setup_model_args);
2985 2998
 $dbi->insert({$key1 => 1, $key2 => 2}, table => $table1);
2986 2999
 $dbi->insert({$key1 => 1, $key3 => 3}, table => $table2);
2987 3000
 $model = $dbi->model($table1);
... ...
@@ -3017,7 +3030,7 @@ $dbi->create_model(
3017 3030
 $model2 = $dbi->create_model(
3018 3031
   table => $table2,
3019 3032
 );
3020
-$dbi->setup_model;
3033
+$dbi->setup_model(@$setup_model_args);
3021 3034
 $dbi->insert({$key1 => 1, $key2 => 2}, table => $table1);
3022 3035
 $dbi->insert({$key1 => 1, $key3 => 3}, table => $table2);
3023 3036
 $model = $dbi->model($table1);
... ...
@@ -3042,7 +3055,7 @@ $result = $model->select(
3042 3055
   where => {"$table1.$key1" => 1}
3043 3056
 );
3044 3057
 is_deeply($result->one,
3045
-        {$key1 => 1, $key2 => 2, "${table2}__$key1" => 1, "${table2}__$key3" => 3});
3058
+        {$key1 => 1, $key2 => 2, u2"${table2}__$key1" => 1, u2"${table2}__$key3" => 3});
3046 3059
 is_deeply($model2->select->one, {$key1 => 1, $key3 => 3});
3047 3060
 
3048 3061
 $dbi->separator('-');
... ...
@@ -3055,7 +3068,7 @@ $result = $model->select(
3055 3068
   where => {"$table1.$key1" => 1}
3056 3069
 );
3057 3070
 is_deeply($result->one,
3058
-  {$key1 => 1, $key2 => 2, "$table2-$key1" => 1, "$table2-$key3" => 3});
3071
+  {$key1 => 1, $key2 => 2, hy"$table2-$key1" => 1, hy"$table2-$key3" => 3});
3059 3072
 is_deeply($model2->select->one, {$key1 => 1, $key3 => 3});
3060 3073
 
3061 3074
 
... ...
@@ -3074,7 +3087,7 @@ $dbi->create_model(
3074 3087
   ],
3075 3088
   primary_key => [$key1],
3076 3089
 );
3077
-$dbi->setup_model;
3090
+$dbi->setup_model(@$setup_model_args);
3078 3091
 $dbi->insert({$key1 => 1, $key2 => 2}, table => $table1);
3079 3092
 $model = $dbi->model($table1);
3080 3093
 $result = $model->select(column => $key1);
... ...
@@ -3859,7 +3872,7 @@ test 'dbi method from model';
3859 3872
 $dbi = MyDBI9->connect;
3860 3873
 eval { $dbi->execute("drop table $table1") };
3861 3874
 $dbi->execute($create_table1);
3862
-$dbi->setup_model;
3875
+$dbi->setup_model(@$setup_model_args);
3863 3876
 $model = $dbi->model($table1);
3864 3877
 eval{$model->execute("select * from $table1")};
3865 3878
 ok(!$@);
... ...
@@ -3871,7 +3884,7 @@ eval { $dbi->execute("drop table $table1") };
3871 3884
 $dbi->execute($create_table1);
3872 3885
 eval { $dbi->execute("drop table $table2") };
3873 3886
 $dbi->execute($create_table2);
3874
-$dbi->setup_model;
3887
+$dbi->setup_model(@$setup_model_args);
3875 3888
 $dbi->execute("insert into $table1 ($key1, $key2) values (1, 2)");
3876 3889
 $dbi->execute("insert into $table2 ($key1, $key3) values (1, 4)");
3877 3890
 $model = $dbi->model($table1);
... ...
@@ -3928,7 +3941,7 @@ $dbi->create_model(
3928 3941
     $key1 => {in => sub { uc $_[0] }}
3929 3942
   ]
3930 3943
 );
3931
-$dbi->setup_model;
3944
+$dbi->setup_model(@$setup_model_args);
3932 3945
 $dbi->insert({$key1 => 1, $key2 => 2}, table => $table1);
3933 3946
 $dbi->insert({$key1 => 1, $key3 => 3}, table => $table2);
3934 3947
 $model = $dbi->model($table1);
... ...
@@ -4113,7 +4126,7 @@ eval { $dbi->execute("drop table $table2") };
4113 4126
 
4114 4127
 $dbi->execute($create_table1);
4115 4128
 $dbi->execute($create_table2);
4116
-$dbi->setup_model;
4129
+$dbi->setup_model(@$setup_model_args);
4117 4130
 is_deeply([sort @{$dbi->model($table1)->columns}], [$key1, $key2]);
4118 4131
 is_deeply([sort @{$dbi->model($table2)->columns}], [$key1, $key3]);
4119 4132