Diff for /loncom/interface/lonsearchcat.pm between versions 1.331.4.8 and 1.333

version 1.331.4.8, 2013/12/13 16:40:01 version 1.333, 2012/12/17 08:29:26
Line 52  search (on a server basis) is displayed Line 52  search (on a server basis) is displayed
   
 =head1 Internals  =head1 Internals
   
   =over 4
   
 =cut  =cut
   
 ###############################################################################  ###############################################################################
Line 319  END Line 321  END
         &display_results($r,$importbutton,$closebutton,$diropendb,          &display_results($r,$importbutton,$closebutton,$diropendb,
                          $env{'form.area'});                           $env{'form.area'});
     } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {      } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {
         my ($query,$customquery,$customshow,$libraries,$pretty_string,$domainsref) =          my ($query,$customquery,$customshow,$libraries,$pretty_string) =
             &get_persistent_data($persistent_db_file,              &get_persistent_data($persistent_db_file,
                  ['query','customquery','customshow',                   ['query','customquery','customshow',
                   'libraries','pretty_string','domains']);                    'libraries','pretty_string']);
         if ($env{'form.phase'} eq 'sort') {          if ($env{'form.phase'} eq 'sort') {
             &print_sort_form($r,$pretty_string);              &print_sort_form($r,$pretty_string);
         } elsif ($env{'form.phase'} eq 'run_search') {          } elsif ($env{'form.phase'} eq 'run_search') {
             &run_search($r,$query,$customquery,$customshow,              &run_search($r,$query,$customquery,$customshow,
                         $libraries,$pretty_string,$env{'form.area'},$domainsref);                          $libraries,$pretty_string,$env{'form.area'});
         }          }
     } elsif(($env{'form.phase'} eq 'basic_search') ||      } elsif(($env{'form.phase'} eq 'basic_search') ||
             ($env{'form.phase'} eq 'adv_search')) {              ($env{'form.phase'} eq 'adv_search')) {
         #          #
         # We are running a search, try to parse it          # We are running a search, try to parse it
         my ($query,$customquery,$customshow,$libraries,$domains) =           my ($query,$customquery,$customshow,$libraries) = 
             (undef,undef,undef,undef,undef);              (undef,undef,undef,undef);
         my $pretty_string;          my $pretty_string;
         if ($env{'form.phase'} eq 'basic_search') {          if ($env{'form.phase'} eq 'basic_search') {
             ($query,$pretty_string,$libraries,$domains) =               ($query,$pretty_string,$libraries) = 
                 &parse_basic_search($r,$closebutton,$hidden_fields);                  &parse_basic_search($r,$closebutton,$hidden_fields);
             return OK if (! defined($query));              return OK if (! defined($query));
             &make_persistent({ basicexp => $env{'form.basicexp'}},              &make_persistent({ basicexp => $env{'form.basicexp'}},
                              $persistent_db_file);                               $persistent_db_file);
         } else {                      # Advanced search          } else {                      # Advanced search
             ($query,$customquery,$customshow,$libraries,$pretty_string,$domains)               ($query,$customquery,$customshow,$libraries,$pretty_string) 
                 = &parse_advanced_search($r,$closebutton,$hidden_fields);                  = &parse_advanced_search($r,$closebutton,$hidden_fields);
             return OK if (! defined($query));              return OK if (! defined($query));
         }          }
Line 351  END Line 353  END
                            customquery => $customquery,                             customquery => $customquery,
                            customshow => $customshow,                             customshow => $customshow,
                            libraries => $libraries,                             libraries => $libraries,
                            pretty_string => $pretty_string,                             pretty_string => $pretty_string },
                            domains => $domains },  
                          $persistent_db_file);                           $persistent_db_file);
         #          #
         # Set up table          # Set up table
