--- rat/lonuserstate.pm 2005/03/15 17:21:42 1.85 +++ rat/lonuserstate.pm 2005/04/07 06:56:27 1.89 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Construct and maintain state and binary representation of course for user # -# $Id: lonuserstate.pm,v 1.85 2005/03/15 17:21:42 albertel Exp $ +# $Id: lonuserstate.pm,v 1.89 2005/04/07 06:56:27 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -32,9 +32,8 @@ package Apache::lonuserstate; # ------------------------------------------------- modules used by this module use strict; use Apache::Constants qw(:common :http); -use Apache::File; use HTML::TokeParser; -use Apache::lonnet(); +use Apache::lonnet; use Apache::loncommon(); use GDBM_File; use Apache::lonmsg; @@ -413,8 +412,8 @@ sub accinit { $acchash{'acc.cond.'.$short.'.'.$condcounter}=$expr; } } elsif ($_=~/^param_(\d+)\.(\d+)/) { - my $prefix=&Apache::lonnet::declutter($hash{'map_id_'.$1}). - '___'.$2.'___'.&Apache::lonnet::declutter($hash{'src_'.$1.'.'.$2}); + my $prefix=&Apache::lonnet::encode_symb($hash{'map_id_'.$1},$2, + $hash{'src_'.$1.'.'.$2}); foreach (split(/\&/,$hash{$_})) { my ($typename,$value)=split(/\=/,$_); my ($type,$name)=split(/\:/,$typename); @@ -504,11 +503,10 @@ sub hiddenurls { $hash{'randomout_'.$currentrids[$k]}=1; my ($mapid,$resid)=split(/\./,$currentrids[$k]); $randomoutentry.='&'. - &Apache::lonnet::symbclean( - &Apache::lonnet::declutter($hash{'map_id_'.$mapid}). - '___'.$resid.'___'. - &Apache::lonnet::declutter($hash{'src_'.$currentrids[$k]}) - ).'&'; + &Apache::lonnet::encode_symb($hash{'map_id_'.$mapid}, + $resid, + $hash{'src_'.$currentrids[$k]} + ).'&'; } } } @@ -517,11 +515,8 @@ sub hiddenurls { $hash{'randomout_'.$rid}=1; my ($mapid,$resid)=split(/\./,$rid); $randomoutentry.='&'. - &Apache::lonnet::symbclean( - &Apache::lonnet::declutter($hash{'map_id_'.$mapid}). - '___'.$resid.'___'. - &Apache::lonnet::declutter($hash{'src_'.$rid}) - ).'&'; + &Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},$resid, + $hash{'src_'.$rid}).'&'; } # --------------------------------------- append randomout entry to environment if ($randomoutentry) { @@ -544,8 +539,8 @@ sub readmap { return 'No course data available.'; } @cond=('true:normal'); - unlink($fn.'.db'); - unlink($fn.'_symb.db'); + #unlink($fn.'.db'); + #unlink($fn.'_symb.db'); unlink($fn.'.state'); unlink($fn.'parms.db'); undef %randompick; @@ -593,7 +588,7 @@ sub readmap { # ---------------------------------------------------- Store away initial state { my $cfh; - if ($cfh=Apache::File->new(">$fn.state")) { + if (open($cfh,">$fn.state")) { print $cfh join("\n",@cond); } else { &Apache::lonnet::logthis("WARNING: ". @@ -601,14 +596,39 @@ sub readmap { } } } else { + # if we are here it is likely because we are already trying to + # initialize the course in another child, busy wait trying to + # tie the hashes for the next 90 seconds, if we succeed forward + # them on to navmaps, if we fail, throw up the Could not init + # course screen + untie(%hash); + untie(%parmhash); &Apache::lonnet::logthis("WARNING: ". "Could not tie coursemap $fn for $uri."); + my $i=0; + while($i<90) { + $i++; + sleep(1); + if ((tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640))) { + if (tie(%parmhash,'GDBM_File',$fn.'_parms.db',&GDBM_READER(),0640)) { + $retfurl='/adm/navmaps'; + &Apache::lonnet::appenv("request.course.id" => $short, + "request.course.fn" => $fn, + "request.course.uri" => $uri); + untie(%hash); + untie(%parmhash); + last; + } + } + untie(%hash); + untie(%parmhash); + } } - &Apache::lonmsg::author_res_msg($ENV{'request.course.uri'},$errtext); + &Apache::lonmsg::author_res_msg($env{'request.course.uri'},$errtext); # ------------------------------------------------- Check for critical messages - my @what=&Apache::lonnet::dump('critical',$ENV{'user.domain'}, - $ENV{'user.name'}); + my @what=&Apache::lonnet::dump('critical',$env{'user.domain'}, + $env{'user.name'}); if ($what[0]) { if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) { $retfurl='/adm/email?critical=display'; @@ -620,7 +640,7 @@ sub readmap { # ------------------------------------------------------- Evaluate state string sub evalstate { - my $fn=$ENV{'request.course.fn'}.'.state'; + my $fn=$env{'request.course.fn'}.'.state'; my $state=''; if (-e $fn) { my @conditions=(); @@ -652,7 +672,7 @@ sub evalstate { } } } - &Apache::lonnet::appenv('user.state.'.$ENV{'request.course.id'} => $state); + &Apache::lonnet::appenv('user.state.'.$env{'request.course.id'} => $state); return $state; }