X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fsvc_IP_Mixin.pm;h=4c2180ece677e781002b77fdb9377d7c7ae11a89;hp=4266a2a5e8991b203eafa6bac6c6e0c7f5cab8fb;hb=3adb46fccf9f631e188ea5383bd147b340477639;hpb=5506c3aea73686da65f7caf2acbdca715cc6c1a5 diff --git a/FS/FS/svc_IP_Mixin.pm b/FS/FS/svc_IP_Mixin.pm index 4266a2a5e..4c2180ece 100644 --- a/FS/FS/svc_IP_Mixin.pm +++ b/FS/FS/svc_IP_Mixin.pm @@ -81,7 +81,7 @@ sub svc_ip_check { my $error = $self->ip_check; return $error if $error; if ( my $router = $self->router ) { - if ( grep { $_->routernum eq $router->routernum } $self->allowed_routers ) { + if ( grep { $_->routernum == $router->routernum } $self->allowed_routers ) { return ''; } else { return 'Router '.$router->routername.' not available for this service'; @@ -91,38 +91,21 @@ sub svc_ip_check { } sub _used_addresses { + my ($class, $block, $exclude_svc) = @_; - # Returns all addresses in use. Does not filter with $block. ref:f197bdbaa1 - - my ($class, $block, $exclude) = @_; - my $ip_field = $class->table_info->{'ip_field'} - or return (); - # if the service doesn't have an ip_field, then it has no IP addresses - # in use, yes? - - my %hash = ( $ip_field => { op => '!=', value => '' } ); - #$hash{'blocknum'} = $block->blocknum if $block; - $hash{'svcnum'} = { op => '!=', value => $exclude->svcnum } if ref $exclude; - map { my $na = $_->NetAddr; $na ? $na->addr : () } - qsearch({ - table => $class->table, - hashref => \%hash, - extra_sql => " AND $ip_field != '0e0'", - }); -} - -sub _used_addresses_in_block { - my ($class, $block) = @_; - - croak "_used_addresses_in_block() requires an FS::addr_block parameter" + croak "_used_addresses() requires an FS::addr_block parameter" unless ref $block && $block->isa('FS::addr_block'); my $ip_field = $class->table_info->{'ip_field'}; if ( !$ip_field ) { - carp "_used_addresses_in_block() skipped, no ip_field"; + carp "_used_addresses() skipped, no ip_field"; return; } + my %qsearch = ( $ip_field => { op => '!=', value => '' }); + $qsearch{svcnum} = { op => '!=', value => $exclude_svc->svcnum } + if ref $exclude_svc && $exclude_svc->svcnum; + my $block_na = $block->NetAddr; my $octets; @@ -149,15 +132,16 @@ sub _used_addresses_in_block { # parameter to bypass FS::Record objects creation and just # return hashrefs from DBI. 200,000 hashrefs are many seconds faster # than 200,000 FS::Record objects - my %qsearch = ( + my %qsearch_param = ( table => $class->table, select => $ip_field, - hashref => { $ip_field => { op => '!=', value => '' }}, + hashref => \%qsearch, extra_sql => " AND $ip_field != '0e0' ", ); if ( $octets ) { my $block_str = join('.', (split(/\D/, $block_na->first))[0..$octets-1]); - $qsearch{extra_sql} .= " AND $ip_field LIKE ".dbh->quote("${block_str}.%"); + $qsearch_param{extra_sql} + .= " AND $ip_field LIKE ".dbh->quote("${block_str}.%"); } if ( $block->ip_netmask % 8 ) { @@ -171,7 +155,7 @@ sub _used_addresses_in_block { return map { $_->$ip_field } - qsearch( \%qsearch ); + qsearch( \%qsearch_param ); } sub _is_used {