--- loncom/interface/lonsearchcat.pm 2002/07/26 16:37:58 1.144 +++ loncom/interface/lonsearchcat.pm 2002/07/28 20:02:14 1.145 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.144 2002/07/26 16:37:58 matthew Exp $ +# $Id: lonsearchcat.pm,v 1.145 2002/07/28 20:02:14 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -103,10 +103,6 @@ use Apache::lonmysql(); =over 4 -=item $closebutton - -button that closes the search window - =item $importbutton button to take the select results and go to group sorting @@ -127,10 +123,6 @@ that produces it. Adding a new view typ adding a line to the definition of this hash and making sure the function takes the proper parameters. -=item $results_db - -The name of the database results from searches are put in. - =back =cut @@ -139,20 +131,19 @@ The name of the database results from se ###################################################################### # -- dynamically rendered interface components -my $closebutton; # button that closes the search window my $importbutton; # button to take the selected results and go to group sorting # -- miscellaneous variables my %groupsearch_db; # database hash my $diropendb = ""; # db file - -my $results_db = ""; # View Description Function Pointer my %Views = ("Detailed Citation View" => \&detailed_citation_view, "Summary View" => \&summary_view, "Fielded Format" => \&fielded_format_view, "XML/SGML" => \&xml_sgml_view ); - +my $persistent_db_file; +my %persistent_db; +my $hidden_fields; ###################################################################### ###################################################################### @@ -180,22 +171,50 @@ string that holds portions of the screen ###################################################################### sub handler { my $r = shift; - untie %groupsearch_db; - + # + untie %groupsearch_db if (tied(%groupsearch_db)); + # + my $closebutton; # button that closes the search window + # This button is different for the RAT compared to + # normal invocation. + # $r->content_type('text/html'); $r->send_http_header; return OK if $r->header_only; + ## + ## Pick up form fields passed in the links. + ## + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['catalogmode','launch','acts','mode','form','element', + 'reqinterface','persistent_db_id','table']); ## ## Initialize global variables ## my $domain = $r->dir_config('lonDefDomain'); $diropendb= "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain). "\_".&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'}, - ['catalogmode','launch','acts','mode','form','element', - 'reqinterface']); + # + # set the name of the persistent database + # $ENV{'form.persistent_db_id'} can only have digits in it. + if (! exists($ENV{'form.persistent_db_id'}) || + $ENV{'form.persistent_db_id'} =~ /\D/ ) { + $ENV{'form.persistent_db_id'} = time; + } + $persistent_db_file = "/home/httpd/perl/tmp/". + &Apache::lonnet::escape($domain). + '_'.&Apache::lonnet::escape($ENV{'user.name'}). + '_'.$ENV{'form.persistent_db_id'}.'_persistent_search.db'; + # + # Read in the database. It should (hopefully) not be catastrophic to + # fail in this exercise. + if (-e $persistent_db_file) { + # Read in the previous values, if we can. + if (tie(%persistent_db,'GDBM_File',$persistent_db_file, + &GDBM_READER,0640)) { + &reconstruct_persistent_form_data($r); + untie (%persistent_db); + } + } ## ## Clear out old values from groupsearch database ## @@ -210,23 +229,14 @@ sub handler { } } ## - ## Produce some output, so people know it is working - ## - $r->print("\n"); - $r->rflush; - ## ## Configure dynamic components of interface ## - my $hidden; # Holds 'hidden' html forms + $hidden_fields = ''; if ($ENV{'form.catalogmode'} eq 'interactive') { - $hidden="". - "\n"; $closebutton=""."\n"; } elsif ($ENV{'form.catalogmode'} eq 'groupsearch') { - $hidden=< -END $closebutton=< END @@ -235,26 +245,29 @@ END onClick='javascript:select_group()'> END } - $hidden .= &make_persistent({ "form.mode" => $ENV{'form.mode'}, - "form.form" => $ENV{'form.form'}, - "form.element" => $ENV{'form.element'}, - "form.date" => 2 }); ## - ## What are we doing? + ## Do a search, if needed. ## my $searchtype; $searchtype = 'Basic' if ($ENV{'form.basicsubmit'} eq 'SEARCH'); $searchtype = 'Advanced' if ($ENV{'form.advancedsubmit'} eq 'SEARCH'); if ($searchtype) { + ## + ## make query information persistent to allow for subsequent revision + ## + tie(%persistent_db,'GDBM_File',$persistent_db_file,&GDBM_WRCREAT,0640); + &make_persistent(\%ENV); + untie(%persistent_db); + # # We are running a search my ($query,$customquery,$customshow,$libraries) = (undef,undef,undef,undef); my $pretty_string; if ($searchtype eq 'Basic') { - ($query,$pretty_string) = &parse_basic_search($r); + ($query,$pretty_string) = &parse_basic_search($r,$closebutton); } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { ($query,$customquery,$customshow,$libraries,$pretty_string) - = &parse_advanced_search($r); + = &parse_advanced_search($r,$closebutton); return OK if (! defined($query)); } # Output some information to the user. @@ -262,26 +275,38 @@ END $r->print("Sending search request to LON-CAPA servers.
\n"); $r->rflush(); &run_search($r,$query,$customquery,$customshow,$libraries); - &display_results($r,$searchtype,$hidden,$importbutton, - $closebutton); - + ## + ## Display the results + ## + &display_results($r,$searchtype,$importbutton,$closebutton); $r->rflush(); } else { # - # We need to get information to search on - # # Set the default view if it is not already set. if (!defined($ENV{'form.viewselect'})) { $ENV{'form.viewselect'} ="Detailed Citation View"; } - # Output the advanced interface - if ($ENV{'form.reqinterface'} eq 'advanced') { - $r->print(&advanced_search_form($closebutton,$hidden)); - } else { + # + # remove the requested interface from the environment. + my $interface; + if ($ENV{'form.reqinterface'}) { + $interface = lc($ENV{'form.reqinterface'}); + } else { + $interface = 'basic'; + } + ## + ## Determine course of action + ## + if ($interface eq 'display') { + # &display_results($closebutton)); + } elsif ($interface eq 'advanced') { + $r->print(&advanced_search_form($closebutton)); + } elsif ($interface eq 'basic') { # Output normal search interface - $r->print(&basic_search_form($closebutton,$hidden)); + $r->print(&basic_search_form($closebutton)); } } + untie (%persistent_db); return OK; } @@ -300,7 +325,7 @@ Returns a scalar which holds html for th ###################################################################### sub basic_search_form{ - my ($closebutton,$hidden) = @_; + my ($closebutton) = @_; my $scrout=<<"ENDDOCUMENT"; @@ -317,7 +342,7 @@ sub basic_search_form{

