Showing 4 changed files with 15 additions and 6 deletions
+2
Changes
... ...
@@ -1,3 +1,5 @@
1
+0.1704
2
+    - added EXPERIMENTAL parameter new syntax :name(operator)
1 3
 0.1703
2 4
     - added EXPERIMENTAL join new syntax.
3 5
 0.1702
+2 -1
lib/DBIx/Custom.pm
... ...
@@ -1,7 +1,7 @@
1 1
 package DBIx::Custom;
2 2
 use Object::Simple -base;
3 3
 
4
-our $VERSION = '0.1703';
4
+our $VERSION = '0.1704';
5 5
 use 5.008001;
6 6
 
7 7
 use Carp 'croak';
... ...
@@ -1126,6 +1126,7 @@ sub _create_query {
1126 1126
         # Create query
1127 1127
         my $builder = $self->query_builder;
1128 1128
         $builder->{_tag_parse} = $self->tag_parse;
1129
+        $builder->safety_character($self->safety_character);
1129 1130
         $query = $builder->build_query($source);
1130 1131
 
1131 1132
         # Remove reserved word quote
+7 -5
lib/DBIx/Custom/QueryBuilder.pm
... ...
@@ -10,8 +10,7 @@ use DBIx::Custom::Util '_subname';
10 10
 push @DBIx::Custom::CARP_NOT, __PACKAGE__;
11 11
 push @DBIx::Custom::Where::CARP_NOT, __PACKAGE__;
12 12
 
13
-# Parameter regex
14
-our $PARAM_RE = qr/(^|[^\.\w]):([\.\w]+)([^\.\w]|$)/sm;
13
+has 'safety_character';
15 14
 
16 15
 sub build_query {
17 16
     my ($self, $source) = @_;
... ...
@@ -69,14 +68,17 @@ sub _placeholder_count {
69 68
 
70 69
 sub _parse_parameter {
71 70
     my ($self, $source) = @_;
72
-    
71
+
73 72
     # Get and replace parameters
74 73
     my $sql = $source || '';
75 74
     my $columns = [];
76
-    while ($source =~ /$PARAM_RE/g) {
75
+    my $c = $self->safety_character;
76
+    # Parameter regex
77
+    my $re = qr/^(.*?):([$c\.]+)(.*)/s;
78
+    while ($sql =~ /$re/g) {
77 79
         push @$columns, $2;
80
+        $sql = "$1?$3";
78 81
     }
79
-    $sql =~ s/$PARAM_RE/$1?$3/g;
80 82
 
81 83
     # Create query
82 84
     my $query = DBIx::Custom::Query->new(
+4
t/dbix-custom-querybuilder.t
... ...
@@ -57,6 +57,7 @@ $datas = [
57 57
 for (my $i = 0; $i < @$datas; $i++) {
58 58
     my $data = $datas->[$i];
59 59
     my $builder = DBIx::Custom->new->query_builder;
60
+    $builder->safety_character('\w');
60 61
     my $query = $builder->build_query($data->{source});
61 62
     is($query->{sql}, $data->{sql_expected}, "$data->{name} : sql");
62 63
     is_deeply($query->columns, $data->{columns_expected}, "$data->{name} : columns");
... ...
@@ -65,6 +66,7 @@ for (my $i = 0; $i < @$datas; $i++) {
65 66
 
66 67
 test 'Original tag';
67 68
 $builder = DBIx::Custom->new->query_builder;
69
+$builder->safety_character('\w');
68 70
 
69 71
 $ret_val = $builder->register_tag(
70 72
     p => sub {
... ...
@@ -84,6 +86,7 @@ isa_ok($ret_val, 'DBIx::Custom::QueryBuilder');
84 86
 
85 87
 test "Tag error case";
86 88
 $builder = DBIx::Custom->new->query_builder;
89
+$builder->safety_character('\w');
87 90
 
88 91
 eval{$builder->build_query('{? }')};
89 92
 like($@, qr/\QColumn name must be specified in tag "{? }"/, "? not arguments");
... ...
@@ -119,6 +122,7 @@ $builder->register_tag(
119 122
 
120 123
 test 'General error case';
121 124
 $builder = DBIx::Custom->new->query_builder;
125
+$builder->safety_character('\w');
122 126
 $builder->register_tag(
123 127
     a => sub {
124 128
         return ["? ? ?", ['']];