X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSQLMaker.pm;fp=lib%2FDBIx%2FClass%2FSQLMaker.pm;h=0d27ec9fc04072877d903cc50c192558ff9e11e1;hb=cb913aa5b344d8d899bd7756a235d3bbdab0219f;hp=6213c8b34ad03d2f4d33c2469faaab75006bcb7e;hpb=a1228381d2285abfc1ec35466896900c070f4bc3;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/SQLMaker.pm b/lib/DBIx/Class/SQLMaker.pm index 6213c8b..0d27ec9 100644 --- a/lib/DBIx/Class/SQLMaker.pm +++ b/lib/DBIx/Class/SQLMaker.pm @@ -60,6 +60,40 @@ sub _quote_chars { ; } +sub _escape_char { + $_[0]->{escape_char} || ($_[0]->_quote_chars)[1] || ''; +} + +sub _unquote { + my ($self, $value) = @_; + + return $value unless defined $value; + + my ($l, $r, $e) = map { quotemeta $_ } $self->_quote_chars, $self->_escape_char; + + # no quoting, all bets are off + return $value unless length $e; + + my $re = $self->_quoted_ident_re($l, $r, $e); + + if ($value =~ /\A$re\z/) { + $value =~ s/\A$l//; + $value =~ s/$r\z//; + $value =~ s/( $e [$e$r] )/substr($1, 1)/gex; + return $value; + } + else { + # not a quoted value, assume it's an identifier + return $value; + } +} + +sub _quoted_ident_re { + my $self = shift; + my ($l, $r, $e) = @_ ? @_ : map { quotemeta $_ } $self->_quote_chars, $self->_escape_char; + return qr/ $l (?: [^$e$r] | $e [$e$r] )+ $r /x; +} + # FIXME when we bring in the storage weaklink, check its schema # weaklink and channel through $schema->throw_exception sub throw_exception { DBIx::Class::Exception->throw($_[1]) }