svc_broadband rewrite
[freeside.git] / FS / FS / Record.pm
index 8778dee..4021510 100644 (file)
@@ -208,34 +208,40 @@ sub qsearch {
     $statement .= ' WHERE '. join(' AND ', map {
 
       my $op = '=';
+      my $column = $_;
       if ( ref($record->{$_}) ) {
         $op = $record->{$_}{'op'} if $record->{$_}{'op'};
-        $op = 'LIKE' if $op =~ /^ILIKE$/i && driver_name ne 'Pg';
+        #$op = 'LIKE' if $op =~ /^ILIKE$/i && driver_name ne 'Pg';
+        if ( uc($op) eq 'ILIKE' ) {
+          $op = 'LIKE';
+          $record->{$_}{'value'} = lc($record->{$_}{'value'});
+          $column = "LOWER($_)";
+        }
         $record->{$_} = $record->{$_}{'value'}
       }
 
       if ( ! defined( $record->{$_} ) || $record->{$_} eq '' ) {
         if ( $op eq '=' ) {
           if ( driver_name eq 'Pg' ) {
-            qq-( $_ IS NULL OR $_ = '' )-;
+            qq-( $column IS NULL OR $column = '' )-;
           } else {
-            qq-( $_ IS NULL OR $_ = "" )-;
+            qq-( $column IS NULL OR $column = "" )-;
           }
         } elsif ( $op eq '!=' ) {
           if ( driver_name eq 'Pg' ) {
-            qq-( $_ IS NOT NULL AND $_ != '' )-;
+            qq-( $column IS NOT NULL AND $column != '' )-;
           } else {
-            qq-( $_ IS NOT NULL AND $_ != "" )-;
+            qq-( $column IS NOT NULL AND $column != "" )-;
           }
         } else {
           if ( driver_name eq 'Pg' ) {
-            qq-( $_ $op '' )-;
+            qq-( $column $op '' )-;
           } else {
-            qq-( $_ $op "" )-;
+            qq-( $column $op "" )-;
           }
         }
       } else {
-        "$_ $op ?";
+        "$column $op ?";
       }
     } @fields );
   }
@@ -324,9 +330,11 @@ for a single item, or your data is corrupted.
 =cut
 
 sub qsearchs { # $result_record = &FS::Record:qsearchs('table',\%hash);
+  my $table = $_[0];
   my(@result) = qsearch(@_);
-  carp "warning: Multiple records in scalar search!" if scalar(@result) > 1;
-    #should warn more vehemently if the search was on a primary key?
+  carp "warning: Multiple records in scalar search ($table)"
+    if scalar(@result) > 1;
+  #should warn more vehemently if the search was on a primary key?
   scalar(@result) ? ($result[0]) : ();
 }
 
@@ -480,10 +488,17 @@ sub insert {
   my $db_seq = 0;
   if ( $primary_key ) {
     my $col = $self->dbdef_table->column($primary_key);
-    my $db_seq =
+    
+    $db_seq =
       uc($col->type) eq 'SERIAL'
-      || ( driver_name eq 'Pg'    && $col->default =~ /^nextval\(/i     )
-      || ( driver_name eq 'mysql' && $col->local   =~ /AUTO_INCREMENT/i );
+      || ( driver_name eq 'Pg'
+             && defined($col->default)
+             && $col->default =~ /^nextval\(/i
+         )
+      || ( driver_name eq 'mysql'
+             && defined($col->local)
+             && $col->local =~ /AUTO_INCREMENT/i
+         );
     $self->unique($primary_key) unless $self->getfield($primary_key) || $db_seq;
   }
 
@@ -515,11 +530,12 @@ sub insert {
   $sth->execute or return $sth->errstr;
 
   if ( $db_seq ) { # get inserted id from the database, if applicable
+    warn "[debug]$me retreiving sequence from database\n" if $DEBUG;
     my $insertid = '';
     if ( driver_name eq 'Pg' ) {
 
       my $oid = $sth->{'pg_oid_status'};
-      my $i_sql = "SELECT id FROM $table WHERE oid = ?";
+      my $i_sql = "SELECT $primary_key FROM $table WHERE oid = ?";
       my $i_sth = dbh->prepare($i_sql) or do {
         dbh->rollback if $FS::UID::AutoCommit;
         return dbh->errstr;