Search Catalog

-$hidden +$hidden_fields

Basic Search

Enter terms or phrases separated by AND, OR, or NOT @@ -369,7 +394,7 @@ Returns a scalar which holds html for th ###################################################################### sub advanced_search_form{ - my ($closebutton,$hidden) = @_; + my ($closebutton) = @_; my $advanced_buttons = <<"END";

@@ -401,7 +426,7 @@ Enter terms or phrases separated by sear such as AND, OR, or NOT.
$advanced_buttons -$hidden +$hidden_fields
VIEW: @@ -453,22 +478,17 @@ ENDHEADER # adjust the size of the select box my $size = 4; my $size = (scalar @domains < ($size - 1) ? scalar @domains + 1 : $size); - # standalone machines do not get to choose a domain to search. - if ((scalar @domains) == 1) { - $scrout .=''."\n"; - } else { - $scrout.="\n".''. - 'DOMAINS
'. - ''."\n". + ''."\n"; - foreach my $dom (sort @domains) { - $scrout.="\n"; - } - $scrout.="\n"; + foreach my $dom (sort @domains) { + $scrout.="\n"; } + $scrout.="\n"; #---------------------------------------------------------------- $scrout.=&selectbox('Limit by language','language', $ENV{'form.language'},'any','Any Language', @@ -556,34 +576,68 @@ ENDDOCUMENT =pod -=item &make_persistent() +=item &reconstruct_persistent_form_data -Returns a scalar which holds the current ENV{'form.*'} values in -a 'hidden' html input tag. This allows search interface information -to be somewhat persistent. +This function is the reverse of &make_persistent(); +Retrieve persistent data from %persistent_db. Retrieved items will have their +values unescaped. If the item contains commas (before unescaping), the +returned value will be an array pointer. Items will be returned in the +environment in $ENV{"form.$name"}. =cut ###################################################################### ###################################################################### +sub reconstruct_persistent_form_data { + foreach my $name (keys %persistent_db) { + # &Apache::lonnet::logthis("Reconstructing $name = $persistent_db{$name}"); + my @Values = split(',',$persistent_db{$name}); + my @value = map { &Apache::lonnet::unescape($_) } @Values; + $name = 'form.'.$name; + if (exists($ENV{$name})) { + if (ref($ENV{$name})) { + # Assume it is an array reference + $ENV{$name} = [@{$ENV{$name}},@value]; + } else { + $ENV{$name} = [$ENV{$name},@value]; + } + } else { + if (@value > 1) { + $ENV{$name} = [@value]; + } else { + $ENV{$name} = $value[0]; + } + } + } + return; +} + +###################################################################### +###################################################################### + +=pod +=item &make_persistent() + +Store (environment) variables away to the %persistent_db. +Values will be escaped. Values that are array pointers will have their +elements escaped and concatenated in a comma seperated string. + +=cut + +###################################################################### +###################################################################### sub make_persistent { my %save = %{shift()}; - my $persistent=''; foreach my $name (keys %save) { - if ($name =~ /^form\./ && $name !~ /submit/) { - my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name})); - $name=~s/^form\.//; - foreach (@values) { - s/\"/\'/g; # do not mess with html field syntax - next if (! $_ ); - $persistent.=< -END - } - } + next if ($name !~ /^form\./ || $name =~ /submit/); + my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name})); + # We handle array references, but not recursively. + my $store = join(',', map { &Apache::lonnet::escape($_); } @values ); + $name=~s/^form\.//; + $persistent_db{$name} = $store; } - return $persistent; + return ''; } ###################################################################### @@ -893,7 +947,7 @@ Parse advanced search form and return th ###################################################################### ###################################################################### sub parse_advanced_search { - my ($r)=@_; + my ($r,$closebutton)=@_; my $fillflag=0; my $pretty_search_string = "
\n"; # Clean up fields for safety @@ -929,7 +983,7 @@ sub parse_advanced_search { } } unless ($fillflag) { - &output_blank_field_error($r); + &output_blank_field_error($r,$closebutton); return ; } # Turn the form input into a SQL-based query @@ -992,7 +1046,7 @@ sub parse_advanced_search { ); # Test to see if date windows are legitimate if ($datequery=~/^Incorrect/) { - &output_date_error($r,$datequery); + &output_date_error($r,$datequery,$closebutton); return ; } elsif ($datequery) { # Here is where you would set up pretty_search_string to output @@ -1072,7 +1126,7 @@ Parse the basic search form and return a ###################################################################### ###################################################################### sub parse_basic_search { - my ($r)=@_; + my ($r,$closebutton)=@_; # Clean up fields for safety for my $field ('basicexp') { $ENV{"form.$field"}=~s/[^\w\s\(\)\-]//g; @@ -1086,7 +1140,7 @@ sub parse_basic_search { # Check to see if enough is filled in unless (&filled($ENV{'form.basicexp'})) { - &output_blank_field_error($r); + &output_blank_field_error($r,$closebutton); return OK; } my $pretty_search_string = ''.$ENV{'form.basicexp'}.''; @@ -1432,6 +1486,13 @@ sub write_status { sub run_search { my ($r,$query,$customquery,$customshow,$serverlist) = @_; # + # Timing variables + # + my $starttime = time; + my $max_time = 120; # seconds for the search to complete + # + # Determine the servers we need to contact. + # my @Servers_to_contact; if (defined($serverlist)) { @Servers_to_contact = @$serverlist; @@ -1440,12 +1501,8 @@ sub run_search { } 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, @@ -1460,9 +1517,13 @@ sub run_search { " your system administrator."); return; } + ## + ## form.table needs to be stored in the persistent database... + ## $ENV{'form.table'}=$table; # - ##################################### + # Prepare for the big loop. + # my $hitcountsum; my $server; my $status; @@ -1474,26 +1535,30 @@ sub run_search { 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? + if ($max_time - (time - $starttime) < 20) { + # If there are less than 20 seconds to go in the search, + # give the newly contacted servers 20 more seconds to + # respond.... + $max_time += 20; + } } 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"); + # &write_status($r,"server $server is not responding."); 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"); + # &write_status($r,"$server:Receiving file"); next; } if (-e "$datafile.end") { @@ -1506,7 +1571,8 @@ sub run_search { # Error opening file... # Tell the user and exit...? # Should I give up on opening it? - &write_status("Unable to open $datafile"); + &write_status("Unable to open search results file for ". + "server $server. Omitting from search"); next; } # Read in the whole file. @@ -1530,15 +1596,22 @@ sub run_search { # $server is only deleted if the results file has been # found and (successfully) opened. This may be a bad idea. delete($Server_status{$server}); + #&write_status($r,"Received $new_count more results from ". + # $server."."); } } # Finished looping through the servers } &Apache::lonmysql::disconnect_from_db(); + # Let the user know + # # We have run out of time or run out of servers to talk to and # results to get. - if ($hitcountsum > 0) { - $r->print("

