--- loncom/interface/lonsearchcat.pm 2002/07/30 20:26:05 1.149 +++ loncom/interface/lonsearchcat.pm 2002/08/01 14:11:57 1.150 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.149 2002/07/30 20:26:05 matthew Exp $ +# $Id: lonsearchcat.pm,v 1.150 2002/08/01 14:11:57 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,14 +25,6 @@ # # http://www.lon-capa.org/ # -# YEAR=2001 -# 3/8, 3/12, 3/13, 3/14, 3/15, 3/19 Scott Harrison -# 3/20, 3/21, 3/22, 3/26, 3/27, 4/2, 8/15, 8/24, 8/25 Scott Harrison -# 10/12,10/14,10/15,10/16,11/28,11/29,12/10,12/12,12/16 Scott Harrison -# YEAR=2002 -# 1/17 Scott Harrison -# 6/17 Matthew Hall -# ############################################################################### ############################################################################### @@ -140,7 +132,8 @@ my $diropendb = ""; # db file my %Views = ("Detailed Citation View" => \&detailed_citation_view, "Summary View" => \&summary_view, "Fielded Format" => \&fielded_format_view, - "XML/SGML" => \&xml_sgml_view ); + "XML/SGML" => \&xml_sgml_view, + "Compact View" => \&compact_view); my %persistent_db; my $hidden_fields; ###################################################################### @@ -214,13 +207,28 @@ sub handler { '_'.$ENV{'form.persistent_db_id'}.'_persistent_search.db'; ## if (! &get_persistent_form_data($r,$persistent_db_file)) { - &write_status($r,"Unable to get persistent data"); + if ($ENV{'form.phase'} =~ /(run_search|results)/) { + &Apache::lonnet::logthis("lonsearchcat:Unable to recover data ". + "from $persistent_db_file"); + $r->print(< +LON-CAPA Search Error + +We were unable to retrieve data describing your search. This is a serious +error and has been logged. Please alert your LON-CAPA administrator. + + +END + return OK; + } } ## ## Clear out old values from groupsearch database ## untie %groupsearch_db if (tied(%groupsearch_db)); - if ($ENV{'form.launch'} eq '1') { + if ($ENV{'form.launch'} eq '1' && + ($ENV{'form.catalogmode'} eq 'groupsearch') && + ($ENV{'form.phase'} eq 'results')) { if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) { &start_fresh_session(); untie %groupsearch_db; @@ -231,18 +239,45 @@ sub handler { } } ## - ## Configure dynamic components of interface + ## Configure hidden fields ## $hidden_fields = ''; + $ENV{'form.persistent_db_id'}.'" />'."\n"; + if (exists($ENV{'form.catalogmode'})) { + $hidden_fields .= ''."\n"; + } + if (exists($ENV{'form.form'})) { + $hidden_fields .= ''."\n"; + } + if (exists($ENV{'form.element'})) { + $hidden_fields .= ''."\n"; + } + if (exists($ENV{'form.mode'})) { + $hidden_fields .= ''."\n"; + } + ## + ## Configure dynamic components of interface ## if ($ENV{'form.catalogmode'} eq 'interactive') { - $closebutton=""."\n"; + $closebutton=" -END + $closebutton=" @@ -255,7 +290,12 @@ END ## Sanity checks on form elements ## if (!defined($ENV{'form.viewselect'})) { - $ENV{'form.viewselect'} ="Detailed Citation View"; + if (($ENV{'form.catalogmode'} eq 'groupsearch') || + ($ENV{'form.catalogmode'} eq 'interactive')) { + $ENV{'form.viewselect'} ="Compact View"; + } else { + $ENV{'form.viewselect'} ="Detailed Citation View"; + } } $ENV{'form.phase'} = 'disp_basic' if (! exists($ENV{'form.phase'})); ## @@ -272,11 +312,6 @@ END &get_persistent_data($persistent_db_file, ['query','customquery','customshow', 'libraries','pretty_string']); - &write_status($r,"query = $query"); - &write_status($r,"customquery = $customquery"); - &write_status($r,"customshow = $customshow"); - &write_status($r,"libraries = $libraries"); - &write_status($r,"pretty_string = $pretty_string"); &run_search($r,$query,$customquery,$customshow, $libraries,$pretty_string); } elsif(($ENV{'form.phase'} eq 'basic_search') || @@ -376,8 +411,6 @@ then press SEARCH below. ENDDOCUMENT $scrout.=' '.&simpletextfield('basicexp',$ENV{'form.basicexp'},40). ' '; -# $scrout.=&simplecheckbox('allversions',$ENV{'form.allversions'}); -# $scrout.='Search historic archives'; my $checkbox = &simplecheckbox('related',$ENV{'form.related'}); $scrout.=<Advanced Search @@ -755,7 +788,7 @@ sub make_form_data_persistent { my $filename = shift; my %save; foreach (keys(%ENV)) { - next if (! /^form/ || /submit/); + next if (!/^form/ || /submit/); $save{$_} = $ENV{$_}; } return &make_persistent($r,\%save,$filename); @@ -1604,38 +1637,23 @@ sub create_results_table { =pod -=item &write_status() - -=cut - -###################################################################### -###################################################################### -sub write_status { - my ($r,$string) = @_; - $string =~ s/(\')/\$1/g; - $string =~ s/\n//sg; -# $r->print("\n"); -# $r->rflush(); - return; -} - -###################################################################### -###################################################################### - -=pod - =item Search Status update functions Each of the following functions changes the values of one of the -input fields used to display the search status to the user. +input fields used to display the search status to the user. The names +should be explanatory. + +Inputs: Apache request handler ($r), text to display. + +Returns: Nothing. =over 4 =item &update_count_status() -=item &update_contact_status() +=item &update_status() -=item &update_read_status() +=item &update_seconds() =back @@ -1651,19 +1669,19 @@ sub update_count_status { $r->rflush(); } -sub update_contact_status { +sub update_status { my ($r,$text) = @_; $text =~ s/\'/\\\'/g; $r->print - ("\n"); + ("\n"); $r->rflush(); } -sub update_read_status { +sub update_seconds { my ($r,$text) = @_; $text =~ s/\'/\\\'/g; $r->print - ("\n"); + ("\n"); $r->rflush(); } @@ -1680,7 +1698,7 @@ sub update_read_status { ###################################################################### sub run_search { my ($r,$query,$customquery,$customshow,$serverlist,$pretty_string) = @_; - my $c = $r->connection; + my $connection = $r->connection; # # Timing variables # @@ -1703,7 +1721,7 @@ sub run_search { } my %Server_status; my $table =$ENV{'form.table'}; - if (! defined($table) || $table eq '') { + if (! defined($table) || $table eq '' || $table =~ /\D/ ) { $r->print("Unable to determine table id to store search results in.". "The search has been aborted."); return; @@ -1730,18 +1748,22 @@ sub run_search { my $status; $r->print(< + - + - - - + + +
ContactingReceivingTotal Matches
StatusTotal MatchesTime Remaining
END $r->rflush(); - while ((time - $starttime < $max_time) && + my $time_remaining = $max_time - (time - $starttime) ; + my $last_time = $time_remaining; + &update_seconds($r,$time_remaining); + while (($time_remaining > 0) && ((@Servers_to_contact) || keys(%Server_status))) { # Send out a search request if it needs to be done. if (@Servers_to_contact) { @@ -1751,13 +1773,17 @@ END $customshow,[$server]); ($server) = keys(%$reply); $Server_status{$server} = $reply->{$server}; - &update_contact_status($r,$server); + &update_status($r,'contacting '.$server); } else { - &update_contact_status($r,'none'); - sleep(1); # wait a sec. to give time for files to be written + # wait a sec. to give time for files to be written + # This sleep statement is here instead of outside the else + # block because we do not want to pause if we have servers + # left to contact. + sleep(1); } + &update_status($r,'waiting on '.(join(' ',keys(%Server_status)))); while (my ($server,$status) = each(%Server_status)) { - last if ($c->aborted()); + last if ($connection->aborted()); if ($status eq 'con_lost') { delete ($Server_status{$server}); next; @@ -1765,27 +1791,26 @@ END $status=~/^([\.\w]+)$/; my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$1; if (-e $datafile && ! -e "$datafile.end") { + &update_status($r,'Receiving results from '.$server); next; } - last if ($c->aborted()); + last if ($connection->aborted()); if (-e "$datafile.end") { - &update_read_status($r,$server); + &update_status($r,'Reading results from '.$server); 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? $r->print("Unable to open search results file for ". "server $server. Omitting from search"); - next; + delete($Server_status{$server}); + next; } # Read in the whole file. while (my $result = <$fh>) { - last if ($c->aborted()); + last if ($connection->aborted()); # handle custom fields? Someday we will! chomp($result); next unless $result; @@ -1800,22 +1825,32 @@ END } # $r->print(&Apache::lonmysql::get_debug()); $hitcountsum ++; - &update_count_status($r,$hitcountsum) if ($hitcountsum % 50 == 0); + $time_remaining = $max_time - (time - $starttime) ; + if ($last_time - $time_remaining > 0) { + &update_seconds($r,$time_remaining); + $last_time = $time_remaining; + } + if ($hitcountsum % 50 == 0) { + &update_count_status($r,$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}); - # $r->print("Received $new_count more results from ". - # $server."."); } - last if ($c->aborted()); + last if ($connection->aborted()); &update_count_status($r,$hitcountsum); } - last if ($c->aborted()); + last if ($connection->aborted()); # Finished looping through the servers + $time_remaining = $max_time - (time - $starttime) ; + if ($last_time - $time_remaining > 0) { + $last_time = $time_remaining; + &update_seconds($r,$time_remaining); + } } - &update_read_status($r,'none'); + &update_status($r,'Search Complete'.$server); &Apache::lonmysql::disconnect_from_db(); # Let the user know # @@ -1887,8 +1922,9 @@ sub prev_next_buttons { ###################################################################### ###################################################################### sub display_results { - my ($r,$mode,$importbutton,$closebutton) = @_; - $r->print(&search_results_header()); + my ($r,$importbutton,$closebutton) = @_; + my $connection = $r->connection; + $r->print(&search_results_header($importbutton,$closebutton)); ## ## Set viewing function ## @@ -1908,7 +1944,7 @@ sub display_results { if ($ENV{'form.catalogmode'} eq 'groupsearch') { if (! tie(%groupsearch_db,'GDBM_File',$diropendb, &GDBM_WRCREAT(),0640)) { - $r->print('Unable to tie hash to db file'); + $r->print('Unable to store import results.'); $r->rflush(); return; } @@ -1923,7 +1959,7 @@ sub display_results { } my $table_check = &Apache::lonmysql::check_table($table); if (! defined($table_check)) { - $r->print("A MySQL error has occurred."); + $r->print("A MySQL error has occurred."); &Apache::lonnet::logthis("lonmysql was unable to determine the status". " of table ".$table); return; @@ -1938,18 +1974,13 @@ sub display_results { ## my $total_results = &Apache::lonmysql::number_of_rows($table); if (! defined($total_results)) { - $r->print("A MySQL error has occurred."); + $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 ## @@ -1967,7 +1998,6 @@ sub display_results { ## ## Output links (if necessary) for 'prev' and 'next' pages. ## - $r->print("
Results $min to $max out of $total_results
\n"); $r->print ('
'. &prev_next_buttons($min,$ENV{'form.show'},$total_results, @@ -1976,6 +2006,14 @@ sub display_results { "&persistent_db_id=".$ENV{'form.persistent_db_id'}) ."
\n" ); + if ($total_results == 0) { + $r->print("There are currently no results.\n". + ""); + return; + } else { + $r->print + ("
Results $min to $max out of $total_results
\n"); + } ## ## Get results from MySQL table ## @@ -1985,12 +2023,16 @@ sub display_results { ## Loop through the results and output them. ## foreach my $row (@Results) { + if ($connection->aborted()) { + untie %groupsearch_db if (tied(%groupsearch_db)); + &Apache::lonmysql::disconnect_from_db(); + return; + } my %Fields = %{&parse_row(@$row)}; my $output="

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

\n
"; + $output.= &$viewfunction($prefix,%Fields); # Print them out as they come in. $r->print($output); $r->rflush(); @@ -2008,9 +2050,9 @@ sub display_results { ."\n" ); } - $r->print(""); + $r->print(""); $r->rflush(); - untie %groupsearch_db; + untie %groupsearch_db if (tied(%groupsearch_db)); return; } @@ -2030,13 +2072,13 @@ $ENV{'form.catalogmode'}. Stores data i ###################################################################### ###################################################################### { -my $fnum; +my $fnum = 0; sub catalogmode_output { my $output = ''; my ($title,$url) = @_; if ($ENV{'form.catalogmode'} eq 'interactive') { - $title=~ s/\'/\\'/g; # ' Escape single quotes. + $title=~ s/\'/\\\'/g; if ($ENV{'form.catalogmode'} eq 'interactive') { $output.=< function select_data(title,url) { changeURL(url); - self.close(); + parent.close(); } function changeTitle(val) { } function changeURL(val) { - if (window.opener.document) { - window.opener.document.forms["$form"].elements["$element"].value=val; + if (parent.targetwin.document) { + parent.targetwin.document.forms["$form"].elements["$element"].value=val; } else { var url = 'forms[\"$form\"].elements[\"$element\"].value'; alert("Unable to transfer data to "+url); @@ -2307,26 +2348,25 @@ SCRIPT } $result.=< SCRIPT $result.=< +
+ +$importbutton END return $result; } @@ -2342,6 +2382,14 @@ Sending search request to LON-CAPA serve ENDSTATUS } +sub results_link { + my $basic_link = "/adm/searchcat?"."&table=".$ENV{'form.table'}. + "&persistent_db_id=".$ENV{'form.persistent_db_id'}; + my $results_link = $basic_link."&phase=results". + "&pause=10"."&start=0"."&show=20"; + return $results_link; +} + ###################################################################### ###################################################################### sub print_frames_interface { @@ -2349,11 +2397,13 @@ sub print_frames_interface { my $basic_link = "/adm/searchcat?"."&table=".$ENV{'form.table'}. "&persistent_db_id=".$ENV{'form.persistent_db_id'}; my $run_search_link = $basic_link."&phase=run_search"; - my $results_link = $basic_link."&phase=results". - "&pause=10"."&start=0"."&show=20"; + my $results_link = &results_link(); my $result = <<"ENDFRAMES"; + LON-CAPA Digital Library Search Results @@ -2389,10 +2439,10 @@ extra custom metadata to show. ###################################################################### ###################################################################### sub detailed_citation_view { - my %values = @_; + my ($prefix,%values) = @_; my $result=<$values{'title'} +$prefix$values{'title'}

