X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FRecord.pm;h=191eee5f02c8617ae90c4580dbe36fa07b165b07;hb=1d2cbbff7fe3600eef0abfb3c0fc0712b3b0506b;hp=9d82d949b878e217d1cd8e8beb7fd5886eaa9b9d;hpb=58d44fbe5eb9ab32e6d87063a4a3b22ddba9a828;p=freeside.git diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm index 9d82d949b..191eee5f0 100644 --- a/FS/FS/Record.pm +++ b/FS/FS/Record.pm @@ -2,7 +2,7 @@ package FS::Record; use strict; use vars qw( $dbdef_file $dbdef $setup_hack $AUTOLOAD @ISA @EXPORT_OK $DEBUG - $me %dbdef_cache ); + $me %dbdef_cache %virtual_fields_cache ); use subs qw(reload_dbdef); use Exporter; use Carp qw(carp cluck croak confess); @@ -21,7 +21,7 @@ use Tie::IxHash; @ISA = qw(Exporter); @EXPORT_OK = qw(dbh fields hfields qsearch qsearchs dbdef jsearch); -$DEBUG = 2; +$DEBUG = 0; $me = '[FS::Record]'; #ask FS::UID to run this stuff for us later @@ -230,7 +230,8 @@ sub qsearch { if ( ! defined( $record->{$_} ) || $record->{$_} eq '' ) { if ( $op eq '=' ) { if ( driver_name eq 'Pg' ) { - if ( $dbdef->table($table)->column($column)->type =~ /(int)/i ) { + my $type = $dbdef->table($table)->column($column)->type; + if ( $type =~ /(int|serial)/i ) { qq-( $column IS NULL )-; } else { qq-( $column IS NULL OR $column = '' )-; @@ -240,7 +241,8 @@ sub qsearch { } } elsif ( $op eq '!=' ) { if ( driver_name eq 'Pg' ) { - if ( $dbdef->table($table)->column($column)->type =~ /(int)/i ) { + my $type = $dbdef->table($table)->column($column)->type; + if ( $type =~ /(int|serial)/i ) { qq-( $column IS NOT NULL )-; } else { qq-( $column IS NOT NULL AND $column != '' )-; @@ -309,11 +311,11 @@ sub qsearch { grep defined( $record->{$_} ) && $record->{$_} ne '', @real_fields ) { if ( $record->{$field} =~ /^\d+(\.\d+)?$/ - && $dbdef->table($table)->column($field)->type =~ /(int)/i + && $dbdef->table($table)->column($field)->type =~ /(int|serial)/i ) { - $sth->bind_param($bind++, $record->{$field}, { TYPE => SQL_INTEGER } ); + $sth->bind_param($bind++, $record->{$field}, SQL_INTEGER); } else { - $sth->bind_param($bind++, $record->{$field}, { TYPE => SQL_VARCHAR } ); + $sth->bind_param($bind++, $record->{$field}, SQL_VARCHAR); } } @@ -664,7 +666,7 @@ sub insert { if (@virtual_fields) { my %v_values = map { $_, $self->getfield($_) } @virtual_fields; - my $vfieldpart = vfieldpart_hashref($table); + my $vfieldpart = $self->vfieldpart_hashref; my $v_statement = "INSERT INTO virtual_field(recnum, vfieldpart, value) ". "VALUES (?, ?, ?)"; @@ -753,7 +755,7 @@ sub delete { my $primary_key = $self->dbdef_table->primary_key; my $v_sth; my @del_vfields; - my $vfp = vfieldpart_hashref($self->table); + my $vfp = $self->vfieldpart_hashref; foreach($self->virtual_fields) { next if $self->getfield($_) eq ''; unless(@del_vfields) { @@ -870,7 +872,7 @@ sub replace { my $v_rep_sth; my $v_del_sth; my (@add_vfields, @rep_vfields, @del_vfields); - my $vfp = vfieldpart_hashref($old->table); + my $vfp = $old->vfieldpart_hashref; foreach(grep { exists($diff{$_}) } $new->virtual_fields) { if($diff{$_} eq '') { # Delete @@ -1369,20 +1371,25 @@ be exported, and should only be called as an instance or class method. =cut sub virtual_fields { - my $something = shift; + my $self = shift; my $table; - $table = $something->table or confess "virtual_fields called on non-table"; + $table = $self->table or confess "virtual_fields called on non-table"; confess "Unknown table $table" unless $dbdef->table($table); - # This should be smart enough to cache results. + return () unless $self->dbdef->table('part_virtual_field'); + + unless ( $virtual_fields_cache{$table} ) { + my $query = 'SELECT name from part_virtual_field ' . + "WHERE dbtable = '$table'"; + my $dbh = dbh; + my $result = $dbh->selectcol_arrayref($query); + confess $dbh->errstr if $dbh->err; + $virtual_fields_cache{$table} = $result; + } + + @{$virtual_fields_cache{$table}}; - my $query = 'SELECT name from part_virtual_field ' . - "WHERE dbtable = '$table'"; - my $dbh = dbh; - my $result = $dbh->selectcol_arrayref($query); - confess $dbh->errstr if $dbh->err; - return @$result; } @@ -1509,9 +1516,11 @@ TABLE. =cut sub vfieldpart_hashref { - my ($table) = @_; + my $self = shift; + my $table = $self->table; + + return {} unless $self->dbdef->table('part_virtual_field'); - return () unless $table; my $dbh = dbh; my $statement = "SELECT vfieldpart, name FROM part_virtual_field WHERE ". "dbtable = '$table'";