Diff for /loncom/interface/lonsearchcat.pm between versions 1.142 and 1.144

version 1.142, 2002/07/12 21:02:27 version 1.144, 2002/07/26 16:37:58
Line 87  use Apache::lonnet(); Line 87  use Apache::lonnet();
 use Apache::File();  use Apache::File();
 use CGI qw(:standard);  use CGI qw(:standard);
 use Text::Query;  use Text::Query;
   use DBI;
 use GDBM_File;  use GDBM_File;
 use Apache::loncommon();  use Apache::loncommon();
   use Apache::lonmysql();
   
 # ---------------------------------------- variables used throughout the module  # ---------------------------------------- variables used throughout the module
   
Line 125  that produces it.  Adding a new view typ Line 127  that produces it.  Adding a new view typ
 adding a line to the definition of this hash and making sure the function  adding a line to the definition of this hash and making sure the function
 takes the proper parameters.  takes the proper parameters.
   
   =item $results_db
   
   The name of the database results from searches are put in.
   
 =back   =back 
   
 =cut  =cut
Line 140  my $importbutton; # button to take the s Line 146  my $importbutton; # button to take the s
 my %groupsearch_db;     # database hash  my %groupsearch_db;     # database hash
 my $diropendb = "";    # db file  my $diropendb = "";    # db file
   
   my $results_db = "";
 #             View Description           Function Pointer  #             View Description           Function Pointer
 my %Views = ("Detailed Citation View" => \&detailed_citation_view,  my %Views = ("Detailed Citation View" => \&detailed_citation_view,
              "Summary View"           => \&summary_view,               "Summary View"           => \&summary_view,
Line 178  sub handler { Line 185  sub handler {
     $r->content_type('text/html');      $r->content_type('text/html');
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
       ##
       ## Initialize global variables
       ##
     my $domain  = $r->dir_config('lonDefDomain');      my $domain  = $r->dir_config('lonDefDomain');
     $diropendb= "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain).      $diropendb= "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain).
             "\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db";              "\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db";
       $results_db = "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain).
           '_'.&Apache::lonnet::escape($ENV{'user.name'})."_searchresults.db";
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
              ['catalogmode','launch','acts','mode','form','element',               ['catalogmode','launch','acts','mode','form','element',
               'reqinterface']);                'reqinterface']);
     ##      ##
     ## Clear out old values from database      ## Clear out old values from groupsearch database
     ##      ##
     if ($ENV{'form.launch'} eq '1') {      if ($ENV{'form.launch'} eq '1') {
  if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {   if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {
Line 239  END Line 249  END
         # We are running a search          # We are running a search
         my ($query,$customquery,$customshow,$libraries) =           my ($query,$customquery,$customshow,$libraries) = 
             (undef,undef,undef,undef);              (undef,undef,undef,undef);
           my $pretty_string;
         if ($searchtype eq 'Basic') {          if ($searchtype eq 'Basic') {
             $query = &parse_basic_search($r);              ($query,$pretty_string) = &parse_basic_search($r);
         } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {          } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {
             ($query,$customquery,$customshow,$libraries)               ($query,$customquery,$customshow,$libraries,$pretty_string) 
                 = &parse_advanced_search($r);                  = &parse_advanced_search($r);
             return OK if (! defined($query));              return OK if (! defined($query));
         }          }
         # Output some information to the user.          # Output some information to the user.
         $r->print(&search_results_header($searchtype));          $r->print(&search_results_header($searchtype,$pretty_string));
         $r->print("Sending search request to LON-CAPA servers.<br />\n");          $r->print("Sending search request to LON-CAPA servers.<br />\n");
         $r->rflush();          $r->rflush();
         # Send query statements over the network to be processed by           &run_search($r,$query,$customquery,$customshow,$libraries);
         # either the SQL database or a recursive scheme of 'grep'-like           &display_results($r,$searchtype,$hidden,$importbutton,
         # actions (for custom metadata).                           $closebutton);
         my $reply=&Apache::lonnet::metadata_query($query,$customquery,  
                                                $customshow,$libraries);  
         $r->rflush();          $r->rflush();
         &output_results($searchtype,$r,$reply,$hidden);  
     } else {      } else {
         #          #
         # We need to get information to search on          # We need to get information to search on
Line 561  to be somewhat persistent. Line 570  to be somewhat persistent.
 sub make_persistent {  sub make_persistent {
     my %save = %{shift()};      my %save = %{shift()};
     my $persistent='';      my $persistent='';
     foreach (keys %save) {      foreach my $name (keys %save) {
  if (/^form\./ && !/submit/) {   if ($name =~ /^form\./ && $name !~ /submit/) {
     my $name=$_;  
             my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));              my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));
     $name=~s/^form\.//;      $name=~s/^form\.//;
             foreach (@values) {              foreach (@values) {
                 s/\"/\'/g; # do not mess with html field syntax                  s/\"/\'/g; # do not mess with html field syntax
                   next if (! $_ );
                 $persistent.=<<END;                  $persistent.=<<END;
 <input type="hidden" name="$name" value="$_" />  <input type="hidden" name="$name" value="$_" />
 END  END
Line 886  Parse advanced search form and return th Line 895  Parse advanced search form and return th
 sub parse_advanced_search {  sub parse_advanced_search {
     my ($r)=@_;      my ($r)=@_;
     my $fillflag=0;      my $fillflag=0;
       my $pretty_search_string = "<br />\n";
     # Clean up fields for safety      # Clean up fields for safety
     for my $field ('title','author','subject','keywords','url','version',      for my $field ('title','author','subject','keywords','url','version',
    'creationdatestart_month','creationdatestart_day',     'creationdatestart_month','creationdatestart_day',
Line 925  sub parse_advanced_search { Line 935  sub parse_advanced_search {
     # Turn the form input into a SQL-based query      # Turn the form input into a SQL-based query
     my $query='';      my $query='';
     my @queries;      my @queries;
       my $font = '<font color="#800000" face="helvetica">';
     # Evaluate logical expression AND/OR/NOT phrase fields.      # Evaluate logical expression AND/OR/NOT phrase fields.
     foreach my $field ('title','author','subject','notes','abstract','url',      foreach my $field ('title','author','subject','notes','abstract','url',
        'keywords','version','owner','mime') {         'keywords','version','owner','mime') {
  if ($ENV{'form.'.$field}) {   if ($ENV{'form.'.$field}) {
             my $searchphrase = $ENV{'form.'.$field};              my $searchphrase = $ENV{'form.'.$field};
               $pretty_search_string .= $font."$field</font> contains <b>".
                   $searchphrase."</b>";
             if ($ENV{'form.'.$field.'_related'}) {              if ($ENV{'form.'.$field.'_related'}) {
                 $searchphrase = &related_version($searchphrase);                  my @New_Words;
                 $ENV{'form.'.$field} = $searchphrase;                  ($searchphrase,@New_Words) = &related_version($searchphrase);
                 $ENV{'form.'.$field.'_related'} = undef;                  if (@New_Words) {
                       $pretty_search_string .= " with related words: ".
                           "<b>@New_Words</b>.";
                   } else {
                       $pretty_search_string .= " with no related words.";
                   }
             }              }
               $pretty_search_string .= "<br />\n";
     push @queries,&build_SQL_query($field,$searchphrase);      push @queries,&build_SQL_query($field,$searchphrase);
         }          }
     }      }
Line 945  sub parse_advanced_search { Line 964  sub parse_advanced_search {
     # Evaluate option lists      # Evaluate option lists
     if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {      if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {
  push @queries,"(language like \"$ENV{'form.language'}\")";   push @queries,"(language like \"$ENV{'form.language'}\")";
           $pretty_search_string.=$font."language</font>= ".
               &Apache::loncommon::languagedescription($ENV{'form.language'}).
                   "<br />\n";
     }      }
     if ($ENV{'form.copyright'} and $ENV{'form.copyright'} ne 'any') {      if ($ENV{'form.copyright'} and $ENV{'form.copyright'} ne 'any') {
  push @queries,"(copyright like \"$ENV{'form.copyright'}\")";   push @queries,"(copyright like \"$ENV{'form.copyright'}\")";
           $pretty_search_string.=$font."copyright</font> = ".
               &Apache::loncommon::copyrightdescription($ENV{'form.copyright'}).
                   "<br \>\n";
     }      }
       #
     # Evaluate date windows      # Evaluate date windows
     my $datequery=&build_date_queries(      my $datequery=&build_date_queries(
  $ENV{'form.creationdatestart_month'},   $ENV{'form.creationdatestart_month'},
Line 968  sub parse_advanced_search { Line 994  sub parse_advanced_search {
     if ($datequery=~/^Incorrect/) {      if ($datequery=~/^Incorrect/) {
  &output_date_error($r,$datequery);   &output_date_error($r,$datequery);
  return ;   return ;
     }      } elsif ($datequery) {
     elsif ($datequery) {          # Here is where you would set up pretty_search_string to output
           # date query information.
  push @queries,$datequery;   push @queries,$datequery;
     }      }
     # Process form information for custom metadata querying      # Process form information for custom metadata querying
     my $customquery=undef;      my $customquery=undef;
     if ($ENV{'form.custommetadata'}) {      if ($ENV{'form.custommetadata'}) {
           $pretty_search_string .=$font."Custom Metadata Search</font>: <b>".
               $ENV{'form.custommetadata'}."</b><br />\n";
  $customquery=&build_custommetadata_query('custommetadata',   $customquery=&build_custommetadata_query('custommetadata',
       $ENV{'form.custommetadata'});        $ENV{'form.custommetadata'});
     }      }
     my $customshow=undef;      my $customshow=undef;
     if ($ENV{'form.customshow'}) {      if ($ENV{'form.customshow'}) {
           $pretty_search_string .=$font."Custom Metadata Display</font>: <b>".
               $ENV{'form.customshow'}."</b><br />\n";
  $customshow=$ENV{'form.customshow'};   $customshow=$ENV{'form.customshow'};
  $customshow=~s/[^\w\s]//g;   $customshow=~s/[^\w\s]//g;
  my @fields=split(/\s+/,$customshow);   my @fields=split(/\s+/,$customshow);
Line 994  sub parse_advanced_search { Line 1025  sub parse_advanced_search {
     my @allowed_domains = (ref($ENV{'form.domains'}) ? @{$ENV{'form.domains'}}       my @allowed_domains = (ref($ENV{'form.domains'}) ? @{$ENV{'form.domains'}} 
                            :  ($ENV{'form.domains'}) );                             :  ($ENV{'form.domains'}) );
     my %domain_hash = ();      my %domain_hash = ();
       my $pretty_domains_string;
     foreach (@allowed_domains) {      foreach (@allowed_domains) {
         $domain_hash{$_}++;          $domain_hash{$_}++;
     }      }
     foreach (keys(%Apache::lonnet::libserv)) {      if ($domain_hash{'any'}) {
         if ($_ eq 'any') {          $pretty_domains_string = "Searching all domains.";
             $libraries_to_query = undef;      } else {
             last;          if (@allowed_domains > 1) {
               $pretty_domains_string = "Searching domains:";
           } else {
               $pretty_domains_string = "Searching domain ";
         }          }
         if (exists($domain_hash{$Apache::lonnet::hostdom{$_}})) {          foreach (sort @allowed_domains) {
             push @$libraries_to_query,$_;              $pretty_domains_string .= "<b>$_</b> ";
           }
           foreach (keys(%Apache::lonnet::libserv)) {
               if (exists($domain_hash{$Apache::lonnet::hostdom{$_}})) {
                   push @$libraries_to_query,$_;
               }
         }          }
     }      }
       $pretty_search_string .= $pretty_domains_string."<br />\n";
     #      #
     if (@queries) {      if (@queries) {
  $query=join(" AND ",@queries);   $query=join(" AND ",@queries);
Line 1013  sub parse_advanced_search { Line 1054  sub parse_advanced_search {
     } elsif ($customquery) {      } elsif ($customquery) {
         $query = '';          $query = '';
     }      }
     return ($query,$customquery,$customshow,$libraries_to_query);      return ($query,$customquery,$customshow,$libraries_to_query,
               $pretty_search_string);
 }  }
   
 ######################################################################  ######################################################################
Line 1047  sub parse_basic_search { Line 1089  sub parse_basic_search {
  &output_blank_field_error($r);   &output_blank_field_error($r);
  return OK;   return OK;
     }      }
       my $pretty_search_string = '<b>'.$ENV{'form.basicexp'}.'</b>';
     my $search_string = $ENV{'form.basicexp'};      my $search_string = $ENV{'form.basicexp'};
     if ($ENV{'form.related'}) {      if ($ENV{'form.related'}) {
         $search_string = &related_version($ENV{'form.basicexp'});          my @New_Words;
           ($search_string,@New_Words) = &related_version($ENV{'form.basicexp'});
           if (@New_Words) {
               $pretty_search_string .= " with related words: <b>@New_Words</b>.";
           } else {
               $pretty_search_string .= " with no related words.";
           }
     }      }
     # Build SQL query string based on form page      # Build SQL query string based on form page
     my $query='';      my $query='';
Line 1058  sub parse_basic_search { Line 1107  sub parse_basic_search {
                         'keywords'));                          'keywords'));
     $concatarg='title' if $ENV{'form.titleonly'};      $concatarg='title' if $ENV{'form.titleonly'};
     $query=&build_SQL_query('concat('.$concatarg.')',$search_string);      $query=&build_SQL_query('concat('.$concatarg.')',$search_string);
     return 'select * from metadata where '.$query;      $pretty_search_string .= "<br />\n";
       return 'select * from metadata where '.$query,$pretty_search_string;
 }  }
   
   
Line 1082  Note: Using this twice on a string is pr Line 1132  Note: Using this twice on a string is pr
 sub related_version {  sub related_version {
     my $search_string = shift;      my $search_string = shift;
     my $result = $search_string;      my $result = $search_string;
       my %New_Words = ();
     while ($search_string =~ /(\w+)/cg) {      while ($search_string =~ /(\w+)/cg) {
         my $word = $1;          my $word = $1;
         next if (lc($word) =~ /\b(or|and|not)\b/);          next if (lc($word) =~ /\b(or|and|not)\b/);
         my @Words = &Apache::loncommon::get_related_words($word);          my @Words = &Apache::loncommon::get_related_words($word);
         my $replacement = join " OR ", ($word,          @Words = ($#Words>4? @Words[0..4] : @Words);
                                         ($#Words>4? @Words[0..4] : @Words)          foreach (@Words) { $New_Words{$_}++;}
                                         );          my $replacement = join " OR ", ($word,@Words);
         $result =~ s/(\b)$word(\b)/$1($replacement)$2/g;          $result =~ s/(\b)$word(\b)/$1($replacement)$2/g;
     }      }
     return $result;      return $result,sort(keys(%New_Words));
 }  }
   
 ######################################################################  ######################################################################
Line 1263  sub build_date_queries { Line 1314  sub build_date_queries {
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
   =pod
   
   =item &copyright_check()
   
   =cut
   
   ######################################################################
   ######################################################################
   
   sub copyright_check {
       my $Metadata = shift;
       # Check copyright tags and skip results the user cannot use
       my (undef,undef,$resdom,$resname) = split('/',
                                                 $Metadata->{'url'});
       # Check for priv
       if (($Metadata->{'copyright'} eq 'priv') && 
           (($ENV{'user.name'} ne $resname) &&
            ($ENV{'user.domain'} ne $resdom))) {
           return 0;
       }
       # Check for domain
       if (($Metadata->{'copyright'} eq 'domain') &&
           ($ENV{'user.domain'} ne $resdom)) {
           return 0;
       }
       return 1;
   }
   
   #####################################################################
   #####################################################################
   
   =pod
   
   =item MySQL Table Description
   
   MySQL table creation requires a precise description of the data to be
   stored.  The use of the correct types to hold data is vital to efficient
   storage and quick retrieval of records.  The columns must be described in
   the following format:
   
   =cut
   
   ##
   ## Restrictions:
   ##    columns of type 'text' and 'blob' cannot have defaults.
   ##    columns of type 'enum' cannot be used for FULLTEXT.
   ##
   my @DataOrder = qw/id title author subject url keywords version notes
       abstract mime lang owner copyright creationdate lastrevisiondate hostname
       idx_title idx_author idx_subject idx_abstract idx_mime idx_language 
       idx_owner idx_copyright/;
   
   my %Datatypes = 
       ( id        =>{ type         => 'INT',
                       restrictions => 'NOT NULL',
                       primary_key  => 'yes',
                       auto_inc     => 'yes'
                       },
         title     =>{ type=>'TEXT'},
         author    =>{ type=>'TEXT'},
         subject   =>{ type=>'TEXT'},
         url       =>{ type=>'TEXT',
                       restrictions => 'NOT NULL' },
         keywords  =>{ type=>'TEXT'},
         version   =>{ type=>'TEXT'},
         notes     =>{ type=>'TEXT'},
         abstract  =>{ type=>'TEXT'},
         mime      =>{ type=>'TEXT'},
         lang      =>{ type=>'TEXT'},
         owner     =>{ type=>'TEXT'},
         copyright =>{ type=>'TEXT'},
         hostname  =>{ type=>'TEXT'},
         #--------------------------------------------------
         creationdate     =>{ type=>'DATETIME'},
         lastrevisiondate =>{ type=>'DATETIME'},
         #--------------------------------------------------
         idx_title     =>{ type=>'FULLTEXT', target=>'title'},
         idx_author    =>{ type=>'FULLTEXT', target=>'author'},
         idx_subject   =>{ type=>'FULLTEXT', target=>'subject'},
         idx_abstract  =>{ type=>'FULLTEXT', target=>'abstract'},
         idx_mime      =>{ type=>'FULLTEXT', target=>'mime'},
         idx_language  =>{ type=>'FULLTEXT', target=>'lang'},
         idx_owner     =>{ type=>'FULLTEXT', target=>'owner'},
         idx_copyright =>{ type=>'FULLTEXT', target=>'copyright'},
         );
   
   ######################################################################
   ######################################################################
   
   =pod
   
   =item &write_status()
   
   =cut
   
   ######################################################################
   ######################################################################
   sub write_status {
       my ($r,$string) = @_;
       $r->print("<pre>".$string."</pre>\n");
       $r->rflush();
       return;
   }
   
   ######################################################################
   ######################################################################
   
   =pod
   
   =item &run_search 
   
   =cut
   
   ######################################################################
   ######################################################################
   sub run_search {
       my ($r,$query,$customquery,$customshow,$serverlist) = @_;
       #
       my @Servers_to_contact;
       if (defined($serverlist)) {
           @Servers_to_contact = @$serverlist;
       } else {
           @Servers_to_contact = sort(keys(%Apache::lonnet::libserv));
       }
       my %Server_status;
       #
       # Timing variables
       my $starttime = time;
       my $max_time  = 120;  # seconds for the search to complete
       #
       # Create Table
       #####################################
       my $table = &Apache::lonmysql::create_table
           ( { columns => \%Datatypes,
               column_order => \@DataOrder,
           } );
       if (! defined($table)) {
           # What do I do now?  Print out an error page.
           &Apache::lonnet::logthis("lonmysql attempted to create a table ".
                                    "and this was the result:".
                                    &Apache::lonmysql::get_error());
           $r->print("An internal error occured with the database.<br />".
                     "The error has been logged, but you should probably alert".
                     " your system administrator.");
           return;
       }
       $ENV{'form.table'}=$table;
       #
       #####################################
       my $hitcountsum;
       my $server; 
       my $status;
       while ((time - $starttime < $max_time) && 
              ((@Servers_to_contact) || keys(%Server_status))) {
           # Send out a search request if it needs to be done.
           if (@Servers_to_contact) {
               # Contact one server
               my $server = shift(@Servers_to_contact);
               my $reply=&Apache::lonnet::metadata_query($query,$customquery,
                                                         $customshow,[$server]);
               # We should let the user know we have contacted another server
               ($server) = keys(%$reply);
               $Server_status{$server} = $reply->{$server};
               # &write_status($r,"Contacted:$server:reply:".
               #                   $Server_status{$server});
               # Hmmm, should we add to $max_time if we contact a server?
           } else {
               sleep(1); # wait a sec. to give time for files to be written
           }
           while (my ($server,$status) = each(%Server_status)) {
               if ($status eq 'con_lost') {
                   delete ($Server_status{$server});
                   # &write_status($r,"Removing $server");
                   next;
               }
               $status=~/^([\.\w]+)$/; 
              my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$1;
               if (-e $datafile && ! -e "$datafile.end") {
                   # Let the user know we are receiving data from the server
                   &write_status($r,"$server:Receiving file");
                   next;
               }
               if (-e "$datafile.end") {
                   if (-z "$datafile") {
                       delete($Server_status{$server});
                       next;
                   }
                   my $fh;
                   if (!($fh=Apache::File->new($datafile))) { 
                       # Error opening file...
                       # Tell the user and exit...?
                       # Should I give up on opening it?
                       &write_status("Unable to open $datafile");
                       next;
                   }
                   # Read in the whole file.
                   while (my $result = <$fh>) {
                       # handle custom fields?  Someday we will!
                       chomp($result);
                       next unless $result;
                       # Parse the result.
                       my %Fields = &parse_raw_result($result,$server);
                       $Fields{'hostname'} = $server;
                       next if (! &copyright_check(\%Fields));
                       # Store the result in the mysql database
                       my $result = &Apache::lonmysql::store_row($table,\%Fields);
                       if (! defined($result)) {
                           &write_status($r,&Apache::lonmysql::get_error());
                       }
                       # &write_status($r,&Apache::lonmysql::get_debug());
                       $hitcountsum ++;
                   } # End of foreach (@results)
                   $fh->close();
                   # $server is only deleted if the results file has been 
                   # found and (successfully) opened.  This may be a bad idea.
                   delete($Server_status{$server});
               }
           }
           # Finished looping through the servers
       }
       &Apache::lonmysql::disconnect_from_db();
       # We have run out of time or run out of servers to talk to and
       # results to get.  
       if ($hitcountsum > 0) {
           $r->print("<h3>Total results = $hitcountsum</h3></body></html>");
       }
       return;
   }
   
   ######################################################################
   ######################################################################
   =pod
   
   =item &display_buttons
   
   =cut
   
   ######################################################################
   ######################################################################
   sub display_buttons {
       my ($low,$high,$otherparms) = @_;
       my $maxshow = 20;
       my $lowest = ($low - $maxshow < 0 ? 0 : $low-$maxshow);
       my $highest = $high + $maxshow;
       my ($previous,$current,$next);
       if ($lowest < $low) {
           $previous = qq{<a href="/adm/searchcat?$otherparms&mode=display&low=$lowest&high=$highest">prev</a>};
       } else {
           $previous = "prev";
       }
       $current = qq{<a href="/adm/searchcat?$otherparms&mode=display&low=$low&high=$high">reload</a>};
       $next = qq{<a href="/adm/searchcat?$otherparms&mode=display&low=$high&high=$highest">next</a>};
       my $result = $previous." ".$current." ".$next;
       return $result;
   }
   ######################################################################
   ######################################################################
   
   =pod
   
   =item &display_results
   
   =cut
   
   ######################################################################
   ######################################################################
   sub display_results {
       my ($r,$mode,$hidden,$importbutton,$closebutton) = @_;
       ##
       ## Set viewing function
       ##
       my $viewfunction = $Views{$ENV{'form.viewselect'}};
       if (!defined($viewfunction)) {
           $r->print("Internal Error - Bad view selected.\n");
           $r->rflush();
           return;
       }
       ##
       ## make query information persistent to allow for subsequent revision
       ##
       my $persistent=&make_persistent(\%ENV);
       ##
       ## Get the catalog controls setup
       ##
       my $action = "/adm/searchcat";
       if ($mode eq 'Basic') { 
           $action .= "?reqinterface=basic";
       } elsif ($mode eq 'Advanced') {
           $action .= "?reqinterface=advanced";
       }
       $r->print(<<CATALOGCONTROLS);
   <form name='results' method="post" action="$action">
   $hidden
   <input type='hidden' name='acts' value='' />
   <input type='button' value='Revise search request'
   onClick='this.form.submit();' />
   $importbutton
   $closebutton
   $persistent
   <hr />
   CATALOGCONTROLS
       if (! tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {
           $r->print('Unable to tie hash to db file</body></html>');
           $r->rflush();
           return;
       } 
       #
       my $fnum;
       # For now, just query the whole lot and spit them out.
       my $table = $ENV{'form.table'};
       my $connection_result = &Apache::lonmysql::connect_to_db();
       if (!defined($connection_result)) {
           &write_status($r,&Apache::lonmysql::get_error());
       }
       my @Results = &Apache::lonmysql::get_rows($table,'id>=0');
       #&write_status($r,&Apache::lonmysql::get_debug());
       #&write_status($r,&Apache::lonmysql::get_error());
       foreach my $row (@Results) {
           my %Fields = %{&parse_row(@$row)};
           my $output="\n<p>\n";
           if ($ENV{'form.catalogmode'} eq 'interactive') {
               my $titleesc=$Fields{'title'};
               $titleesc=~s/\'/\\'/; # '
               if ($ENV{'form.catalogmode'} eq 'interactive') {
                   $output.=<<END 
   <font size='-1'><INPUT TYPE="button" NAME="returnvalues" VALUE="SELECT"
   onClick="javascript:select_data('$titleesc','$Fields{'url'}')">
   </font>
   <br />
   END
               }
           }
           if ($ENV{'form.catalogmode'} eq 'groupsearch') {
               $fnum+=0;
               $groupsearch_db{"pre_${fnum}_link"}=$Fields{'url'};
               $groupsearch_db{"pre_${fnum}_title"}=$Fields{'title'};
               $output.=<<END;
   <font size='-1'>
   <input type="checkbox" name="returnvalues" value="SELECT"
   onClick="javascript:queue($fnum)" />
   </font>
   <br />
   END
   # <input type="hidden" name="title$fnum" value="$title" />
   # <input type="hidden" name="url$fnum" value="$url" />
               $fnum++;
           }
           # Render the result into html
           $output.= &$viewfunction(%Fields);
           if ($output) {
               $output.="<hr align='left' width='200' noshade />";
           }
           $r->print($output);
           $r->rflush();
       }
       if (@Results < 1) {
           $r->print("There were no results matching your query");
       }
       $r->print("</body></html>");
       $r->rflush();
       untie %groupsearch_db;
       return;
   }
   
   ######################################################################
   ######################################################################
   
   =pod
   
   =item &parse_row
   
   Parse a row returned from the database.
   
   =cut
   
   ######################################################################
   ######################################################################
   sub parse_row {
       my @Row = @_;
       my %Fields;
       for (my $i=0;$i<=$#Row;$i++) {
           $Fields{$DataOrder[$i]}=&Apache::lonnet::unescape($Row[$i]);
       }
       $Fields{'language'} = 
           &Apache::loncommon::languagedescription($Fields{'lang'});
       $Fields{'copyrighttag'} =
           &Apache::loncommon::copyrightdescription($Fields{'copyright'});
       $Fields{'mimetag'} =
           &Apache::loncommon::filedescription($Fields{'mime'});
       return \%Fields;
   }
   ######################################################################
   ######################################################################
   
 =pod   =pod 
   
 =item &output_results()   =item &output_results() 
Line 1559  sub parse_raw_result { Line 2004  sub parse_raw_result {
         $Fields{'title'}='Untitled';           $Fields{'title'}='Untitled'; 
     }      }
     unless ($ENV{'user.adv'}) {      unless ($ENV{'user.adv'}) {
           # What is this anyway?
         $Fields{'keywords'} = '- not displayed -';          $Fields{'keywords'} = '- not displayed -';
         $Fields{'notes'}    = '- not displayed -';          $Fields{'notes'}    = '- not displayed -';
         $Fields{'abstract'} = '- not displayed -';          $Fields{'abstract'} = '- not displayed -';
Line 1657  Checked for existance & 'edit' mode. Line 2103  Checked for existance & 'edit' mode.
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub search_results_header {  sub search_results_header {
     my ($mode) = @_;      my ($mode,$pretty_query) = @_;
     $mode = lc($mode);      $mode = lc($mode);
     my $title;      my $title;
     if ($mode eq 'advanced') {      if ($mode eq 'advanced') {
Line 1759  SCRIPT Line 2205  SCRIPT
 <img align=right src=/adm/lonIcons/lonlogos.gif>  <img align=right src=/adm/lonIcons/lonlogos.gif>
 <h1>$title</h1>  <h1>$title</h1>
 END  END
       if ($pretty_query) {
           $result .= "<p>Search query: $pretty_query</p>";
       }
     return $result;      return $result;
 }  }
   

Removed from v.1.142  
changed lines
  Added in v.1.144


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