X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FSybase%2FNoBindVars.pm;h=8f80c3d7995c57ddf12afddf6e0e3004f9bae9e7;hb=6636ad53c7480e9546c2a0a3ecaa5a807874c819;hp=b5d61a20edcaea92973259374948d46316fa271f;hpb=7e8cecc15add55966fd4df8810141d417d333ddd;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Sybase/NoBindVars.pm b/lib/DBIx/Class/Storage/DBI/Sybase/NoBindVars.pm index b5d61a2..8f80c3d 100644 --- a/lib/DBIx/Class/Storage/DBI/Sybase/NoBindVars.pm +++ b/lib/DBIx/Class/Storage/DBI/Sybase/NoBindVars.pm @@ -1,9 +1,12 @@ package DBIx::Class::Storage::DBI::Sybase::NoBindVars; +use Class::C3; use base qw/ DBIx::Class::Storage::DBI::NoBindVars DBIx::Class::Storage::DBI::Sybase /; +use List::Util (); +use Scalar::Util (); sub _dbh_last_insert_id { my ($self, $dbh, $source, $col) = @_; @@ -13,6 +16,39 @@ sub _dbh_last_insert_id { return ($dbh->selectrow_array('select @@identity'))[0]; } +my $number = sub { Scalar::Util::looks_like_number($_[0]) }; + +my $decimal = sub { $_[0] =~ /^ [-+]? \d+ (?:\.\d*)? \z/x }; + +my %noquote = ( + int => sub { $_[0] =~ /^ [-+]? \d+ \z/x }, + bit => => sub { $_[0] =~ /^[01]\z/ }, + money => sub { $_[0] =~ /^\$ \d+ (?:\.\d*)? \z/x }, + float => $number, + real => $number, + double => $number, + decimal => $decimal, + numeric => $decimal, +); + +sub should_quote { + my $self = shift; + my ($type, $value) = @_; + + return $self->next::method(@_) if not defined $value; + + $type ||= ''; + + if (my $key = List::Util::first { $type =~ /$_/i } keys %noquote) { + return 0 if $noquote{$key}->($value); + } elsif (not $type) { +# try to guess based on value + return 0 if $number->($value) || $noquote->{money}->($value); + } + + return $self->next::method(@_); +} + 1; =head1 NAME