Showing 5 changed files with 160 additions and 147 deletions
+99 -19
lib/DBIx/Custom.pm
... ...
@@ -15,6 +15,7 @@ use DBIx::Custom::Query;
15 15
 use DBIx::Custom::QueryBuilder;
16 16
 use DBIx::Custom::Where;
17 17
 use DBIx::Custom::Table;
18
+use DBIx::Custom::Tag;
18 19
 use Encode qw/encode_utf8 decode_utf8/;
19 20
 
20 21
 __PACKAGE__->attr(
... ...
@@ -156,7 +157,7 @@ sub method {
156 157
 }
157 158
 
158 159
 sub connect {
159
-    my $self = ref $_[0] ? shift : shift->SUPER::new(@_);;
160
+    my $self = ref $_[0] ? shift : shift->new(@_);;
160 161
     
161 162
     # Attributes
162 163
     my $data_source = $self->data_source;
... ...
@@ -451,6 +452,20 @@ sub new {
451 452
         croak qq{"$attr" is invalid attribute name}
452 453
           unless $self->can($attr);
453 454
     }
455
+
456
+    $self->register_tag(
457
+        '?'     => \&DBIx::Custom::Tag::placeholder,
458
+        '='     => \&DBIx::Custom::Tag::equal,
459
+        '<>'    => \&DBIx::Custom::Tag::not_equal,
460
+        '>'     => \&DBIx::Custom::Tag::greater_than,
461
+        '<'     => \&DBIx::Custom::Tag::lower_than,
462
+        '>='    => \&DBIx::Custom::Tag::greater_than_equal,
463
+        '<='    => \&DBIx::Custom::Tag::lower_than_equal,
464
+        'like'  => \&DBIx::Custom::Tag::like,
465
+        'in'    => \&DBIx::Custom::Tag::in,
466
+        'insert_param' => \&DBIx::Custom::Tag::insert_param,
467
+        'update_param' => \&DBIx::Custom::Tag::update_param
468
+    );
454 469
     
455 470
     return $self;
456 471
 }
... ...
@@ -676,8 +691,9 @@ sub update {
676 691
 
677 692
 sub update_all { shift->update(allow_update_all => 1, @_) };
678 693
 
679
-sub where { DBIx::Custom::Where->new(
680
-              query_builder => shift->query_builder) }
694
+sub where {
695
+    return DBIx::Custom::Where->new(query_builder => shift->query_builder)
696
+}
681 697
 
682 698
 sub _build_binds {
683 699
     my ($self, $params, $columns, $filter) = @_;
... ...
@@ -725,12 +741,13 @@ sub _croak {
725 741
     }
726 742
 }
727 743
 
728
-# Following methos are DEPRECATED!
744
+# DEPRECATED!
729 745
 __PACKAGE__->attr(
730 746
     dbi_options => sub { {} },
731 747
     filter_check  => 1
732 748
 );
733 749
 
750
+# DEPRECATED!
734 751
 sub default_bind_filter {
735 752
     my $self = shift;
736 753
     
... ...
@@ -752,6 +769,7 @@ sub default_bind_filter {
752 769
     return $self->{default_out_filter};
753 770
 }
754 771
 
772
+# DEPRECATED!
755 773
 sub default_fetch_filter {
756 774
     my $self = shift;
757 775
     
... ...
@@ -774,6 +792,7 @@ sub default_fetch_filter {
774 792
     return $self->{default_in_filter};
775 793
 }
776 794
 
795
+# DEPRECATED!
777 796
 sub register_tag_processor {
778 797
     return shift->query_builder->register_tag_processor(@_);
779 798
 }
... ...
@@ -924,14 +943,6 @@ Default filter when row is fetched.
924 943
     my $filters = $dbi->filters;
925 944
     $dbi        = $dbi->filters(\%filters);
926 945
 
927
-=head2 C<filter_check>
928
-
929
-    my $filter_check = $dbi->filter_check;
930
-    $dbi             = $dbi->filter_check(0);
931
-
932
-B<this attribute is now deprecated and has no mean
933
-because check is always done>. 
934
-
935 946
 =head2 C<password>
936 947
 
937 948
     my $password = $dbi->password;
... ...
@@ -970,7 +981,7 @@ C<connect()> method use this value to connect the database.
970 981
 L<DBIx::Custom> inherits all methods from L<Object::Simple>
971 982
 and implements the following new ones.
972 983
 
973
-=head2 C<(experimental) apply_filter >
984
+=head2 C<(experimental) apply_filter>
974 985
 
975 986
     $dbi->apply_filter(
976 987
         $table,
... ...
@@ -1056,8 +1067,6 @@ is expanded to
1056 1067
 
1057 1068
 This is used in C<select()>
1058 1069
 
1059
-
1060
-    
1061 1070
 =head2 C<delete>
1062 1071
 
1063 1072
     $dbi->delete(table  => $table,
... ...
@@ -1187,7 +1196,7 @@ C<default_filter> and C<filter> of C<DBIx::Custom::Result>
1187 1196
         }
1188 1197
     );
1189 1198
 
1190
-Register tag processor.
1199
+Register tag.
1191 1200
 
1192 1201
 =head2 C<rollback>
1193 1202
 
... ...
@@ -1282,16 +1291,87 @@ Return value of C<update_all()> is the count of affected rows.
1282 1291
 
1283 1292
 Create a new L<DBIx::Custom::Where> object.
1284 1293
 
1285
-=head2 C<(deprecated) cache_method>
1294
+=head2 C<cache_method>
1286 1295
 
1287 1296
     $dbi          = $dbi->cache_method(\&cache_method);
1288 1297
     $cache_method = $dbi->cache_method
1289 1298
 
1290 1299
 Method to set and get caches.
1291 1300
 
1301
+=head1 Tags
1302
+
1303
+The following tags is available.
1304
+
1305
+=head2 C<?>
1306
+
1307
+Placeholder tag.
1308
+
1309
+    {? NAME}    ->   ?
1310
+
1311
+=head2 C<=>
1312
+
1313
+Equal tag.
1314
+
1315
+    {= NAME}    ->   NAME = ?
1316
+
1317
+=head2 C<E<lt>E<gt>>
1318
+
1319
+Not equal tag.
1320
+
1321
+    {<> NAME}   ->   NAME <> ?
1322
+
1323
+=head2 C<E<lt>>
1324
+
1325
+Lower than tag
1326
+
1327
+    {< NAME}    ->   NAME < ?
1328
+
1329
+=head2 C<E<gt>>
1330
+
1331
+Greater than tag
1332
+
1333
+    {> NAME}    ->   NAME > ?
1334
+
1335
+=head2 C<E<gt>=>
1336
+
1337
+Greater than or equal tag
1338
+
1339
+    {>= NAME}   ->   NAME >= ?
1340
+
1341
+=head2 C<E<lt>=>
1342
+
1343
+Lower than or equal tag
1344
+
1345
+    {<= NAME}   ->   NAME <= ?
1346
+
1347
+=head2 C<like>
1348
+
1349
+Like tag
1350
+
1351
+    {like NAME}   ->   NAME like ?
1352
+
1353
+=head2 C<in>
1354
+
1355
+In tag.
1356
+
1357
+    {in NAME COUNT}   ->   NAME in [?, ?, ..]
1358
+
1359
+=head2 C<insert_param>
1360
+
1361
+Insert parameter tag.
1362
+
1363
+    {insert_param NAME1 NAME2}   ->   (NAME1, NAME2) values (?, ?)
1364
+
1365
+=head2 C<update_param>
1366
+
1367
+Updata parameter tag.
1368
+
1369
+    {update_param NAME1 NAME2}   ->   set NAME1 = ?, NAME2 = ?
1370
+
1292 1371
 =head1 STABILITY
1293 1372
 
1294
-L<DBIx::Custom> is now stable. APIs keep backword compatible in the feature.
1373
+L<DBIx::Custom> is stable. APIs keep backword compatible
1374
+except experimental one in the feature.
1295 1375
 
1296 1376
 =head1 BUGS
1297 1377
 
... ...
@@ -1307,7 +1387,7 @@ Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
1307 1387
 
1308 1388
 =head1 COPYRIGHT & LICENSE
1309 1389
 
1310
-Copyright 2009 Yuki Kimoto, all rights reserved.
1390
+Copyright 2009-2011 Yuki Kimoto, all rights reserved.
1311 1391
 
1312 1392
 This program is free software; you can redistribute it and/or modify it
1313 1393
 under the same terms as Perl itself.
+21 -104
lib/DBIx/Custom/QueryBuilder.pm
... ...
@@ -7,28 +7,13 @@ use base 'Object::Simple';
7 7
 
8 8
 use Carp 'croak';
9 9
 use DBIx::Custom::Query;
10
-use DBIx::Custom::Tag;
11 10
 
12 11
 # Carp trust relationship
13 12
 push @DBIx::Custom::CARP_NOT, __PACKAGE__;
14 13
 push @DBIx::Custom::Where::CARP_NOT, __PACKAGE__;
15 14
 
16 15
 # Attributes
17
-__PACKAGE__->attr('tags' => sub {
18
-    {
19
-        '?'     => \&DBIx::Custom::Tag::placeholder,
20
-        '='     => \&DBIx::Custom::Tag::equal,
21
-        '<>'    => \&DBIx::Custom::Tag::not_equal,
22
-        '>'     => \&DBIx::Custom::Tag::greater_than,
23
-        '<'     => \&DBIx::Custom::Tag::lower_than,
24
-        '>='    => \&DBIx::Custom::Tag::greater_than_equal,
25
-        '<='    => \&DBIx::Custom::Tag::lower_than_equal,
26
-        'like'  => \&DBIx::Custom::Tag::like,
27
-        'in'    => \&DBIx::Custom::Tag::in,
28
-        'insert_param' => \&DBIx::Custom::Tag::insert_param,
29
-        'update_param' => \&DBIx::Custom::Tag::update_param
30
-    }
31
-});
16
+__PACKAGE__->attr('tags' => sub { {} });
32 17
 
33 18
 sub build_query {
34 19
     my ($self, $source)  = @_;
... ...
@@ -45,7 +30,7 @@ sub build_query {
45 30
 sub register_tag {
46 31
     my $self = shift;
47 32
     
48
-    # Merge tag processor
33
+    # Merge tag
49 34
     my $tags = ref $_[0] eq 'HASH' ? $_[0] : {@_};
50 35
     $self->tags({%{$self->tags}, %$tags});
51 36
     
... ...
@@ -76,23 +61,23 @@ sub _build_query {
76 61
             # Tag arguments
77 62
             my $tag_args = $node->{tag_args};
78 63
             
79
-            # Get tag processor
80
-            my $tag_processor = $self->tag_processors->{$tag_name}
64
+            # Get tag
65
+            my $tag = $self->tag_processors->{$tag_name}
81 66
                              || $self->tags->{$tag_name};
82 67
             
83
-            # Tag processor is not registered
68
+            # Tag is not registered
84 69
             croak qq{Tag "$tag_name" in "{a }" is not registered}
85
-              unless $tag_processor;
70
+              unless $tag;
86 71
             
87
-            # Tag processor not sub reference
88
-            croak qq{Tag processor "$tag_name" must be sub reference}
89
-              unless ref $tag_processor eq 'CODE';
72
+            # Tag not sub reference
73
+            croak qq{Tag "$tag_name" must be sub reference}
74
+              unless ref $tag eq 'CODE';
90 75
             
91
-            # Execute tag processor
92
-            my $r = $tag_processor->(@$tag_args);
76
+            # Execute tag
77
+            my $r = $tag->(@$tag_args);
93 78
             
94
-            # Check tag processor return value
95
-            croak qq{Tag processor "$tag_name" must return [STRING, ARRAY_REFERENCE]}
79
+            # Check tag return value
80
+            croak qq{Tag "$tag_name" must return [STRING, ARRAY_REFERENCE]}
96 81
               unless ref $r eq 'ARRAY' && defined $r->[0] && ref $r->[1] eq 'ARRAY';
97 82
             
98 83
             # Part of SQL statement and colum names
... ...
@@ -275,13 +260,14 @@ sub _placeholder_count {
275 260
     return $count;
276 261
 }
277 262
 
278
-# Follwoing methods are DEPRECATED!
263
+# DEPRECATED!
279 264
 __PACKAGE__->attr('tag_processors' => sub { {} });
280 265
 
266
+# DEPRECATED!
281 267
 sub register_tag_processor {
282 268
     my $self = shift;
283 269
     
284
-    # Merge tag processor
270
+    # Merge tag
285 271
     my $tag_processors = ref $_[0] eq 'HASH' ? $_[0] : {@_};
286 272
     $self->tag_processors({%{$self->tag_processors}, %{$tag_processors}});
287 273
     
... ...
@@ -306,9 +292,9 @@ DBIx::Custom::QueryBuilder - Query builder
306 292
 =head2 C<tags>
307 293
 
308 294
     my $tags = $builder->tags;
309
-    $builder           = $builder->tags(\%tags);
295
+    $builder = $builder->tags(\%tags);
310 296
 
311
-Tag processors.
297
+Tags.
312 298
 
313 299
 =head1 METHODS
314 300
 
... ...
@@ -346,11 +332,11 @@ Query
346 332
     $builder->register_tag(\%tags);
347 333
     $builder->register_tag(%tags);
348 334
 
349
-Register tag processor.
335
+Register tag.
350 336
 
351 337
 B<Example:>
352 338
 
353
-    $builder->register_tag_processor(
339
+    $builder->register_tag(
354 340
         '?' => sub {
355 341
             my $column = shift;
356 342
             
... ...
@@ -358,74 +344,5 @@ B<Example:>
358 344
         }
359 345
     );
360 346
 
361
-See also L<DBIx::Custom::QueryBuilder::TagProcessors> to know tag processor.
362
-
363
-=head1 Tags
364
-
365
-The following tags is available.
366
-
367
-=head2 C<?>
368
-
369
-Placeholder tag.
370
-
371
-    {? NAME}    ->   ?
372
-
373
-=head2 C<=>
374
-
375
-Equal tag.
376
-
377
-    {= NAME}    ->   NAME = ?
378
-
379
-=head2 C<E<lt>E<gt>>
380
-
381
-Not equal tag.
382
-
383
-    {<> NAME}   ->   NAME <> ?
384
-
385
-=head2 C<E<lt>>
386
-
387
-Lower than tag
388
-
389
-    {< NAME}    ->   NAME < ?
390
-
391
-=head2 C<E<gt>>
392
-
393
-Greater than tag
394
-
395
-    {> NAME}    ->   NAME > ?
396
-
397
-=head2 C<E<gt>=>
398
-
399
-Greater than or equal tag
400
-
401
-    {>= NAME}   ->   NAME >= ?
402
-
403
-=head2 C<E<lt>=>
404
-
405
-Lower than or equal tag
406
-
407
-    {<= NAME}   ->   NAME <= ?
408
-
409
-=head2 C<like>
410
-
411
-Like tag
412
-
413
-    {like NAME}   ->   NAME like ?
414
-
415
-=head2 C<in>
416
-
417
-In tag.
418
-
419
-    {in NAME COUNT}   ->   NAME in [?, ?, ..]
420
-
421
-=head2 C<insert_param>
422
-
423
-Insert parameter tag.
424
-
425
-    {insert_param NAME1 NAME2}   ->   (NAME1, NAME2) values (?, ?)
426
-
427
-=head2 C<update_param>
428
-
429
-Updata parameter tag.
347
+See also L<DBIx::Custom::Tag> to know tag.
430 348
 
431
-    {update_param NAME1 NAME2}   ->   set NAME1 = ?, NAME2 = ?
+2 -3
lib/DBIx/Custom/Where.pm
... ...
@@ -14,8 +14,8 @@ use Carp 'croak';
14 14
 push @DBIx::Custom::CARP_NOT, __PACKAGE__;
15 15
 
16 16
 __PACKAGE__->attr(
17
-  [qw/param query_builder/],
18
-  clause => sub { [] },
17
+    [qw/param query_builder/],
18
+    clause => sub { [] },
19 19
 );
20 20
 
21 21
 sub to_string {
... ...
@@ -37,7 +37,6 @@ sub to_string {
37 37
 }
38 38
 
39 39
 our %VALID_OPERATIONS = map { $_ => 1 } qw/and or/;
40
-
41 40
 sub _parse {
42 41
     my ($self, $clause, $where, $count, $op) = @_;
43 42
     
+18 -1
t/dbix-custom-core-sqlite.t
... ...
@@ -764,7 +764,7 @@ test 'connect super';
764 764
     }
765 765
     
766 766
     sub new {
767
-        my $self = shift->SUPER::connect(@_);
767
+        my $self = shift->SUPER::new(@_);
768 768
         
769 769
         return $self;
770 770
     }
... ...
@@ -776,10 +776,27 @@ $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
776 776
 is($dbi->select(table => 'table1')->fetch_hash_first->{key1}, 1);
777 777
 
778 778
 $dbi = MyDBI->new($NEW_ARGS->{0});
779
+$dbi->connect;
779 780
 $dbi->execute($CREATE_TABLE->{0});
780 781
 $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
781 782
 is($dbi->select(table => 'table1')->fetch_hash_first->{key1}, 1);
782 783
 
784
+{
785
+    package MyDBI2;
786
+    
787
+    use base 'DBIx::Custom';
788
+    sub connect {
789
+        my $self = shift->SUPER::new(@_);
790
+        $self->connect;
791
+        
792
+        return $self;
793
+    }
794
+}
795
+
796
+$dbi = MyDBI->connect($NEW_ARGS->{0});
797
+$dbi->execute($CREATE_TABLE->{0});
798
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
799
+is($dbi->select(table => 'table1')->fetch_hash_first->{key1}, 1);
783 800
 
784 801
 test 'end_filter';
785 802
 $dbi = DBIx::Custom->connect($NEW_ARGS->{0});
+20 -20
t/dbix-custom-querybuilder.t
... ...
@@ -3,7 +3,7 @@ use warnings;
3 3
 
4 4
 use Test::More 'no_plan';
5 5
 
6
-use DBIx::Custom::QueryBuilder;
6
+use DBIx::Custom;
7 7
 
8 8
 # Function for test name
9 9
 sub test{ print "# $_[0]\n" }
... ...
@@ -54,17 +54,17 @@ $datas = [
54 54
 
55 55
 for (my $i = 0; $i < @$datas; $i++) {
56 56
     my $data = $datas->[$i];
57
-    my $builder = DBIx::Custom::QueryBuilder->new;
57
+    my $builder = DBIx::Custom->new->query_builder;
58 58
     my $query = $builder->build_query($data->{source});
59 59
     is($query->{sql}, $data->{sql_expected}, "$data->{name} : sql");
60 60
     is_deeply($query->{columns}, $data->{columns_expected}, "$data->{name} : columns");
61 61
 }
62 62
 
63 63
 
64
-test 'Original tag processor';
65
-$builder = DBIx::Custom::QueryBuilder->new;
64
+test 'Original tag';
65
+$builder = DBIx::Custom->new->query_builder;
66 66
 
67
-$ret_val = $builder->register_tag_processor(
67
+$ret_val = $builder->register_tag(
68 68
     p => sub {
69 69
         my @args = @_;
70 70
         
... ...
@@ -75,49 +75,49 @@ $ret_val = $builder->register_tag_processor(
75 75
 );
76 76
 
77 77
 $query = $builder->build_query("{p a b}");
78
-is($query->{sql}, "? a b;", "register_tag_processor sql");
79
-is_deeply($query->{columns}, [2], "register_tag_processor columns");
78
+is($query->{sql}, "? a b;", "register_tag sql");
79
+is_deeply($query->{columns}, [2], "register_tag columns");
80 80
 isa_ok($ret_val, 'DBIx::Custom::QueryBuilder');
81 81
 
82 82
 
83
-test "Tag processor error case";
84
-$builder = DBIx::Custom::QueryBuilder->new;
83
+test "Tag error case";
84
+$builder = DBIx::Custom->new->query_builder;
85 85
 
86 86
 eval{$builder->build_query('{? }')};
87 87
 like($@, qr/\QColumn name must be specified in tag "{? }"/, "? not arguments");
88 88
 
89 89
 eval{$builder->build_query("{a }")};
90
-like($@, qr/\QTag "a" in "{a }" is not registered/, "tag_processor not exist");
90
+like($@, qr/\QTag "a" in "{a }" is not registered/, "tag not exist");
91 91
 
92
-$builder->register_tag_processor({
92
+$builder->register_tag({
93 93
     q => 'string'
94 94
 });
95 95
 
96 96
 eval{$builder->build_query("{q}", {})};
97
-like($@, qr/Tag processor "q" must be sub reference/, "tag_processor not code ref");
97
+like($@, qr/Tag "q" must be sub reference/, "tag not code ref");
98 98
 
99
-$builder->register_tag_processor({
99
+$builder->register_tag({
100 100
    r => sub {} 
101 101
 });
102 102
 
103 103
 eval{$builder->build_query("{r}")};
104
-like($@, qr/\QTag processor "r" must return [STRING, ARRAY_REFERENCE]/, "tag processor return noting");
104
+like($@, qr/\QTag "r" must return [STRING, ARRAY_REFERENCE]/, "tag return noting");
105 105
 
106
-$builder->register_tag_processor({
106
+$builder->register_tag({
107 107
    s => sub { return ["a", ""]} 
108 108
 });
109 109
 
110 110
 eval{$builder->build_query("{s}")};
111
-like($@, qr/\QTag processor "s" must return [STRING, ARRAY_REFERENCE]/, "tag processor return not array columns");
111
+like($@, qr/\QTag "s" must return [STRING, ARRAY_REFERENCE]/, "tag return not array columns");
112 112
 
113
-$builder->register_tag_processor(
113
+$builder->register_tag(
114 114
     t => sub {return ["a", []]}
115 115
 );
116 116
 
117 117
 
118 118
 test 'General error case';
119
-$builder = DBIx::Custom::QueryBuilder->new;
120
-$builder->register_tag_processor(
119
+$builder = DBIx::Custom->new->query_builder;
120
+$builder->register_tag(
121 121
     a => sub {
122 122
         return ["? ? ?", ['']];
123 123
     }
... ...
@@ -126,7 +126,7 @@ eval{$builder->build_query("{a}")};
126 126
 like($@, qr/\QPlaceholder count in "? ? ?" must be same as column count 1/, "placeholder count is invalid");
127 127
 
128 128
 
129
-test 'Default tag processor Error case';
129
+test 'Default tag Error case';
130 130
 eval{$builder->build_query("{= }")};
131 131
 like($@, qr/Column name must be specified in tag "{= }"/, "basic '=' : key not exist");
132 132