version 1.21, 2002/10/08 15:09:36
|
version 1.25, 2002/11/18 20:44:15
|
Line 45 use IO::File;
|
Line 45 use IO::File;
|
use HTML::TokeParser; |
use HTML::TokeParser; |
use DBI; |
use DBI; |
use GDBM_File; |
use GDBM_File; |
|
use POSIX qw(strftime mktime); |
|
|
my @metalist; |
my @metalist; |
|
|
Line 57 sub unescape {
|
Line 58 sub unescape {
|
return $str; |
return $str; |
} |
} |
|
|
|
# -------------------------------------------------------- Escape Special Chars |
|
|
|
sub escape { |
|
my $str=shift; |
|
$str =~ s/(\W)/"%".unpack('H2',$1)/eg; |
|
return $str; |
|
} |
|
|
|
|
# ------------------------------------------- Code to evaluate dynamic metadata |
# ------------------------------------------- Code to evaluate dynamic metadata |
|
|
sub dynamicmeta { |
sub dynamicmeta { |
# |
|
# |
|
# Do nothing for now ... |
|
# |
|
# |
|
return; |
|
# |
|
# ..., but stuff below already works |
|
# |
|
my $url=&declutter(shift); |
my $url=&declutter(shift); |
$url=~s/\.meta$//; |
$url=~s/\.meta$//; |
my %returnhash=(); |
my %returnhash=(); |
my ($adomain,$aauthor)=($url=~/^(\w+)\/(\w+)\//); |
my ($adomain,$aauthor)=($url=~/^(\w+)\/(\w+)\//); |
my $prodir=&propath($adomain,$aauthor); |
my $prodir=&propath($adomain,$aauthor); |
if (tie(%evaldata,'GDBM_File', |
if ((tie(%evaldata,'GDBM_File', |
$prodir.'/nohist_resevaldata.db',&GDBM_READER,0640)) { |
$prodir.'/nohist_resevaldata.db',&GDBM_READER(),0640)) && |
|
(tie(%newevaldata,'GDBM_File', |
|
$prodir.'/nohist_new_resevaldata.db',&GDBM_WRCREAT(),0640))) { |
my %sum=(); |
my %sum=(); |
my %cnt=(); |
my %cnt=(); |
my %listitems=('count' => 'add', |
my %listitems=('count' => 'add', |
Line 98 sub dynamicmeta {
|
Line 101 sub dynamicmeta {
|
foreach (keys %evaldata) { |
foreach (keys %evaldata) { |
my $key=&unescape($_); |
my $key=&unescape($_); |
if ($key=~/$regexp/) { |
if ($key=~/$regexp/) { |
if (defined($cnt{$1})) { $cnt{$1}++; } else { $cnt{$1}=1; } |
my $ctype=$1; |
unless ($listitems{$1} eq 'app') { |
if (defined($cnt{$ctype})) { |
if (defined($sum{$1})) { |
$cnt{$ctype}++; |
$sum{$1}+=$evaldata{$_}; |
} else { |
} else { |
$cnt{$ctype}=1; |
$sum{$1}=$evaldata{$_}; |
} |
|
unless ($listitems{$ctype} eq 'app') { |
|
if (defined($sum{$ctype})) { |
|
$sum{$ctype}+=$evaldata{$_}; |
|
} else { |
|
$sum{$ctype}=$evaldata{$_}; |
|
} |
|
} else { |
|
if (defined($sum{$ctype})) { |
|
if ($evaldata{$_}) { |
|
$sum{$ctype}.='<hr>'.$evaldata{$_}; |
} |
} |
} else { |
} else { |
if (defined($sum{$1})) { |
$sum{$ctype}=''.$evaldata{$_}; |
if ($evaldata{$_}) { |
} |
$sum{$1}.='<hr>'.$evaldata{$_}; |
} |
} |
if ($ctype ne 'count') { |
} else { |
$newevaldata{$_}=$evaldata{$_}; |
$sum{$1}=''.$evaldata{$_}; |
} |
} |
} |
} |
} |
} |
foreach (keys %cnt) { |
foreach (keys %cnt) { |
if ($listitems{$_} eq 'avg') { |
if ($listitems{$_} eq 'avg') { |
$returnhash{$_}=int(($sum{$_}/$cnt{$_})*100.0+0.5)/100.0; |
$returnhash{$_}=int(($sum{$_}/$cnt{$_})*100.0+0.5)/100.0; |
} elsif ($listitems{$_} eq 'cnt') { |
} elsif ($listitems{$_} eq 'cnt') { |
$returnhash{$_}=$cnt{$_}; |
$returnhash{$_}=$cnt{$_}; |
} else { |
} else { |
$returnhash{$_}=$sum{$_}; |
$returnhash{$_}=$sum{$_}; |
} |
} |
} |
} |
if ($returnhash{'count'}) { |
|
my $newkey=$$.'_'.time.'_searchcat___'.&escape($url).'___count'; |
|
$newevaldata{$newkey}=$returnhash{'count'}; |
} |
} |
untie(%evaldata); |
untie(%evaldata); |
|
untie(%newevaldata); |
} |
} |
return %returnhash; |
return %returnhash; |
} |
} |
Line 148 delete $perlvar{'lonReceipt'}; # remove
|
Line 164 delete $perlvar{'lonReceipt'}; # remove
|
# ------------------------------------- Only run if machine is a library server |
# ------------------------------------- Only run if machine is a library server |
exit unless $perlvar{'lonRole'} eq 'library'; |
exit unless $perlvar{'lonRole'} eq 'library'; |
|
|
|
# ---------------------------------------------------------- We are in business |
|
|
|
open(LOG,'>'.$perlvar{'lonDaemons'}.'/logs/searchcat.log'); |
|
print LOG '==== Searchcat Run '.localtime()."====\n\n"; |
my $dbh; |
my $dbh; |
# ------------------------------------- Make sure that database can be accessed |
# ------------------------------------- Make sure that database can be accessed |
{ |
{ |
unless ( |
unless ( |
$dbh = DBI->connect("DBI:mysql:loncapa","www",$perlvar{'lonSqlAccess'},{ RaiseError =>0,PrintError=>0}) |
$dbh = DBI->connect("DBI:mysql:loncapa","www",$perlvar{'lonSqlAccess'},{ RaiseError =>0,PrintError=>0}) |
) { |
) { |
print "Cannot connect to database!\n"; |
print LOG "Cannot connect to database!\n"; |
exit; |
exit; |
} |
} |
my $make_metadata_table = "CREATE TABLE IF NOT EXISTS metadata (". |
my $make_metadata_table = "CREATE TABLE IF NOT EXISTS metadata (". |
Line 179 my @homeusers=grep
|
Line 199 my @homeusers=grep
|
grep {!/^\.\.?$/} readdir(RESOURCES); |
grep {!/^\.\.?$/} readdir(RESOURCES); |
closedir RESOURCES; |
closedir RESOURCES; |
foreach my $user (@homeusers) { |
foreach my $user (@homeusers) { |
|
print LOG "\n=== User: ".$user."\n\n"; |
|
# Remove left-over db-files from potentially crashed searchcat run |
|
my $prodir=&propath($perlvar{'lonDefDomain'},$user); |
|
unlink($prodir.'/nohist_new_resevaldata.db'); |
|
# Use find.pl |
|
undef @metalist; |
|
@metalist=(); |
&find("$perlvar{'lonDocRoot'}/res/$perlvar{'lonDefDomain'}/$user"); |
&find("$perlvar{'lonDocRoot'}/res/$perlvar{'lonDefDomain'}/$user"); |
} |
|
|
|
# -- process each file to get metadata and put into search catalog SQL database |
# -- process each file to get metadata and put into search catalog SQL database |
# Also, check to see if already there. |
# Also, check to see if already there. |
# I could just delete (without searching first), but this works for now. |
# I could just delete (without searching first), but this works for now. |
foreach my $m (@metalist) { |
foreach my $m (@metalist) { |
|
print LOG "- ".$m."\n"; |
my $ref=&metadata($m); |
my $ref=&metadata($m); |
my $m2='/res/'.&declutter($m); |
my $m2='/res/'.&declutter($m); |
$m2=~s/\.meta$//; |
$m2=~s/\.meta$//; |
Line 220 foreach my $m (@metalist) {
|
Line 247 foreach my $m (@metalist) {
|
# Need to, perhaps, remove stale SQL database records. |
# Need to, perhaps, remove stale SQL database records. |
# ... not yet implemented |
# ... not yet implemented |
|
|
|
|
|
# -------------------------------------------------- Copy over the new db-files |
|
system('mv '.$prodir.'/nohist_new_resevaldata.db '. |
|
$prodir.'/nohist_resevaldata.db'); |
|
} |
# --------------------------------------------------- Close database connection |
# --------------------------------------------------- Close database connection |
$dbh->disconnect; |
$dbh->disconnect; |
|
print LOG "\n==== Searchcat completed ".localtime()." ====\n"; |
|
close(LOG); |
|
exit 0; |
|
# ============================================================================= |
|
|
# ---------------------------------------------------------------- Get metadata |
# ---------------------------------------------------------------- Get metadata |
# significantly altered from subroutine present in lonnet |
# significantly altered from subroutine present in lonnet |
Line 315 sub propath {
|
Line 351 sub propath {
|
# ---------------------------- convert 'time' format into a datetime sql format |
# ---------------------------- convert 'time' format into a datetime sql format |
sub sqltime { |
sub sqltime { |
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = |
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = |
localtime(@_[0]); |
localtime(&unsqltime(@_[0])); |
$mon++; $year+=1900; |
$mon++; $year+=1900; |
return "$year-$mon-$mday $hour:$min:$sec"; |
return "$year-$mon-$mday $hour:$min:$sec"; |
} |
} |
|
|
|
sub maketime { |
|
my %th=@_; |
|
return POSIX::mktime( |
|
($th{'seconds'},$th{'minutes'},$th{'hours'}, |
|
$th{'day'},$th{'month'}-1,$th{'year'}-1900,0,0,$th{'dlsav'})); |
|
} |
|
|
|
|
|
######################################### |
|
# |
|
# Retro-fixing of un-backward-compatible time format |
|
|
|
sub unsqltime { |
|
my $timestamp=shift; |
|
if ($timestamp=~/^(\d+)\-(\d+)\-(\d+)\s+(\d+)\:(\d+)\:(\d+)$/) { |
|
$timestamp=&maketime( |
|
'year'=>$1,'month'=>$2,'day'=>$3, |
|
'hours'=>$4,'minutes'=>$5,'seconds'=>$6); |
|
} |
|
return $timestamp; |
|
} |
|
|