Total results = $hitcountsum

"); + &write_status($r,"Search completed."); + if ($hitcountsum) { + &write_status($r,$hitcountsum." successful matches to your query."); + } else { + &write_status($r,"There were no successful matches to your query."); } return; } @@ -1554,20 +1627,32 @@ sub run_search { ###################################################################### ###################################################################### 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{prev}; - } else { - $previous = "prev"; + my ($current_min,$show,$total,$parms) = @_; + return '' if ($show eq 'all'); # No links if you get them all at once. + my $links; + ## + ## Prev + my $prev_min = $current_min - $show; + $prev_min = 0 if $prev_min < 0; + if ($prev_min < $current_min) { + $links .= qq{ +prev +}; } - $current = qq{reload}; - $next = qq{next}; - my $result = $previous." ".$current." ".$next; - return $result; + ## + ## Pages.... Someday. + ## + + ## + ## Next + my $next_min = $current_min + $show; + my $next_min = $current_min if ($next_min > $total); + if ($next_min != $current_min) { + $links .= qq{ +next +}; + } + return $links; } ###################################################################### ###################################################################### @@ -1581,7 +1666,7 @@ sub display_buttons { ###################################################################### ###################################################################### sub display_results { - my ($r,$mode,$hidden,$importbutton,$closebutton) = @_; + my ($r,$mode,$importbutton,$closebutton) = @_; ## ## Set viewing function ## @@ -1592,10 +1677,6 @@ sub display_results { return; } ## - ## make query information persistent to allow for subsequent revision - ## - my $persistent=&make_persistent(\%ENV); - ## ## Get the catalog controls setup ## my $action = "/adm/searchcat"; @@ -1606,13 +1687,12 @@ sub display_results { } $r->print(< -$hidden +$hidden_fields $importbutton $closebutton -$persistent
CATALOGCONTROLS if (! tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { @@ -1620,52 +1700,75 @@ CATALOGCONTROLS $r->rflush(); return; } - # - my $fnum; - # For now, just query the whole lot and spit them out. + ## + ## Prepare the table for querying + ## 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()); + my $table_check = &Apache::lonmysql::check_table($table); + if (! defined($table_check)) { + $r->print("A MySQL error has occurred."); + &Apache::lonnet::logthis("lonmysql was unable to determine the status". + " of table ".$table); + return; + } elsif (! $table_check) { + $r->print("The table of results could not be found."); + &Apache::lonnet::logthis("The user requested a table, ".$table. + ", that could not be found."); + return; + } + ## + ## Get the number of results + ## + my $total_results = &Apache::lonmysql::number_of_rows($table); + if (! defined($total_results)) { + $r->print("A MySQL error has occurred."); + &Apache::lonnet::logthis("lonmysql was unable to determine the number". + " of rows in table ".$table); + &Apache::lonnet::logthis(&Apache::lonmysql::get_error()); + &Apache::lonnet::logthis(&Apache::lonmysql::get_debug()); + return; + } + if ($total_results == 0) { + $r->print("There were no results matching your query.\n". + ""); + return; + } + ## + ## Determine how many results we need to get + ## + $ENV{'form.startwith'} = 0 if (! exists($ENV{'form.startwith'})); + $ENV{'form.show'} = 'all' if (! exists($ENV{'form.show'})); + my $min = $ENV{'form.startwith'}; + my $max; + if ($ENV{'form.show'} eq 'all') { + $max = $total_results ; + } else { + $max = $min + $ENV{'form.show'}; + } + ## + ## Output links (if necessary) for 'prev' and 'next' pages. + ## + + ## + ## Get results from MySQL table + ## + my @Results = &Apache::lonmysql::get_rows($table, + 'id>'.$min.' AND id<='.$max); + ## + ## Loop through the results and output them. + ## foreach my $row (@Results) { my %Fields = %{&parse_row(@$row)}; - my $output="\n

\n"; - if ($ENV{'form.catalogmode'} eq 'interactive') { - my $titleesc=$Fields{'title'}; - $titleesc=~s/\'/\\'/; # ' - if ($ENV{'form.catalogmode'} eq 'interactive') { - $output.=< - -
-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 -# -# - $fnum++; - } + my $output="

\n"; + $output.=&catalogmode_output($Fields{'title'},$Fields{'url'}); # Render the result into html $output.= &$viewfunction(%Fields); - if ($output) { - $output.="


"; - } + $output.="

\n
"; + # Print them out as they come in. $r->print($output); $r->rflush(); } @@ -1683,6 +1786,53 @@ END =pod +=item &catalogmode_output($title,$url) + +Returns html needed for the various catalog modes. Gets inputs from +$ENV{'form.catalogmode'}. Stores data in %groupsearch_db and $fnum +(local variable). + +=cut + +###################################################################### +###################################################################### +{ +my $fnum; + +sub catalogmode_output { + my $output = ''; + my ($title,$url) = @_; + if ($ENV{'form.catalogmode'} eq 'interactive') { + $title=~ s/\'/\\'/g; # ' Escape single quotes. + if ($ENV{'form.catalogmode'} eq 'interactive') { + $output.=< + +END + } + } + if ($ENV{'form.catalogmode'} eq 'groupsearch') { + $fnum+=0; + $groupsearch_db{"pre_${fnum}_link"}=$url; + $groupsearch_db{"pre_${fnum}_title"}=$title; + $output.=< + + +END + $fnum++; + } + return $output; +} + +} +###################################################################### +###################################################################### + +=pod + =item &parse_row Parse a row returned from the database. @@ -1705,235 +1855,6 @@ sub parse_row { &Apache::loncommon::filedescription($Fields{'mime'}); return \%Fields; } -###################################################################### -###################################################################### - -=pod - -=item &output_results() - -Format and output results based on a reply list. -There are two windows that this function writes to. The main search -window ("srch") has a listing of the results. A secondary window ("popwin") -gives the status of the network search (time elapsed, number of machines -contacted, etc.) - -=cut - -###################################################################### -###################################################################### -sub output_results { -# &Apache::lonnet::logthis("output_results:".time); - my $fnum; # search result counter - my ($mode,$r,$replyref,$hidden)=@_; - my %rhash=%{$replyref}; - my $compiledresult=''; - my $timeremain=300; # (seconds) - my $elapsetime=0; - my $resultflag=0; - my $tflag=1; - ## - ## 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); - # - # Begin producing output - $r->rflush(); - # - # begin showing the cataloged results - my $action = "/adm/searchcat"; - if ($mode eq 'Basic') { - $action .= "?reqinterface=basic"; - } elsif ($mode eq 'Advanced') { - $action .= "?reqinterface=advanced"; - } - $r->print(< -$hidden - - -$importbutton -$closebutton -$persistent -
-CATALOGCONTROLS - # - # make the pop-up window for status - $r->print(&make_popwin(%rhash)); - $r->rflush(); - ## - ## Prepare for the main loop below - ## - my $servercount=0; - my $hitcountsum=0; - my $servernum=(keys %rhash); - my $serversleft=$servernum; - ## - ## Run until we run out of time or we run out of servers - ## - while($serversleft && $timeremain) { - ## - ## %rhash has servers deleted from it as results come in - ## (within the foreach loop below). - ## - foreach my $rkey (sort keys %rhash) { -# &Apache::lonnet::logthis("Server $rkey:".time); - $servercount++; - $compiledresult=''; - my $reply=$rhash{$rkey}; - my @results; - if ($reply eq 'con_lost') { - &popwin_imgupdate($r,$rkey,"srvbad.gif"); - $serversleft--; - delete $rhash{$rkey}; - } else { - # must do since 'use strict' checks for tainting - $reply=~/^([\.\w]+)$/; - my $replyfile=$r->dir_config('lonDaemons').'/tmp/'.$1; - $reply=~/(.*?)\_/; - for (my $counter=0;$counter<2;$counter++) { - if (-e $replyfile && ! -e "$replyfile.end") { - &popwin_imgupdate($r,$rkey,"srvhalf.gif"); - &popwin_js($r,'popwin.hc["'.$rkey.'"]='. - '"still transferring..."'.';'); - } - # Are we finished transferring data? - if (-e "$replyfile.end") { - $serversleft--; - delete $rhash{$rkey}; - if (-s $replyfile) { - &popwin_imgupdate($r,$rkey,"srvgood.gif"); - my $fh; - unless ($fh=Apache::File->new($replyfile)){ - # Is it really appropriate to die on this error? - $r->print('ERROR: file '. - $replyfile.' cannot be opened'); - return OK; - } - @results=<$fh> if $fh; - my $hits =@results; - &popwin_js($r,'popwin.hc["'.$rkey.'"]='. - $hits.';'); - $hitcountsum+=$hits; - &popwin_js($r,'popwin.document.forms.popremain.'. - 'numhits.value='.$hitcountsum.';'); - } else { - &popwin_imgupdate($r,$rkey,"srvempty.gif"); - &popwin_js($r,'popwin.hc["'.$rkey.'"]=0;'); - } - last; - } # end of if ( -e "$replyfile.end") - last unless $timeremain; - sleep 1; # wait for daemons to write files? - $timeremain--; - $elapsetime++; - &popwin_js($r,"popwin.document.popremain.". - "elapsetime.value=$elapsetime;"); - } - &popwin_js($r,'popwin.document.whirly.'. - 'src="/adm/lonIcons/lonanimend.gif";'); - } # end of if ($reply eq 'con_lost') else statement - my %Fields = undef; # Holds the data to be sent to the various - # *_view routines. - my ($extrashow,$customfields,$customhash) = - &handle_custom_fields(\@results); - my @customfields = @$customfields; - my %customhash = %$customhash; - untie %groupsearch_db if (tied %groupsearch_db); - # - if (! tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { - $r->print('Unable to tie hash to db '. - 'file'); - } else { - if ($ENV{'form.launch'} eq '1') { - &start_fresh_session(); - } - foreach my $result (@results) { - next if $result=~/^custom\=/; - chomp $result; - next unless $result; - %Fields = &parse_raw_result($result,$rkey); - # - # Check copyright tags and skip results the user cannot use - my (undef,undef,$resdom,$resname) = split('/',$Fields{'url'}); - # Check for priv - if (($Fields{'copyright'} eq 'priv') && - (($ENV{'user.name'} ne $resname) && - ($ENV{'user.domain'} ne $resdom))) { - next; - } - # Check for domain - if (($Fields{'copyright'} eq 'domain') && - ($ENV{'user.domain'} ne $resdom)) { - next; - } - # - $Fields{'extrashow'}=$extrashow; - if ($extrashow) { - foreach my $field (@customfields) { - my $value=''; - $value = $1 if ($customhash{$Fields{'url'}}=~/\<{$field}[^\>]*\>(.*?)\<\/{$field}[^\>]*\>/s); - $Fields{'extrashow'}=~s/\<\!\-\- $field \-\-\>/ $value/g; - } - } - $compiledresult.="\n

\n"; - if ($ENV{'form.catalogmode'} eq 'interactive') { - my $titleesc=$Fields{'title'}; - $titleesc=~s/\'/\\'/; # ' - $compiledresult.=< - -
-END - } - if ($ENV{'form.catalogmode'} eq 'groupsearch') { - $fnum+=0; - $groupsearch_db{"pre_${fnum}_link"}=$Fields{'url'}; - $groupsearch_db{"pre_${fnum}_title"}=$Fields{'title'}; - $compiledresult.=< - - -
-END -# -# - $fnum++; - } - # Render the result into html - $compiledresult.= &$viewfunction(%Fields, hostname => $rkey ); - if ($compiledresult or $servercount!=$servernum) { - $compiledresult.="


"; - } - } - untie %groupsearch_db; - } - if ($compiledresult) { - $resultflag=1; - $r->print($compiledresult); - } - } # End of foreach loop over servers remaining - } # End of big loop - while($serversleft && $timeremain) - unless ($resultflag) { - $r->print("\nThere were no results that matched your query\n"); - } - $r->print(''. - "\n"); - $r->print("\n\n"); - $r->rflush(); - return; -} ########################################################### ########################################################### @@ -2214,99 +2135,6 @@ END ###################################################################### ###################################################################### -=pod - -=item &make_popwin() - -Returns html with javascript in it to open up the status window. - -=cut - -###################################################################### -###################################################################### -sub make_popwin { - my %rhash = @_; - my $servernum=(keys %rhash); - my $hcinit; - my $grid="'
'+\n"; - # $sn is the server number, used ONLY to make sure we have - # rows of 10 each. No longer used to index images. - my $sn=1; - foreach my $sk (sort keys %rhash) { - $grid.="''+ - $grid.="'+\"'\"+')\">'+"; - $grid.="\n"; - $grid.="'\"".$sk.'+\n"; - $grid.="'
'+\n" unless $sn%10; - $sn++; - } - my $result.=< - popwin=open('','popwin','scrollbars=1,width=400,height=220'); - popwin.focus(); - popwin.document.writeln('<'+'html>'); - popwin.document.writeln('<'+'head>'); - popwin.document.writeln('<'+'script>'); - popwin.document.writeln('hc=new Array();$hcinit'); - popwin.document.writeln('<'+'/script>'); - popwin.document.writeln('<'+'/head>'+ - '<'+'body bgcolor="#FFFFFF">'+ - '<'+'image name="whirly" align="right" src="/adm/lonIcons/'+ - 'lonanim.gif" '+ - 'alt="animated logo" />'+ - '<'+'h3>Search Results Progress<'+'/h3>'+ - '<'+'form name="popremain">'+ - '<'+'tt>'+ - '<'+'br clear="all"/>PLEASE BE PATIENT'+ - '<'+'br />SCANNING $servernum SERVERS'+ - '<'+'br clear="all" />Number of record hits found '+ - '<'+'input type="text" size="10" name="numhits"'+ - ' value="0" />'+ - '<'+'br clear="all" />Time elapsed '+ - '<'+'input type="text" size="10" name="elapsetime"'+ - ' value="0" />'+ - '<'+'br />'+ - 'SERVER GRID (click on any cell for details)'+ - $grid - '<'+'br />'+ - 'Server details '+ - '<'+'input type="text" size="35" name="sdetails"'+ - ' value="" />'+ - '<'+'br />'+ - ' <'+'input type="button" name="button"'+ - ' value="close this window" '+ - ' onClick="javascript:opener.abortsearch()" />'+ - ' <'+'input type="button" name="button"'+ - ' value="help" onClick="javascript:opener.openhelp()" />'+ - '<'+'/tt>'+ - '<'+'/form>'+ - '<'+'/body><'+'/html>'); - popwin.document.close(); - -ENDPOP - return $result; -} - -###################################################################### -###################################################################### - =pod =item Metadata Viewing Functions @@ -2490,10 +2318,8 @@ sub filled { ###################################################################### ###################################################################### sub output_blank_field_error { - my ($r)=@_; + my ($r,$closebutton)=@_; # make query information persistent to allow for subsequent revision - my $persistent=&make_persistent(\%ENV); - $r->print(< @@ -2505,7 +2331,7 @@ BEGINNING

Search Catalog

-$persistent +$hidden_fields $closebutton @@ -2531,15 +2357,19 @@ RESULTS Output a full html page with an error message. +Inputs: + + $r, the request pointer. + $message, the error message for the user. + $closebutton, the specialized close button needed for groupsearch. + =cut ###################################################################### ###################################################################### sub output_date_error { - my ($r,$message)=@_; + my ($r,$message,$closebutton)=@_; # make query information persistent to allow for subsequent revision - my $persistent=&make_persistent(\%ENV); - $r->print(< @@ -2549,7 +2379,7 @@ sub output_date_error {

Search Catalog

-$persistent +$hidden_fields $closebutton @@ -2589,51 +2419,6 @@ sub start_fresh_session { } } -###################################################################### -###################################################################### - -=pod - -=item &popwin_js() send javascript to popwin - -=cut - -###################################################################### -###################################################################### -sub popwin_js { - # Print javascript out to popwin, but make sure we dont generate - # any javascript errors in doing so. - my ($r,$text) = @_; - $r->print(<<"END"); - -END - $r->rflush(); -} - -###################################################################### -###################################################################### - -=pod - -=item &popwin_imgupdate() - -Send a given image (and its location) out to the browser. Takes as -input $r, loncapa server id, and an icon URL. - -=cut - -###################################################################### -###################################################################### -sub popwin_imgupdate { - my ($r,$server,$icon) = @_; - &popwin_js($r,'popwin.document.img_'.$Apache::lonnet::hostdom{$server}. - '_'.$server.'.'.'src="/adm/lonIcons/'.$icon.'";'); -} - 1; __END__