X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FRecord.pm;h=2540dd399f40eca00168f863cb83a125cd502209;hb=106d0163556c31a3b2cf9c065ec6d9d6ded0ce64;hp=b9fb2ae083f695d84121045c9b27892fd0ee66ad;hpb=a0b96a08ba89ce16d43eaa7391c438a0c9607cc9;p=freeside.git diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm index b9fb2ae08..2540dd399 100644 --- a/FS/FS/Record.pm +++ b/FS/FS/Record.pm @@ -3,7 +3,9 @@ package FS::Record; use strict; use vars qw( $AUTOLOAD @ISA @EXPORT_OK $DEBUG $conf $me - %virtual_fields_cache $nowarn_identical $no_update_diff ); + %virtual_fields_cache + $nowarn_identical $no_update_diff $no_check_foreign + ); use Exporter; use Carp qw(carp cluck croak confess); use Scalar::Util qw( blessed ); @@ -33,6 +35,7 @@ $me = '[FS::Record]'; $nowarn_identical = 0; $no_update_diff = 0; +$no_check_foreign = 0; my $rsa_module; my $rsa_loaded; @@ -42,7 +45,7 @@ my $rsa_decrypt; FS::UID->install_callback( sub { eval "use FS::Conf;"; die $@ if $@; - $conf = new FS::Conf; + $conf = FS::Conf->new; $File::CounterFile::DEFAULT_DIR = $conf->base_dir . "/counters.". datasrc; } ); @@ -238,6 +241,8 @@ fine in the common case where there are only two parameters: =cut +my %TYPE = (); #for debugging + sub qsearch { my($stable, $record, $select, $extra_sql, $order_by, $cache, $addl_from ); my $debug = ''; @@ -298,20 +303,33 @@ sub qsearch { foreach my $field ( grep defined( $record->{$_} ) && $record->{$_} ne '', @real_fields ) { + my $value = $record->{$field}; $value = $value->{'value'} if ref($value); my $type = dbdef->table($table)->column($field)->type; + + my $TYPE = SQL_VARCHAR; if ( $type =~ /(int|(big)?serial)/i && $value =~ /^\d+(\.\d+)?$/ ) { - $sth->bind_param($bind++, $value, { TYPE => SQL_INTEGER } ); - } elsif ( ( $type =~ /(numeric)/i && $value =~ /^[+-]?\d+(\.\d+)?$/) - || ( $type =~ /(real|float4)/i - && $value =~ /[-+]?\d*\.?\d+([eE][-+]?\d+)?/ - ) - ) { - $sth->bind_param($bind++, $value, { TYPE => SQL_FLOAT } ); - } else { - $sth->bind_param($bind++, $value, { TYPE => SQL_VARCHAR } ); + $TYPE = SQL_INTEGER; + + #DBD::Pg 1.49: Cannot bind ... unknown sql_type 6 + #} elsif ( ( $type =~ /(numeric)/i && $value =~ /^[+-]?\d+(\.\d+)?$/) + # || ( $type =~ /(real|float4)/i + # && $value =~ /[-+]?\d*\.?\d+([eE][-+]?\d+)?/ + # ) + # ) { + # $TYPE = SQL_FLOAT; + } + + if ( $DEBUG > 2 ) { + no strict 'refs'; + %TYPE = map { &{"DBI::$_"}() => $_ } @{ $DBI::EXPORT_TAGS{sql_types} } + unless keys %TYPE; + warn " bind_param $bind (for field $field), $value, TYPE $TYPE{$TYPE}\n"; } + + $sth->bind_param($bind++, $value, { TYPE => $TYPE } ); + } # $sth->execute( map $record->{$_}, @@ -788,17 +806,18 @@ sub insert { } my $table = $self->table; - # Encrypt before the database - if ($conf->exists('encryption') && defined(eval '@FS::'. $table . '::encrypted_fields')) { + if ( defined(eval '@FS::'. $table . '::encrypted_fields') + && scalar( eval '@FS::'. $table . '::encrypted_fields') + && $conf->exists('encryption') + ) { foreach my $field (eval '@FS::'. $table . '::encrypted_fields') { $self->{'saved'} = $self->getfield($field); $self->setfield($field, $self->encrypt($self->getfield($field))); } } - #false laziness w/delete my @real_fields = grep { defined($self->getfield($_)) && $self->getfield($_) ne "" } @@ -1287,7 +1306,7 @@ sub _h_statement { # If we're encrypting then don't ever store the payinfo or CVV2 in the history.... # You can see if it changed by the paymask... - if ($conf->exists('encryption') ) { + if ($conf && $conf->exists('encryption') ) { @fields = grep $_ ne 'payinfo' && $_ ne 'cvv2', @fields; } my @values = map { _quote( $self->getfield($_), $self->table, $_) } @fields; @@ -1595,6 +1614,8 @@ sub ut_phonen { $self->setfield($field,''); } elsif ( $country eq 'US' || $country eq 'CA' ) { $phonen =~ s/\D//g; + $phonen = $conf->config('cust_main-default_areacode').$phonen + if length($phonen)==7 && $conf->config('cust_main-default_areacode'); $phonen =~ /^(\d{3})(\d{3})(\d{4})(\d*)$/ or return gettext('illegal_phone'). " $field: ". $self->getfield($field); $phonen = "$1-$2-$3"; @@ -1887,6 +1908,7 @@ on the column first. sub ut_foreign_key { my( $self, $field, $table, $foreign ) = @_; + return '' if $no_check_foreign; qsearchs($table, { $foreign => $self->getfield($field) }) or return "Can't find ". $self->table. ".$field ". $self->getfield($field). " in $table.$foreign";