... | ... |
@@ -84,12 +84,11 @@ sub assign_param { |
84 | 84 |
# Create set tag |
85 | 85 |
my @params; |
86 | 86 |
my $safety = $self->safety_character; |
87 |
- my $q = $self->_quote; |
|
88 | 87 |
foreach my $column (keys %$param) { |
89 | 88 |
croak qq{"$column" is not safety column name } . _subname |
90 | 89 |
unless $column =~ /^[$safety\.]+$/; |
91 |
- my $column_quote = "$q$column$q"; |
|
92 |
- $column_quote =~ s/\./$q.$q/; |
|
90 |
+ my $column_quote = $self->_q($column); |
|
91 |
+ $column_quote =~ s/\./$self->_q(".")/e; |
|
93 | 92 |
push @params, "$column_quote = :$column"; |
94 | 93 |
} |
95 | 94 |
my $tag = join(', ', @params); |
... | ... |
@@ -109,16 +108,14 @@ sub column { |
109 | 108 |
$columns ||= $self->model($real_table)->columns; |
110 | 109 |
} |
111 | 110 |
|
112 |
- # Reserved word quote |
|
113 |
- my $q = $self->_quote; |
|
114 |
- |
|
115 | 111 |
# Separator |
116 | 112 |
my $separator = $self->separator; |
117 | 113 |
|
118 | 114 |
# Column clause |
119 | 115 |
my @column; |
120 | 116 |
$columns ||= []; |
121 |
- push @column, "$q$table$q.$q$_$q as $q${table}${separator}$_$q" |
|
117 |
+ push @column, $self->_q($table) . "." . $self->_q($_) . |
|
118 |
+ " as " . $self->_q("${table}${separator}$_") |
|
122 | 119 |
for @$columns; |
123 | 120 |
|
124 | 121 |
return join (', ', @column); |
... | ... |
@@ -208,10 +205,9 @@ sub delete { |
208 | 205 |
|
209 | 206 |
# Delete statement |
210 | 207 |
my @sql; |
211 |
- my $q = $self->_quote; |
|
212 | 208 |
push @sql, "delete"; |
213 | 209 |
push @sql, $prefix if defined $prefix; |
214 |
- push @sql, "from $q$table$q $where_clause"; |
|
210 |
+ push @sql, "from " . $self->_q($table) . " $where_clause"; |
|
215 | 211 |
push @sql, $append if defined $append; |
216 | 212 |
my $sql = join(' ', @sql); |
217 | 213 |
|
... | ... |
@@ -334,7 +330,8 @@ sub execute { |
334 | 330 |
my $main_table = pop @$tables; |
335 | 331 |
$tables = $self->_remove_duplicate_table($tables, $main_table); |
336 | 332 |
if (my $q = $self->_quote) { |
337 |
- $_ =~ s/$q//g for @$tables; |
|
333 |
+ $q = quotemeta($q); |
|
334 |
+ $_ =~ s/[$q]//g for @$tables; |
|
338 | 335 |
} |
339 | 336 |
|
340 | 337 |
# Type rule |
... | ... |
@@ -499,14 +496,11 @@ sub insert { |
499 | 496 |
$param = $self->merge_param($id_param, $param); |
500 | 497 |
} |
501 | 498 |
|
502 |
- # Reserved word quote |
|
503 |
- my $q = $self->_quote; |
|
504 |
- |
|
505 | 499 |
# Insert statement |
506 | 500 |
my @sql; |
507 | 501 |
push @sql, "insert"; |
508 | 502 |
push @sql, $prefix if defined $prefix; |
509 |
- push @sql, "into $q$table$q " . $self->insert_param($param); |
|
503 |
+ push @sql, "into " . $self->_q($table) . " " . $self->insert_param($param); |
|
510 | 504 |
push @sql, $append if defined $append; |
511 | 505 |
my $sql = join (' ', @sql); |
512 | 506 |
|
... | ... |
@@ -519,14 +513,13 @@ sub insert_param { |
519 | 513 |
|
520 | 514 |
# Create insert parameter tag |
521 | 515 |
my $safety = $self->safety_character; |
522 |
- my $q = $self->_quote; |
|
523 | 516 |
my @columns; |
524 | 517 |
my @placeholders; |
525 | 518 |
foreach my $column (keys %$param) { |
526 | 519 |
croak qq{"$column" is not safety column name } . _subname |
527 | 520 |
unless $column =~ /^[$safety\.]+$/; |
528 |
- my $column_quote = "$q$column$q"; |
|
529 |
- $column_quote =~ s/\./$q.$q/; |
|
521 |
+ my $column_quote = $self->_q($column); |
|
522 |
+ $column_quote =~ s/\./$self->_q(".")/e; |
|
530 | 523 |
push @columns, $column_quote; |
531 | 524 |
push @placeholders, ":$column"; |
532 | 525 |
} |
... | ... |
@@ -698,9 +691,10 @@ sub mycolumn { |
698 | 691 |
|
699 | 692 |
# Create column clause |
700 | 693 |
my @column; |
701 |
- my $q = $self->_quote; |
|
702 | 694 |
$columns ||= []; |
703 |
- push @column, "$q$table$q.$q$_$q as $q$_$q" for @$columns; |
|
695 |
+ push @column, $self->_q($table) . "." . $self->_q($_) . |
|
696 |
+ " as " . $self->_q($_) |
|
697 |
+ for @$columns; |
|
704 | 698 |
|
705 | 699 |
return join (', ', @column); |
706 | 700 |
} |
... | ... |
@@ -737,7 +731,7 @@ sub not_exists { bless {}, 'DBIx::Custom::NotExists' } |
737 | 731 |
|
738 | 732 |
sub order { |
739 | 733 |
my $self = shift; |
740 |
- return DBIx::Custom::Order->new(quote => $self->quote, @_); |
|
734 |
+ return DBIx::Custom::Order->new(dbi => $self, @_); |
|
741 | 735 |
} |
742 | 736 |
|
743 | 737 |
sub register_filter { |
... | ... |
@@ -787,9 +781,6 @@ sub select { |
787 | 781 |
my @sql; |
788 | 782 |
push @sql, 'select'; |
789 | 783 |
|
790 |
- # Reserved word quote |
|
791 |
- my $q = $self->_quote; |
|
792 |
- |
|
793 | 784 |
# Prefix |
794 | 785 |
push @sql, $prefix if defined $prefix; |
795 | 786 |
|
... | ... |
@@ -806,7 +797,7 @@ sub select { |
806 | 797 |
splice @$column, 1, 1; |
807 | 798 |
} |
808 | 799 |
|
809 |
- $column = join(' ', $column->[0], 'as', $q . $column->[1] . $q); |
|
800 |
+ $column = join(' ', $column->[0], 'as', $self->_q($column->[1])); |
|
810 | 801 |
} |
811 | 802 |
unshift @$tables, @{$self->_search_tables($column)}; |
812 | 803 |
push @sql, ($column, ','); |
... | ... |
@@ -820,13 +811,13 @@ sub select { |
820 | 811 |
if ($relation) { |
821 | 812 |
my $found = {}; |
822 | 813 |
foreach my $table (@$tables) { |
823 |
- push @sql, ("$q$table$q", ',') unless $found->{$table}; |
|
814 |
+ push @sql, ($self->_q($table), ',') unless $found->{$table}; |
|
824 | 815 |
$found->{$table} = 1; |
825 | 816 |
} |
826 | 817 |
} |
827 | 818 |
else { |
828 | 819 |
my $main_table = $tables->[-1] || ''; |
829 |
- push @sql, "$q$main_table$q"; |
|
820 |
+ push @sql, $self->_q($main_table); |
|
830 | 821 |
} |
831 | 822 |
pop @sql if ($sql[-1] || '') eq ','; |
832 | 823 |
croak "Not found table name " . _subname |
... | ... |
@@ -1060,10 +1051,9 @@ sub update { |
1060 | 1051 |
|
1061 | 1052 |
# Update statement |
1062 | 1053 |
my @sql; |
1063 |
- my $q = $self->_quote; |
|
1064 | 1054 |
push @sql, "update"; |
1065 | 1055 |
push @sql, $prefix if defined $prefix; |
1066 |
- push @sql, "$q$table$q $update_clause $where_clause"; |
|
1056 |
+ push @sql, $self->_q($table) . " $update_clause $where_clause"; |
|
1067 | 1057 |
push @sql, $append if defined $append; |
1068 | 1058 |
|
1069 | 1059 |
# SQL |
... | ... |
@@ -1131,7 +1121,8 @@ sub _create_query { |
1131 | 1121 |
|
1132 | 1122 |
# Remove reserved word quote |
1133 | 1123 |
if (my $q = $self->_quote) { |
1134 |
- $_ =~ s/$q//g for @{$query->columns} |
|
1124 |
+ $q = quotemeta($q); |
|
1125 |
+ $_ =~ s/[$q]//g for @{$query->columns} |
|
1135 | 1126 |
} |
1136 | 1127 |
|
1137 | 1128 |
# Save query to cache |
... | ... |
@@ -1336,7 +1327,7 @@ sub _push_join { |
1336 | 1327 |
my $j_clause = (split /\s+on\s+/, $join_clause)[-1]; |
1337 | 1328 |
$j_clause =~ s/'.+?'//g; |
1338 | 1329 |
my $q_re = quotemeta($q); |
1339 |
- $j_clause =~ s/$q_re//g; |
|
1330 |
+ $j_clause =~ s/[$q_re]//g; |
|
1340 | 1331 |
my $c = $self->safety_character; |
1341 | 1332 |
my $join_re = qr/(?:^|\s)($c+)\.$c+\s+=\s+($c+)\.$c+/; |
1342 | 1333 |
if ($j_clause =~ $join_re) { |
... | ... |
@@ -1376,13 +1367,17 @@ sub _quote { |
1376 | 1367 |
} |
1377 | 1368 |
|
1378 | 1369 |
sub _q { |
1379 |
- my $self = shift; |
|
1370 |
+ my ($self, $value) = @_; |
|
1380 | 1371 |
|
1381 | 1372 |
my $quote = $self->_quote; |
1382 | 1373 |
my $q = substr($quote, 0, 1) || ''; |
1383 |
- my $p = substr($quote, 1, 1) || $q || ''; |
|
1374 |
+ my $p; |
|
1375 |
+ if (defined $quote && length $quote > 1) { |
|
1376 |
+ $p = substr($quote, 1, 1); |
|
1377 |
+ } |
|
1378 |
+ else { $p = $q } |
|
1384 | 1379 |
|
1385 |
- return ($q, $p); |
|
1380 |
+ return "$q$value$p"; |
|
1386 | 1381 |
} |
1387 | 1382 |
|
1388 | 1383 |
sub _remove_duplicate_table { |
... | ... |
@@ -1403,7 +1398,8 @@ sub _search_tables { |
1403 | 1398 |
my $safety_character = $self->safety_character; |
1404 | 1399 |
my $q = $self->_quote; |
1405 | 1400 |
my $q_re = quotemeta($q); |
1406 |
- my $table_re = $q ? qr/(?:^|[^$safety_character])$q_re?([$safety_character]+)$q_re?\./ |
|
1401 |
+ my $quoted_safety_character_re = $self->_q("?([$safety_character]+)"); |
|
1402 |
+ my $table_re = $q ? qr/(?:^|[^$safety_character])$quoted_safety_character_re?\./ |
|
1407 | 1403 |
: qr/(?:^|[^$safety_character])([$safety_character]+)\./; |
1408 | 1404 |
while ($source =~ /$table_re/g) { |
1409 | 1405 |
push @$tables, $1; |
... | ... |
@@ -1422,8 +1418,8 @@ sub _where_to_obj { |
1422 | 1418 |
my $clause = ['and']; |
1423 | 1419 |
my $q = $self->_quote; |
1424 | 1420 |
foreach my $column (keys %$where) { |
1425 |
- my $column_quote = "$q$column$q"; |
|
1426 |
- $column_quote =~ s/\./$q.$q/; |
|
1421 |
+ my $column_quote = $self->_q($column); |
|
1422 |
+ $column_quote =~ s/\./$self->_q(".")/e; |
|
1427 | 1423 |
push @$clause, "$column_quote = :$column" for keys %$where; |
1428 | 1424 |
} |
1429 | 1425 |
$obj = $self->where(clause => $clause, param => $where); |
... | ... |
@@ -7,16 +7,15 @@ use overload |
7 | 7 |
|
8 | 8 |
|
9 | 9 |
has orders => sub { [] }, |
10 |
- quote => ''; |
|
10 |
+ dbi => ''; |
|
11 | 11 |
|
12 | 12 |
sub prepend { |
13 | 13 |
my $self = shift; |
14 | 14 |
|
15 |
- my $q = $self->quote; |
|
16 | 15 |
foreach my $order (reverse @_) { |
17 | 16 |
if (ref $order eq 'ARRAY') { |
18 | 17 |
my $column = shift @$order; |
19 |
- $column = "$q$column$q" if defined $column; |
|
18 |
+ $column = $self->dbi->_q($column) if defined $column; |
|
20 | 19 |
my $derection = shift @$order; |
21 | 20 |
$order = $column; |
22 | 21 |
$order .= " $derection" if $derection; |
... | ... |
@@ -107,7 +107,8 @@ sub _parse { |
107 | 107 |
# Remove quote |
108 | 108 |
my $column = $columns->[0]; |
109 | 109 |
if (my $q = $self->quote) { |
110 |
- $column =~ s/$q//g; |
|
110 |
+ $q = quotemeta($q); |
|
111 |
+ $column =~ s/[$q]//g; |
|
111 | 112 |
} |
112 | 113 |
|
113 | 114 |
# Check safety |