speed up service search
[freeside.git] / FS / FS / svc_hardware.pm
index 22e6275..b28cc9e 100644 (file)
@@ -2,9 +2,13 @@ package FS::svc_hardware;
 
 use strict;
 use base qw( FS::svc_Common );
+use vars qw( $conf );
 use FS::Record qw( qsearch qsearchs );
 use FS::hardware_type;
 use FS::hardware_status;
+use FS::Conf;
+
+FS::UID->install_callback(sub { $conf = FS::Conf->new; });
 
 =head1 NAME
 
@@ -101,9 +105,13 @@ sub search_sql {
   my ($class, $string) = @_;
   my @where = ();
 
-  my $ip = NetAddr::IP->new($string);
-  if ( $ip ) {
-    push @where, $class->search_sql_field('ip_addr', $ip->addr);
+  if ( $string =~ /^[\d\.:]+$/ ) {
+    # if the string isn't an IP address, this will waste several seconds
+    # attempting a DNS lookup.  so try to filter those out.
+    my $ip = NetAddr::IP->new($string);
+    if ( $ip ) {
+      push @where, $class->search_sql_field('ip_addr', $ip->addr);
+    }
   }
   
   if ( $string =~ /^(\w+)$/ ) {
@@ -125,7 +133,7 @@ sub search_sql {
 
 sub label {
   my $self = shift;
-  $self->serial || $self->hw_addr;
+  $self->serial || $self->display_hw_addr;
 }
 
 =item insert
@@ -160,7 +168,7 @@ sub check {
   return $x unless ref $x;
 
   my $hw_addr = $self->getfield('hw_addr');
-  $hw_addr = join('', split(/\W/, $hw_addr));
+  $hw_addr = join('', split(/[_\W]/, $hw_addr));
   if ( $conf->exists('svc_hardware-check_mac_addr') ) {
     $hw_addr = uc($hw_addr);
     $hw_addr =~ /^[0-9A-F]{12}$/ 
@@ -213,6 +221,18 @@ sub status_label {
   $status->label;
 }
 
+=item display_hw_addr
+
+Returns the 'hw_addr' field, formatted as a MAC address if the
+'svc_hardware-check_mac_addr' option is enabled.
+
+=cut
+
+sub display_hw_addr {
+  my $self = shift;
+  ($conf->exists('svc_hardware-check_mac_addr') ? 
+    join(':', $self->hw_addr =~ /../g) : $self->hw_addr)
+}
 
 =back