Line 426  sub hidden_field { Line 427  sub hidden_field {
   
 ######################################################################  ######################################################################
   
 =pod  =pod 
   
 =over 4  
   
 =item &print_basic_search_form()   =item &print_basic_search_form() 
   
Line 1013  Outputs: array of values.  Returns undef Line 1012  Outputs: array of values.  Returns undef
   
 This function is the reverse of &make_persistent();  This function is the reverse of &make_persistent();
 Retrieve persistent data from %persistent_db.  Retrieved items will have their  Retrieve persistent data from %persistent_db.  Retrieved items will have their
 values unescaped.  If the item is 'domains; then the returned  values unescaped.  If the item contains commas (before unescaping), the
 value will be a hash pointer.  Otherwise, if the item contains  returned value will be an array pointer. 
 commas (before unescaping), the returned value will be an array pointer.  
   
 =cut  =cut
   
Line 1033  sub get_persistent_data { Line 1031  sub get_persistent_data {
             push @Values, undef;              push @Values, undef;
             next;              next;
         }          }
         if ($name eq 'domains') {          my @values = map { 
             my %valueshash;              &unescape($_);
             my @items= map { &unescape($_); } split(',',$persistent_db{$name});          } split(',',$persistent_db{$name});
             foreach my $item (@items) {          if (@values <= 1) {
                 if ($item =~ /=/) {              push @Values,$values[0];
                     my ($key,$val) = map { &unescape($_); } split(/=/,$item);  
                     $valueshash{$key} = $val;  
                 }  
             }  
             push(@Values,\%valueshash);  
         } else {          } else {
             my @values = map {               push @Values,\@values;
                 &unescape($_);  
             } split(',',$persistent_db{$name});  
             if (@values <= 1) {  
                 push @Values,$values[0];  
             } else {  
                 push @Values,\@values;  
             }  
         }          }
     }      }
     untie (%persistent_db);      untie (%persistent_db);
Line 1069  Inputs: Hash of values to save, filename Line 1055  Inputs: Hash of values to save, filename
   
 Store variables away to the %persistent_db.  Store variables away to the %persistent_db.
 Values will be escaped.  Values that are array pointers will have their  Values will be escaped.  Values that are array pointers will have their
 elements escaped and concatenated in a comma separated string. Values   elements escaped and concatenated in a comma separated string.  
 that are hash pointers will have their keys and values escaped and   
 concatenated in a comma separated string.  
   
 =cut  =cut
   
Line 1083  sub make_persistent { Line 1067  sub make_persistent {
     return undef if (! tie(%persistent_db,'GDBM_File',      return undef if (! tie(%persistent_db,'GDBM_File',
                            $filename,&GDBM_WRCREAT(),0640));                             $filename,&GDBM_WRCREAT(),0640));
     foreach my $name (keys(%save)) {      foreach my $name (keys(%save)) {
         my @values=();          my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));
         if (ref($save{$name}) eq 'ARRAY') {          # We handle array references, but not recursively.
             @values = @{$save{$name}};  
         } elsif (ref($save{$name}) eq 'HASH') {  
             foreach my $key (%{$save{$name}}) {  
                 push(@values,&escape($key).'='.&escape($save{$name}{$key}));  
             }  
         } else {  
             @values = $save{$name};  
         }  
         # We handle array and hash references, but not recursively.  
         my $store = join(',', map { &escape($_); } @values );          my $store = join(',', map { &escape($_); } @values );
         $persistent_db{$name} = $store;          $persistent_db{$name} = $store;
     }      }
