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 ©right_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 (! ©right_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; |
} |
} |
|
|