--- loncom/metadata_database/searchcat.pl 2003/12/23 15:47:26 1.44 +++ loncom/metadata_database/searchcat.pl 2003/12/24 19:58:37 1.45 @@ -2,7 +2,7 @@ # The LearningOnline Network # searchcat.pl "Search Catalog" batch script # -# $Id: searchcat.pl,v 1.44 2003/12/23 15:47:26 www Exp $ +# $Id: searchcat.pl,v 1.45 2003/12/24 19:58:37 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -65,6 +65,8 @@ and correct user experience. =cut +use strict; + use lib '/home/httpd/lib/perl/'; use LONCAPA::Configuration; @@ -74,11 +76,14 @@ use DBI; use GDBM_File; use POSIX qw(strftime mktime); +require "find.pl"; + my @metalist; -$simplestatus=''; +my $simplestatus=''; my %countext=(); +# ----------------------------------------------------- write out simple status sub writesimple { open(SMP,'>/home/httpd/html/lon-status/mysql.txt'); print SMP $simplestatus."\n"; @@ -94,6 +99,7 @@ sub writecount { close(RSMP); } +# -------------------------------------- counts files with different extensions sub count { my $file=shift; $file=~/\.(\w+)$/; @@ -120,7 +126,6 @@ sub escape { return $str; } - # ------------------------------------------- Code to evaluate dynamic metadata sub dynamicmeta { @@ -129,8 +134,9 @@ sub dynamicmeta { my %returnhash=(); my ($adomain,$aauthor)=($url=~/^(\w+)\/(\w+)\//); my $prodir=&propath($adomain,$aauthor); + # Get metadata except counts - if (tie(%evaldata,'GDBM_File', + if (tie(my %evaldata,'GDBM_File', $prodir.'/nohist_resevaldata.db',&GDBM_READER(),0640)) { my %sum=(); my %cnt=(); @@ -155,65 +161,56 @@ sub dynamicmeta { $regexp=~s/(\W)/\\$1/g; $regexp='___'.$regexp.'___([a-z]+)$'; while (my ($esckey,$value)=each %evaldata) { - $key=&unescape($esckey); + my $key=&unescape($esckey); if ($key=~/$regexp/) { - my ($item,$purl,$cat)=split(/___/,$_); + my ($item,$purl,$cat)=split(/___/,$key); if (defined($cnt{$cat})) { $cnt{$cat}++; } else { $cnt{$cat}=1; } unless ($listitems{$cat} eq 'app') { if (defined($sum{$cat})) { - $sum{$cat}+=$evaldata{$_}; + $sum{$cat}+=$evaldata{$esckey}; $concat{$cat}.=','.$item; } else { - $sum{$cat}=$evaldata{$_}; + $sum{$cat}=$evaldata{$esckey}; $concat{$cat}=$item; } } else { if (defined($sum{$cat})) { - if ($evaldata{$_}) { - $sum{$cat}.='
'.$evaldata{$_}; + if ($evaldata{$esckey}=~/\w/) { + $sum{$cat}.='
'.$evaldata{$esckey}; } } else { - $sum{$cat}=''.$evaldata{$_}; + $sum{$cat}=''.$evaldata{$esckey}; } } } } untie(%evaldata); - } -# construct the return hash for non-count data - my %returnhash=(); - while ($_=each(%cnt)) { - if ($listitems{$_} eq 'avg') { - $returnhash{$_}=int(($sum{$_}/$cnt{$_})*100.0+0.5)/100.0; - } elsif ($listitems{$_} eq 'cnt') { - $returnhash{$_}=$cnt{$_}; - } else { - $returnhash{$_}=$sum{$_}; +# transfer gathered data to returnhash, calculate averages where applicable + while (my $cat=each(%cnt)) { + if ($listitems{$cat} eq 'avg') { + $returnhash{$cat}=int(($sum{$cat}/$cnt{$cat})*100.0+0.5)/100.0; + } elsif ($listitems{$cat} eq 'cnt') { + $returnhash{$cat}=$cnt{$cat}; + } else { + $returnhash{$cat}=$sum{$cat}; + } + $returnhash{$cat.'_list'}=$concat{$cat}; } - $returnhash{$_.'_list'}=$concat{$_}; } # get count - if (tie(%evaldata,'GDBM_File', + if (tie(my %evaldata,'GDBM_File', $prodir.'/nohist_accesscount.db',&GDBM_READER(),0640)) { - if (! exists($evaldata{$uri})) { + my $escurl=&escape($url); + if (! exists($evaldata{$escurl})) { $returnhash{'count'}='Not Available'; } else { - $returnhash{'count'}=$evaldata{$uri}; + $returnhash{'count'}=$evaldata{$escurl}; } untie %evaldata; } return %returnhash; } -# ----------------- Code to enable 'find' subroutine listing of the .meta files -require "find.pl"; -sub wanted { - (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && - -f _ && - /^.*\.meta$/ && !/^.+\.\d+\.[^\.]+\.meta$/ && - push(@metalist,"$dir/$_"); -} - # --------------- Read loncapa_apache.conf and loncapa.conf and get variables my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf'); my %perlvar=%{$perlvarref}; @@ -227,8 +224,8 @@ exit unless $perlvar{'lonRole'} eq 'libr my $wwwid=getpwnam('www'); if ($wwwid!=$<) { - $emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}"; - $subj="LON: $perlvar{'lonHostID'} User ID mismatch"; + my $emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}"; + my $subj="LON: $perlvar{'lonHostID'} User ID mismatch"; system("echo 'User ID mismatch. searchcat.pl must be run as user www.' |\ mailto $emailto -s '$subj' > /dev/null"); exit 1; @@ -313,9 +310,9 @@ foreach my $user (@homeusers) { my $ref=&metadata($m); my $m2='/res/'.&declutter($m); $m2=~s/\.meta$//; - &dynamicmeta($m2); if ($ref->{'obsolete'}) { print LOG "obsolete\n"; next; } if ($ref->{'copyright'} eq 'private') { print LOG "private\n"; next; } + &dynamicmeta($m2); &count($m2); $delete_sth->execute($m2); $insert_sth->execute($ref->{'title'}, @@ -473,3 +470,13 @@ sub unsqltime { return $timestamp; } +# ----------------- Code to enable 'find' subroutine listing of the .meta files + +no strict "vars"; + +sub wanted { + (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && + -f _ && + /^.*\.meta$/ && !/^.+\.\d+\.[^\.]+\.meta$/ && + push(@metalist,"$dir/$_"); +}