Line 1410  sub parse_advanced_search { Line 1385  sub parse_advanced_search {
     ##      ##
     ## Deal with restrictions to given domains      ## Deal with restrictions to given domains
     ##       ## 
     my ($libraries_to_query,$pretty_domains_string,$domains_to_query) =       my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();
         &parse_domain_restrictions();  
     if ($pretty_domains_string) {      if ($pretty_domains_string) {
        $pretty_search_string .= $pretty_domains_string."<br />\n";         $pretty_search_string .= $pretty_domains_string."<br />\n";
     }      }
Line 1427  sub parse_advanced_search { Line 1401  sub parse_advanced_search {
     }      }
     #&Apache::lonnet::logthis('advanced query = '.$/.$query);      #&Apache::lonnet::logthis('advanced query = '.$/.$query);
     return ($query,$customquery,$customshow,$libraries_to_query,      return ($query,$customquery,$customshow,$libraries_to_query,
             $pretty_search_string,$domains_to_query);              $pretty_search_string);
 }  }
   
 sub parse_domain_restrictions {  sub parse_domain_restrictions {
     my $libraries_to_query = undef;      my $libraries_to_query = undef;
     my $domains_to_query = undef;  
     # $env{'form.domains'} can be either a scalar or an array reference.      # $env{'form.domains'} can be either a scalar or an array reference.
     # We need an array.      # We need an array.
     if (! exists($env{'form.domains'}) || $env{'form.domains'} eq '') {      if (! exists($env{'form.domains'}) || $env{'form.domains'} eq '') {
Line 1456  sub parse_domain_restrictions { Line 1429  sub parse_domain_restrictions {
         foreach (sort @allowed_domains) {          foreach (sort @allowed_domains) {
             $pretty_domains_string .= "<b>".$_."</b> ";              $pretty_domains_string .= "<b>".$_."</b> ";
         }          }
  my %library_servers = &Apache::lonnet::get_unique_servers(\@allowed_domains,   my %servers = &Apache::lonnet::get_unique_servers(\@allowed_domains,
                   'library');     'library');
         my (%older_library_servers,%okdoms,%domains_for_id);  
         map { $okdoms{$_} = 1; } @allowed_domains;  
         foreach my $key (keys(%library_servers)) {  
             if (&Apache::lonnet::get_server_loncaparev('',$key) =~ /^\'?(\d+)\.(\d+)/) {  
                 my $major = $1;  
                 my $minor = $2;  
                 if (($major < 2) || (($major == 2) && ($minor < 11))) {  
                     map { $older_library_servers{$_} = 1; }  
                         &Apache::lonnet::machine_ids($library_servers{$key});  
                 } else {  
                     my %possdoms;  
                     map { $possdoms{$_}=1 if ($okdoms{$_}); }  
                         &Apache::lonnet::machine_domains($library_servers{$key});  
                     $domains_for_id{$key} = join(',',sort(keys(%possdoms)));  
                 }  
             }  
         }  
         my %servers = (%library_servers,%older_library_servers);  
  $libraries_to_query = [keys(%servers)];   $libraries_to_query = [keys(%servers)];
         $domains_to_query = \%domains_for_id;  
     }      }
     return ($libraries_to_query,      return ($libraries_to_query,
             $pretty_domains_string,              $pretty_domains_string);
             $domains_to_query);  
 }  }
   
 ######################################################################  ######################################################################
Line 1510  sub parse_basic_search { Line 1463  sub parse_basic_search {
  $env{"form.$_"}=&unescape($env{"form.$_"});   $env{"form.$_"}=&unescape($env{"form.$_"});
  $env{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;   $env{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
     }      }
     my ($libraries_to_query,$pretty_domains_string,$domains_to_query) =       my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();
         &parse_domain_restrictions();  
     #      #
     # Check to see if enough of a query is filled in      # Check to see if enough of a query is filled in
     my $search_string = $env{'form.basicexp'};      my $search_string = $env{'form.basicexp'};
Line 1557  sub parse_basic_search { Line 1509  sub parse_basic_search {
     $pretty_search_string =~ s:^<br /> and ::;      $pretty_search_string =~ s:^<br /> and ::;
     &Apache::lonnet::logthis('simple search final query = '.$/.$final_query);      &Apache::lonnet::logthis('simple search final query = '.$/.$final_query);
     return ($final_query,$pretty_search_string,      return ($final_query,$pretty_search_string,
             $libraries_to_query,$domains_to_query);              $libraries_to_query);
 }  }
   
   
Line 1949  sub ensure_db_and_table { Line 1901  sub ensure_db_and_table {
     ## Sanity check the table id.      ## Sanity check the table id.
     ##      ##
     if (! defined($table) || $table eq '' || $table =~ /\D/ ) {      if (! defined($table) || $table eq '' || $table =~ /\D/ ) {
         $r->print(&Apache::loncommon::start_page('Error')          $r->print(&Apache::loncommon::start_page(&mt('Error'))
   . '<p>table: |'.$table.'|</p>' # SB
                  .'<p class="LC_error">'                   .'<p class="LC_error">'
                  .&mt('Unable to retrieve search results. '                   .&mt('Unable to retrieve search results. '
                      .'Unable to determine the table results were saved in.')                       .'Unable to determine the table results were saved in.')
                  .'</p>'  
                  . '<p>'.&mt('Internal info:').'</p>'  
                  .'<pre>'.$table.'</pre>'  
                  .&Apache::loncommon::end_page()                   .&Apache::loncommon::end_page()
         );          );
         return undef;          return undef;
Line 2087  END Line 2037  END
 #    $result.="</select>\n";  #    $result.="</select>\n";
     my $revise = &revise_button();      my $revise = &revise_button();
     $result.='<p>'      $result.='<p>'
             .&mt('Total of [quant,_1,match,matches] to your query.',$total_results)              .&mt('There are [_1] matches to your query.',$total_results)
             .' '.$revise.'</p>'              .' '.$revise.'</p>'
             .'<p>'.&mt('Search: ').$pretty_query_string              .'<p>'.&mt('Search: ').$pretty_query_string
             .'</p></form>';              .'</p></form>';
Line 2307  results into MySQL. Line 2257  results into MySQL.
 ######################################################################  ######################################################################
 sub run_search {  sub run_search {
     my ($r,$query,$customquery,$customshow,$serverlist,      my ($r,$query,$customquery,$customshow,$serverlist,
         $pretty_string,$area,$domainsref) = @_;          $pretty_string,$area) = @_;
     my $tabletype = 'metadata';      my $tabletype = 'metadata';
     if ($area eq 'portfolio') {      if ($area eq 'portfolio') {
         $tabletype = 'portfolio_search';          $tabletype = 'portfolio_search';
Line 2339  END Line 2289  END
     $r->rflush();      $r->rflush();
     #      #
     # Determine the servers we need to contact.      # Determine the servers we need to contact.
     my (@Servers_to_contact,%domains_by_server);      my @Servers_to_contact;
     if (defined($serverlist)) {      if (defined($serverlist)) {
         if (ref($serverlist) eq 'ARRAY') {          if (ref($serverlist) eq 'ARRAY') {
             @Servers_to_contact = @$serverlist;              @Servers_to_contact = @$serverlist;
         } else {          } else {
             @Servers_to_contact = ($serverlist);              @Servers_to_contact = ($serverlist);
         }          }
         if (ref($domainsref) eq 'HASH') {  
             foreach my $server (@Servers_to_contact) {  
                 $domains_by_server{$server} = $domainsref->{$server};  
             }  
         }  
     } else {      } else {
  my %library_servers = &Apache::lonnet::unique_library();   my %all_library_servers = &Apache::lonnet::unique_library();
         my (%all_library_servers, %older_library_servers);  
         foreach my $key (keys(%library_servers)) {  
             if (&Apache::lonnet::get_server_loncaparev('',$key) =~ /^\'?(\d+)\.(\d+)/) {  
                 my $major = $1;  
                 my $minor = $2;  
                 if (($major < 2) || (($major == 2) && ($minor < 11))) {  
                     map { $older_library_servers{$_} = 1; }  
                         &Apache::lonnet::machine_ids($library_servers{$key});  
                 }  
             }  
         }  
         %all_library_servers = (%library_servers,%older_library_servers);  
         @Servers_to_contact = sort(keys(%all_library_servers));          @Servers_to_contact = sort(keys(%all_library_servers));
         foreach my $server (@Servers_to_contact) {  
             my %possdoms;  
             map { $possdoms{$_}=1;  } &Apache::lonnet::machine_domains($all_library_servers{$server});  
             $domains_by_server{$server} =  
                 join(',',sort(&Apache::lonnet::machine_domains($all_library_servers{$server})));  
         }  
     }      }
     my %Server_status;      my %Server_status;
     #      #
Line 2441  END Line 2368  END
             my $server = shift(@Servers_to_contact);              my $server = shift(@Servers_to_contact);
             &update_status($r,&mt('contacting [_1]',$server));              &update_status($r,&mt('contacting [_1]',$server));
             my $reply=&Apache::lonnet::metadata_query($query,$customquery,              my $reply=&Apache::lonnet::metadata_query($query,$customquery,
                                                       $customshow,[$server],\%domains_by_server);                                                        $customshow,[$server]);
             ($server) = keys(%$reply);              ($server) = keys(%$reply);
             $Server_status{$server} = $reply->{$server};              $Server_status{$server} = $reply->{$server};
         } else {          } else {
Line 3814  sub cleanup { Line 3741  sub cleanup {
   &Apache::lonnet::logthis('Failed cleanup searchcat: groupsearch_db');    &Apache::lonnet::logthis('Failed cleanup searchcat: groupsearch_db');
         }          }
     }      }
       &untiehash();
     &Apache::lonmysql::disconnect_from_db();      &Apache::lonmysql::disconnect_from_db();
     return OK;      return OK;
 }  }

Removed from v.1.331.4.8  
changed lines
  Added in v.1.333


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>