version 1.448, 2003/11/12 19:51:43
|
version 1.454, 2003/12/05 00:28:32
|
Line 51 use Storable qw(lock_store lock_nstore l
|
Line 51 use Storable qw(lock_store lock_nstore l
|
use Time::HiRes(); |
use Time::HiRes(); |
my $readit; |
my $readit; |
|
|
|
=pod |
|
|
|
=head1 Package Variables |
|
|
|
These are largely undocumented, so if you decipher one please note it here. |
|
|
|
=over 4 |
|
|
|
=item $processmarker |
|
|
|
Contains the time this process was started and this servers host id. |
|
|
|
=item $dumpcount |
|
|
|
Counts the number of times a message log flush has been attempted (regardless |
|
of success) by this process. Used as part of the filename when messages are |
|
delayed. |
|
|
|
=back |
|
|
|
=cut |
|
|
|
|
# --------------------------------------------------------------------- Logging |
# --------------------------------------------------------------------- Logging |
|
|
sub logtouch { |
sub logtouch { |
Line 825 sub getsection {
|
Line 848 sub getsection {
|
return '-1'; |
return '-1'; |
} |
} |
|
|
|
|
|
my $disk_caching_disabled=1; |
|
|
sub devalidate_cache { |
sub devalidate_cache { |
my ($cache,$id,$name) = @_; |
my ($cache,$id,$name) = @_; |
delete $$cache{$id.'.time'}; |
delete $$cache{$id.'.time'}; |
delete $$cache{$id}; |
delete $$cache{$id}; |
|
if ($disk_caching_disabled) { return; } |
my $filename=$perlvar{'lonDaemons'}.'/tmp/lonnet_internal_cache_'.$name.".db"; |
my $filename=$perlvar{'lonDaemons'}.'/tmp/lonnet_internal_cache_'.$name.".db"; |
open(DB,"$filename.lock"); |
open(DB,"$filename.lock"); |
flock(DB,LOCK_EX); |
flock(DB,LOCK_EX); |
Line 884 sub do_cache {
|
Line 911 sub do_cache {
|
|
|
sub save_cache_item { |
sub save_cache_item { |
my ($cache,$name,$id)=@_; |
my ($cache,$name,$id)=@_; |
|
if ($disk_caching_disabled) { return; } |
my $starttime=&Time::HiRes::time(); |
my $starttime=&Time::HiRes::time(); |
# &logthis("Saving :$name:$id"); |
# &logthis("Saving :$name:$id"); |
my %hash; |
my %hash; |
Line 913 EVALBLOCK
|
Line 941 EVALBLOCK
|
|
|
sub load_cache_item { |
sub load_cache_item { |
my ($cache,$name,$id)=@_; |
my ($cache,$name,$id)=@_; |
|
if ($disk_caching_disabled) { return; } |
my $starttime=&Time::HiRes::time(); |
my $starttime=&Time::HiRes::time(); |
# &logthis("Before Loading $name for $id size is ".scalar(%$cache)); |
# &logthis("Before Loading $name for $id size is ".scalar(%$cache)); |
my %hash; |
my %hash; |
Line 1130 sub ssi_body {
|
Line 1159 sub ssi_body {
|
my ($filelink,%form)=@_; |
my ($filelink,%form)=@_; |
my $output=($filelink=~/^http\:/?&externalssi($filelink): |
my $output=($filelink=~/^http\:/?&externalssi($filelink): |
&ssi($filelink,%form)); |
&ssi($filelink,%form)); |
$output=~s/^.*\<body[^\>]*\>//si; |
$output=~s/^.*?\<body[^\>]*\>//si; |
$output=~s/\<\/body\s*\>.*$//si; |
$output=~s/(.*)\<\/body\s*\>.*?$/$1/si; |
$output=~ |
$output=~ |
s/\/\/ BEGIN LON\-CAPA Internal.+\/\/ END LON\-CAPA Internal\s//gs; |
s/\/\/ BEGIN LON\-CAPA Internal.+\/\/ END LON\-CAPA Internal\s//gs; |
return $output; |
return $output; |
Line 1311 sub flushcourselogs {
|
Line 1340 sub flushcourselogs {
|
# File accesses |
# File accesses |
# Writes to the dynamic metadata of resources to get hit counts, etc. |
# Writes to the dynamic metadata of resources to get hit counts, etc. |
# |
# |
foreach (keys %accesshash) { |
foreach my $entry (keys(%accesshash)) { |
my $entry=$_; |
my ($dom,$name,undef,$type)=($entry=~m:___(\w+)/(\w+)/(.*)___(\w+)$:); |
$entry=~/\_\_\_(\w+)\/(\w+)\/(.*)\_\_\_(\w+)$/; |
if ($type eq 'count'){ |
my %temphash=($entry => $accesshash{$entry}); |
my $value = $accesshash{$entry}; |
if (&Apache::lonnet::put('nohist_resevaldata',\%temphash,$1,$2) eq 'ok') { |
my (undef,$url,undef) = ($entry =~ /^(.*)___(.*)___count$/); |
delete $accesshash{$entry}; |
my %temphash=($url => $value); |
|
my $result = &inc('nohist_accesscount',\%temphash,$dom,$name); |
|
if ($result eq 'ok') { |
|
delete $accesshash{$entry}; |
|
} elsif ($result eq 'unknown_cmd') { |
|
# Target server has old code running on it. |
|
my %temphash=($entry => $value); |
|
if (&put('nohist_resevaldata',\%temphash,$dom,$name) eq 'ok') { |
|
delete $accesshash{$entry}; |
|
} |
|
} |
|
} else { |
|
my %temphash=($entry => $accesshash{$entry}); |
|
if (&put('nohist_resevaldata',\%temphash,$dom,$name) eq 'ok') { |
|
delete $accesshash{$entry}; |
|
} |
} |
} |
} |
} |
# |
# |
Line 1353 sub courselog {
|
Line 1397 sub courselog {
|
} else { |
} else { |
$courselogs{$ENV{'request.course.id'}}.=$what; |
$courselogs{$ENV{'request.course.id'}}.=$what; |
} |
} |
if (length($courselogs{$ENV{'request.course.id'}})>4048) { |
# if (length($courselogs{$ENV{'request.course.id'}})>4048) { |
|
if (length($courselogs{$ENV{'request.course.id'}})>48) { |
&flushcourselogs(); |
&flushcourselogs(); |
} |
} |
} |
} |
Line 1378 sub countacc {
|
Line 1423 sub countacc {
|
unless ($ENV{'request.course.id'}) { return ''; } |
unless ($ENV{'request.course.id'}) { return ''; } |
$accesshash{$ENV{'request.course.id'}.'___'.$url.'___course'}=1; |
$accesshash{$ENV{'request.course.id'}.'___'.$url.'___course'}=1; |
my $key=$$.$processmarker.'_'.$dumpcount.'___'.$url.'___count'; |
my $key=$$.$processmarker.'_'.$dumpcount.'___'.$url.'___count'; |
if (defined($accesshash{$key})) { |
$accesshash{$key}++; |
$accesshash{$key}++; |
|
} else { |
|
$accesshash{$key}=1; |
|
} |
|
} |
} |
|
|
sub linklog { |
sub linklog { |
Line 2352 sub convert_dump_to_currentdump{
|
Line 2393 sub convert_dump_to_currentdump{
|
return \%returnhash; |
return \%returnhash; |
} |
} |
|
|
|
# --------------------------------------------------------------- inc interface |
|
|
|
sub inc { |
|
my ($namespace,$store,$udomain,$uname) = @_; |
|
if (!$udomain) { $udomain=$ENV{'user.domain'}; } |
|
if (!$uname) { $uname=$ENV{'user.name'}; } |
|
my $uhome=&homeserver($uname,$udomain); |
|
my $items=''; |
|
if (! ref($store)) { |
|
# got a single value, so use that instead |
|
$items = &escape($store).'=&'; |
|
} elsif (ref($store) eq 'SCALAR') { |
|
$items = &escape($$store).'=&'; |
|
} elsif (ref($store) eq 'ARRAY') { |
|
$items = join('=&',map {&escape($_);} @{$store}); |
|
} elsif (ref($store) eq 'HASH') { |
|
while (my($key,$value) = each(%{$store})) { |
|
$items.= &escape($key).'='.&escape($value).'&'; |
|
} |
|
} |
|
$items=~s/\&$//; |
|
return &reply("inc:$udomain:$uname:$namespace:$items",$uhome); |
|
} |
|
|
# --------------------------------------------------------------- put interface |
# --------------------------------------------------------------- put interface |
|
|
sub put { |
sub put { |
Line 3629 sub EXT {
|
Line 3694 sub EXT {
|
my $hashid="$udom:$uname"; |
my $hashid="$udom:$uname"; |
my ($result,$cached)=&is_cached(\%userresdatacache,$hashid, |
my ($result,$cached)=&is_cached(\%userresdatacache,$hashid, |
'userres'); |
'userres'); |
if (!defined($cached)) { |
if (!defined($cached)) { |
my %resourcedata=&get('resourcedata', |
my %resourcedata=&dump('resourcedata',$udom,$uname); |
[$courselevelr,$courselevelm, |
|
$courselevel],$udom,$uname); |
|
$result=\%resourcedata; |
$result=\%resourcedata; |
&do_cache(\%userresdatacache,$hashid,$result,'userres'); |
&do_cache(\%userresdatacache,$hashid,$result,'userres'); |
} |
} |
Line 3781 sub metadata {
|
Line 3844 sub metadata {
|
# |
# |
# Is this a recursive call for a library? |
# Is this a recursive call for a library? |
# |
# |
my %lcmetacache; |
if (! exists($metacache{$uri})) { |
|
$metacache{$uri}={}; |
|
} |
if ($liburi) { |
if ($liburi) { |
$liburi=&declutter($liburi); |
$liburi=&declutter($liburi); |
$filename=$liburi; |
$filename=$liburi; |
Line 3805 sub metadata {
|
Line 3870 sub metadata {
|
if (defined($token->[2]->{'id'})) { |
if (defined($token->[2]->{'id'})) { |
$keyroot.='_'.$token->[2]->{'id'}; |
$keyroot.='_'.$token->[2]->{'id'}; |
} |
} |
if ($lcmetacache{':packages'}) { |
if ($metacache{$uri}->{':packages'}) { |
$lcmetacache{':packages'}.=','.$package.$keyroot; |
$metacache{$uri}->{':packages'}.=','.$package.$keyroot; |
} else { |
} else { |
$lcmetacache{':packages'}=$package.$keyroot; |
$metacache{$uri}->{':packages'}=$package.$keyroot; |
} |
} |
foreach (keys %packagetab) { |
foreach (keys %packagetab) { |
my $part=$keyroot; |
my $part=$keyroot; |
Line 3830 sub metadata {
|
Line 3895 sub metadata {
|
if ($subp eq 'display') { |
if ($subp eq 'display') { |
$value.=' [Part: '.$part.']'; |
$value.=' [Part: '.$part.']'; |
} |
} |
$lcmetacache{':'.$unikey.'.part'}=$part; |
$metacache{$uri}->{':'.$unikey.'.part'}=$part; |
$metathesekeys{$unikey}=1; |
$metathesekeys{$unikey}=1; |
unless (defined($lcmetacache{':'.$unikey.'.'.$subp})) { |
unless (defined($metacache{$uri}->{':'.$unikey.'.'.$subp})) { |
$lcmetacache{':'.$unikey.'.'.$subp}=$value; |
$metacache{$uri}->{':'.$unikey.'.'.$subp}=$value; |
} |
} |
if (defined($lcmetacache{':'.$unikey.'.default'})) { |
if (defined($metacache{$uri}->{':'.$unikey.'.default'})) { |
$lcmetacache{':'.$unikey}= |
$metacache{$uri}->{':'.$unikey}= |
$lcmetacache{':'.$unikey.'.default'}; |
$metacache{$uri}->{':'.$unikey.'.default'}; |
} |
} |
} |
} |
} |
} |
Line 3870 sub metadata {
|
Line 3935 sub metadata {
|
foreach (sort(split(/\,/,&metadata($uri,'keys', |
foreach (sort(split(/\,/,&metadata($uri,'keys', |
$location,$unikey, |
$location,$unikey, |
$depthcount+1)))) { |
$depthcount+1)))) { |
|
$metacache{$uri}->{':'.$_}=$metacache{$uri}->{':'.$_}; |
$metathesekeys{$_}=1; |
$metathesekeys{$_}=1; |
} |
} |
} |
} |
Line 3880 sub metadata {
|
Line 3946 sub metadata {
|
} |
} |
$metathesekeys{$unikey}=1; |
$metathesekeys{$unikey}=1; |
foreach (@{$token->[3]}) { |
foreach (@{$token->[3]}) { |
$lcmetacache{':'.$unikey.'.'.$_}=$token->[2]->{$_}; |
$metacache{$uri}->{':'.$unikey.'.'.$_}=$token->[2]->{$_}; |
} |
} |
my $internaltext=&HTML::Entities::decode($parser->get_text('/'.$entry)); |
my $internaltext=&HTML::Entities::decode($parser->get_text('/'.$entry)); |
my $default=$lcmetacache{':'.$unikey.'.default'}; |
my $default=$metacache{$uri}->{':'.$unikey.'.default'}; |
if ( $internaltext =~ /^\s*$/ && $default !~ /^\s*$/) { |
if ( $internaltext =~ /^\s*$/ && $default !~ /^\s*$/) { |
# only ws inside the tag, and not in default, so use default |
# only ws inside the tag, and not in default, so use default |
# as value |
# as value |
$lcmetacache{':'.$unikey}=$default; |
$metacache{$uri}->{':'.$unikey}=$default; |
} else { |
} else { |
# either something interesting inside the tag or default |
# either something interesting inside the tag or default |
# uninteresting |
# uninteresting |
$lcmetacache{':'.$unikey}=$internaltext; |
$metacache{$uri}->{':'.$unikey}=$internaltext; |
} |
} |
# end of not-a-package not-a-library import |
# end of not-a-package not-a-library import |
} |
} |
Line 3901 sub metadata {
|
Line 3967 sub metadata {
|
} |
} |
} |
} |
# are there custom rights to evaluate |
# are there custom rights to evaluate |
if ($lcmetacache{':copyright'} eq 'custom') { |
if ($metacache{$uri}->{':copyright'} eq 'custom') { |
|
|
# |
# |
# Importing a rights file here |
# Importing a rights file here |
# |
# |
unless ($depthcount) { |
unless ($depthcount) { |
my $location=$lcmetacache{':customdistributionfile'}; |
my $location=$metacache{$uri}->{':customdistributionfile'}; |
my $dir=$filename; |
my $dir=$filename; |
$dir=~s|[^/]*$||; |
$dir=~s|[^/]*$||; |
$location=&filelocation($dir,$location); |
$location=&filelocation($dir,$location); |
foreach (sort(split(/\,/,&metadata($uri,'keys', |
foreach (sort(split(/\,/,&metadata($uri,'keys', |
$location,'_rights', |
$location,'_rights', |
$depthcount+1)))) { |
$depthcount+1)))) { |
|
$metacache{$uri}->{':'.$_}=$metacache{$uri}->{':'.$_}; |
$metathesekeys{$_}=1; |
$metathesekeys{$_}=1; |
} |
} |
} |
} |
} |
} |
$lcmetacache{':keys'}=join(',',keys %metathesekeys); |
$metacache{$uri}->{':keys'}=join(',',keys %metathesekeys); |
&metadata_generate_part0(\%metathesekeys,\%lcmetacache,$uri); |
&metadata_generate_part0(\%metathesekeys,$metacache{$uri},$uri); |
$lcmetacache{':allpossiblekeys'}=join(',',keys %metathesekeys); |
$metacache{$uri}->{':allpossiblekeys'}=join(',',keys %metathesekeys); |
&do_cache(\%metacache,$uri,\%lcmetacache,'meta'); |
&do_cache(\%metacache,$uri,$metacache{$uri},'meta'); |
# this is the end of "was not already recently cached |
# this is the end of "was not already recently cached |
} |
} |
return $metacache{$uri}->{':'.$what}; |
return $metacache{$uri}->{':'.$what}; |
Line 5210 dumps the complete (or key matching rege
|
Line 5277 dumps the complete (or key matching rege
|
|
|
=item * |
=item * |
|
|
|
inc($namespace,$store,$udom,$uname) : increments $store in $namespace. |
|
$store can be a scalar, an array reference, or if the amount to be |
|
incremented is > 1, a hash reference. |
|
|
|
($udom and $uname are optional) |
|
|
|
=item * |
|
|
put($namespace,$storehash,$udom,$uname) : stores hash in namesp |
put($namespace,$storehash,$udom,$uname) : stores hash in namesp |
($udom and $uname are optional) |
($udom and $uname are optional) |
|
|