$values{'author'}, $values{'owner'}
@@ -2407,6 +2457,7 @@ $values{'extrashow'}

$values{'shortabstract'}

+
END return $result; } @@ -2422,15 +2473,16 @@ END ###################################################################### ###################################################################### sub summary_view { - my %values = @_; + my ($prefix,%values) = @_; my $result=<$values{'author'}
$values{'title'}
$values{'owner'} -- $values{'lastrevisiondate'}
$values{'copyrighttag'}
$values{'extrashow'}

+
END return $result; } @@ -2440,6 +2492,28 @@ END =pod +=item &compact_view() + +=cut + +###################################################################### +###################################################################### +sub compact_view { + my ($prefix,%values) = @_; + my $result=< +$values{'title'} +$values{'author'}
+END + return $result; +} + + +###################################################################### +###################################################################### + +=pod + =item &fielded_format_view() =cut @@ -2447,8 +2521,9 @@ END ###################################################################### ###################################################################### sub fielded_format_view { - my %values = @_; + my ($prefix,%values) = @_; my $result=<URL: $values{'url'}
@@ -2467,6 +2542,7 @@ sub fielded_format_view { Abstract: $values{'shortabstract'}
$values{'extrashow'}

+
END return $result; } @@ -2485,8 +2561,9 @@ END ###################################################################### ###################################################################### sub xml_sgml_view { - my %values = @_; + my ($prefix,%values) = @_; my $result=< <LonCapaResource> <url>$values{'url'}</url> @@ -2515,6 +2592,7 @@ sub xml_sgml_view { </LonCapaResource> $values{'extrashow'} +
END return $result; }