--- loncom/interface/lonsearchcat.pm 2002/07/16 15:02:06 1.143
+++ loncom/interface/lonsearchcat.pm 2002/07/26 16:37:58 1.144
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Search Catalog
#
-# $Id: lonsearchcat.pm,v 1.143 2002/07/16 15:02:06 matthew Exp $
+# $Id: lonsearchcat.pm,v 1.144 2002/07/26 16:37:58 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -87,8 +87,10 @@ use Apache::lonnet();
use Apache::File();
use CGI qw(:standard);
use Text::Query;
+use DBI;
use GDBM_File;
use Apache::loncommon();
+use Apache::lonmysql();
# ---------------------------------------- variables used throughout the module
@@ -259,13 +261,11 @@ END
$r->print(&search_results_header($searchtype,$pretty_string));
$r->print("Sending search request to LON-CAPA servers.
\n");
$r->rflush();
- # Send query statements over the network to be processed by
- # either the SQL database or a recursive scheme of 'grep'-like
- # actions (for custom metadata).
- my $reply=&Apache::lonnet::metadata_query($query,$customquery,
- $customshow,$libraries);
+ &run_search($r,$query,$customquery,$customshow,$libraries);
+ &display_results($r,$searchtype,$hidden,$importbutton,
+ $closebutton);
+
$r->rflush();
- &output_results($searchtype,$r,$reply,$hidden);
} else {
#
# We need to get information to search on
@@ -1100,7 +1100,6 @@ sub parse_basic_search {
$pretty_search_string .= " with no related words.";
}
}
- &Apache::lonnet::logthis("Search String: $search_string");
# Build SQL query string based on form page
my $query='';
my $concatarg=join('," ",',
@@ -1315,6 +1314,400 @@ 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("
".$string."\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.