--- loncom/interface/lonsearchcat.pm 2002/07/29 21:53:57 1.146 +++ loncom/interface/lonsearchcat.pm 2002/07/30 18:30:56 1.147 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.146 2002/07/29 21:53:57 matthew Exp $ +# $Id: lonsearchcat.pm,v 1.147 2002/07/30 18:30:56 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -191,7 +191,7 @@ sub handler { ## this once, so the pause indicator is deleted ## if (exists($ENV{'form.pause'})) { - sleep(5); + sleep(3); delete($ENV{'form.pause'}); } ## @@ -204,7 +204,8 @@ sub handler { # 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'} =~ /\D/) || + ($ENV{'form.launch'} eq '1')) { $ENV{'form.persistent_db_id'} = time; } my $persistent_db_file = "/home/httpd/perl/tmp/". @@ -212,7 +213,9 @@ sub handler { '_'.&Apache::lonnet::escape($ENV{'user.name'}). '_'.$ENV{'form.persistent_db_id'}.'_persistent_search.db'; ## - &get_persistent_form_data($r,$persistent_db_file); + if (! &get_persistent_form_data($r,$persistent_db_file)) { + &write_status($r,"Unable to get persistent data"); + } ## ## Clear out old values from groupsearch database ## @@ -280,12 +283,31 @@ END ($ENV{'form.phase'} eq 'adv_search')) { # Set up table if (! defined(&create_results_table())) { - # Unable to make table to store results in. - # Definately abort search. + my $error = &Apache::lonmysql::get_error(); + $r->print(<Search Error + +Unable to create table in which to store search results. +The search has been aborted. +
+ERROR:
+$error
+
+ + +END + return OK; } + delete($ENV{'form.launch'}); if (! &make_form_data_persistent($r,$persistent_db_file)) { - # Unable to store persistent data. - # Probably should bail out. + $r->print(<Search Error + +Unable to properly store search information. The search has been aborted. + + +END + return OK; } # # We are running a search @@ -299,11 +321,6 @@ END = &parse_advanced_search($r,$closebutton); return OK if (! defined($query)); } - &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"); &make_persistent($r, { query => $query, customquery => $customquery, @@ -608,7 +625,7 @@ to them. sub get_persistent_form_data { my $r = shift; my $filename = shift; - return undef if (! -e $filename); + return 0 if (! -e $filename); return undef if (! tie(%persistent_db,'GDBM_File',$filename, &GDBM_READER,0640)); # @@ -637,7 +654,6 @@ sub get_persistent_form_data { $ENV{$name} = $values[0] if ($values[0]); } } - &write_status($r,"Reconstructed $name = $ENV{$name}"); } untie (%persistent_db); return 1; @@ -717,7 +733,6 @@ sub make_persistent { # We handle array references, but not recursively. my $store = join(',', map { &Apache::lonnet::escape($_); } @values ); $persistent_db{$name} = $store; - &write_status($r,"Stored $name = $store"); } untie(%persistent_db); return 1; @@ -1527,9 +1542,7 @@ the following format: ## 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/; + abstract mime lang owner copyright creationdate lastrevisiondate hostname/; my %Datatypes = ( id =>{ type => 'INT', @@ -1555,16 +1568,11 @@ my %Datatypes = 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'}, ); +my @Fullindicies = + qw/title author subject abstract mime language owner copyright/; + ###################################################################### ###################################################################### @@ -1587,6 +1595,7 @@ sub create_results_table { my $table = &Apache::lonmysql::create_table ( { columns => \%Datatypes, column_order => \@DataOrder, + fullindex => \@Fullindicies, } ); if (defined($table)) { $ENV{'form.table'} = $table; @@ -1649,14 +1658,23 @@ sub run_search { } my %Server_status; my $table =$ENV{'form.table'}; - 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:". + if (! defined($table) || $table eq '') { + $r->print("Unable to determine table id to store search results in.". + "The search has been aborted."); + return; + } + my $table_status = &Apache::lonmysql::check_table($table); + if (! defined($table_status)) { + $r->print("Unable to determine status of table."); + &Apache::lonnet::logthis("Bogus table id of $table for ". + "$ENV{'user.name'} @ $ENV{'user.domain'}"); + &Apache::lonnet::logthis("lonmysql error = ". &Apache::lonmysql::get_error()); - $r->print("An internal error occured with the database.
". - "The error has been logged, but you should probably alert". - " your system administrator."); + return; + } + if (! $table_status) { + $r->print("The table id,$table, we tried to use is invalid.". + "The search has been aborted."); return; } ## @@ -1665,6 +1683,7 @@ sub run_search { my $hitcountsum; my $server; my $status; + $r->print("Searching"); while ((time - $starttime < $max_time) && ((@Servers_to_contact) || keys(%Server_status))) { # Send out a search request if it needs to be done. @@ -1676,12 +1695,8 @@ sub run_search { ($server) = keys(%$reply); $Server_status{$server} = $reply->{$server}; # $r->print("Contacted:$server:reply:$Server_status{$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; - } + $r->print(" ."); + $r->rflush(); } else { sleep(1); # wait a sec. to give time for files to be written } @@ -1744,9 +1759,9 @@ sub run_search { # # We have run out of time or run out of servers to talk to and # results to get. - $r->print("

Search completed.

"); + $r->print("
Search Completed
"); if ($hitcountsum) { - $r->print($hitcountsum." successful matches to your query.
"); + $r->print($hitcountsum." successful matches were found.
"); } else { $r->print("There were no successful matches to your query.
"); } @@ -1826,7 +1841,7 @@ sub display_results { ## my $action = "/adm/searchcat?phase=results"; ## - ## + ## Deal with groupsearch ## if ($ENV{'form.catalogmode'} eq 'groupsearch') { if (! tie(%groupsearch_db,'GDBM_File',$diropendb, @@ -1920,6 +1935,16 @@ sub display_results { } if (@Results < 1) { $r->print("There were no results matching your query"); + } else { + $r->print + ('
'. + &prev_next_buttons($min,$ENV{'form.show'},$total_results, + "table=".$ENV{'form.table'}. + "&phase=results". + "&persistent_db_id=". + $ENV{'form.persistent_db_id'}) + ."

\n" + ); } $r->print(""); $r->rflush();