X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FRecord.pm;h=5a446d886db14cd6397bc0074affe2674562eb95;hb=f163fa1c9f616fbbb5413e6fad09bd08957b0c3a;hp=0480a397f3f2e44bb057146aed8452169a712772;hpb=327fbdcae418952049c9a8cb5b93165cd03f649a;p=freeside.git diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm index 0480a397f..5a446d886 100644 --- a/FS/FS/Record.pm +++ b/FS/FS/Record.pm @@ -298,6 +298,14 @@ sub qsearch { && dbdef->table($table)->column($field)->type =~ /(int|(big)?serial)/i ) { $sth->bind_param($bind++, $record->{$field}, { TYPE => SQL_INTEGER } ); + }elsif ( $record->{$field} =~ /^[+-]?\d+(\.\d+)?$/ + && dbdef->table($table)->column($field)->type =~ /(numeric)/i + ) { + $sth->bind_param($bind++, $record->{$field}, { TYPE => SQL_FLOAT } ); + }elsif ( $record->{$field} =~ /[-+]?\d*\.?\d+([eE][-+]?\d+)?/ + && dbdef->table($table)->column($field)->type =~ /(float4)/i + ) { + $sth->bind_param($bind++, $record->{$field}, { TYPE => SQL_FLOAT } ); } else { $sth->bind_param($bind++, $record->{$field}, { TYPE => SQL_VARCHAR } ); } @@ -1343,10 +1351,10 @@ null. If there is an error, returns the error, otherwise returns false. sub ut_float { my($self,$field)=@_ ; - ($self->getfield($field) =~ /^(\d+\.\d+)$/ || - $self->getfield($field) =~ /^(\d+)$/ || - $self->getfield($field) =~ /^(\d+\.\d+e\d+)$/ || - $self->getfield($field) =~ /^(\d+e\d+)$/) + ($self->getfield($field) =~ /^\s*(\d+\.\d+)\s*$/ || + $self->getfield($field) =~ /^\s*(\d+)\s*$/ || + $self->getfield($field) =~ /^\s*(\d+\.\d+e\d+)\s*$/ || + $self->getfield($field) =~ /^\s*(\d+e\d+)\s*$/) or return "Illegal or empty (float) $field: ". $self->getfield($field); $self->setfield($field,$1); ''; @@ -1379,10 +1387,10 @@ false. sub ut_sfloat { my($self,$field)=@_ ; - ($self->getfield($field) =~ /^(-?\d+\.\d+)$/ || - $self->getfield($field) =~ /^(-?\d+)$/ || - $self->getfield($field) =~ /^(-?\d+\.\d+[eE]-?\d+)$/ || - $self->getfield($field) =~ /^(-?\d+[eE]-?\d+)$/) + ($self->getfield($field) =~ /^\s*(-?\d+\.\d+)\s*$/ || + $self->getfield($field) =~ /^\s*(-?\d+)\s*$/ || + $self->getfield($field) =~ /^\s*(-?\d+\.\d+[eE]-?\d+)\s*$/ || + $self->getfield($field) =~ /^\s*(-?\d+[eE]-?\d+)\s*$/) or return "Illegal or empty (float) $field: ". $self->getfield($field); $self->setfield($field,$1); ''; @@ -1413,7 +1421,7 @@ returns the error, otherwise returns false. sub ut_snumber { my($self, $field) = @_; - $self->getfield($field) =~ /^(-?)\s*(\d+)$/ + $self->getfield($field) =~ /^\s*(-?)\s*(\d+)\s*$/ or return "Illegal or empty (numeric) $field: ". $self->getfield($field); $self->setfield($field, "$1$2"); ''; @@ -1428,7 +1436,7 @@ returns the error, otherwise returns false. sub ut_snumbern { my($self, $field) = @_; - $self->getfield($field) =~ /^(-?)\s*(\d*)$/ + $self->getfield($field) =~ /^\s*(-?)\s*(\d*)\s*$/ or return "Illegal (numeric) $field: ". $self->getfield($field); if ($1) { return "Illegal (numeric) $field: ". $self->getfield($field) @@ -1447,7 +1455,7 @@ is an error, returns the error, otherwise returns false. sub ut_number { my($self,$field)=@_; - $self->getfield($field) =~ /^(\d+)$/ + $self->getfield($field) =~ /^\s*(\d+)\s*$/ or return "Illegal or empty (numeric) $field: ". $self->getfield($field); $self->setfield($field,$1); ''; @@ -1462,7 +1470,7 @@ an error, returns the error, otherwise returns false. sub ut_numbern { my($self,$field)=@_; - $self->getfield($field) =~ /^(\d*)$/ + $self->getfield($field) =~ /^\s*(\d*)\s*$/ or return "Illegal (numeric) $field: ". $self->getfield($field); $self->setfield($field,$1); ''; @@ -1478,7 +1486,7 @@ is an error, returns the error, otherwise returns false. sub ut_money { my($self,$field)=@_; $self->setfield($field, 0) if $self->getfield($field) eq ''; - $self->getfield($field) =~ /^(\-)? ?(\d*)(\.\d{2})?$/ + $self->getfield($field) =~ /^\s*(\-)?\s*(\d*)(\.\d{2})?\s*$/ or return "Illegal (money) $field: ". $self->getfield($field); #$self->setfield($field, "$1$2$3" || 0); $self->setfield($field, ( ($1||''). ($2||''). ($3||'') ) || 0); @@ -1555,6 +1563,20 @@ sub ut_alphan { ''; } +=item ut_alpha_lower COLUMN + +Check/untaint lowercase alphanumeric strings (no spaces). May not be null. If +there is an error, returns the error, otherwise returns false. + +=cut + +sub ut_alpha_lower { + my($self,$field)=@_; + $self->getfield($field) =~ /[[:upper:]]/ + and return "Uppercase characters are not permitted in $field"; + $self->ut_alpha($field); +} + =item ut_phonen COLUMN [ COUNTRY ] Check/untaint phone numbers. May be null. If there is an error, returns @@ -2131,6 +2153,19 @@ sub h_search { } +=item h_date ACTION + +Given an ACTION, either "insert", or "delete", returns the timestamp of the +appropriate history record corresponding to this record, if any. + +=cut + +sub h_date { + my($self, $action) = @_; + my $h = $self->h_search($action); + $h ? $h->history_date : ''; +} + =back =head1 SUBROUTINES @@ -2225,9 +2260,9 @@ sub DESTROY { return; } =item str2time_sql [ DRIVER_NAME ] Returns a function to convert to unix time based on database type, such as -"EXTRACT( EPOCH FROM" for Pg or "UNIX_TIMESTAMP(" for mysql. You are -responsible for the closing parenthesis yourself. Don't let it down. It's a -sensitive parenthesis. +"EXTRACT( EPOCH FROM" for Pg or "UNIX_TIMESTAMP(" for mysql. See +the str2time_sql_closing method to return a closing string rather than just +using a closing parenthesis as previously suggested. You can pass an optional driver name such as "Pg", "mysql" or $dbh->{Driver}->{Name} to return a function for that database instead of @@ -2247,6 +2282,24 @@ sub str2time_sql { } +=item str2time_sql_closing [ DRIVER_NAME ] + +Returns the closing suffix of a function to convert to unix time based on +database type, such as ")::integer" for Pg or ")" for mysql. + +You can pass an optional driver name such as "Pg", "mysql" or +$dbh->{Driver}->{Name} to return a function for that database instead of +the current database. + +=cut + +sub str2time_sql_closing { + my $driver = shift || driver_name; + + return ' )::INTEGER ' if $driver =~ /^Pg/i; + return ' ) '; +} + =back =head1 BUGS