--- loncom/interface/Attic/lonspreadsheet.pm 2001/01/22 22:54:16 1.38 +++ loncom/interface/Attic/lonspreadsheet.pm 2001/03/05 21:26:29 1.39 @@ -3,7 +3,8 @@ # # 11/11,11/15,11/27,12/04,12/05,12/06,12/07, # 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30, -# 01/01/01,02/01,03/01,19/01,20/01,22/01 Gerd Kortemeyer +# 01/01/01,02/01,03/01,19/01,20/01,22/01, +# 03/05 Gerd Kortemeyer package Apache::lonspreadsheet; @@ -17,6 +18,13 @@ use GDBM_File; use HTML::TokeParser; # +# Cache for stores of an individual user +# + +my $cachedassess; +my %cachedstores; + +# # These cache hashes need to be independent of user, resource and course # (user and course can/should be in the keys) # @@ -1191,6 +1199,21 @@ sub loadstudent { my $safeeval=shift; my %c=(); my %f=&getformulas($safeeval); + $cachedassess=&getuname($safeeval).':'.&getudom($safeeval); + %cachedstores=(); + { + my $reply=&Apache::lonnet::reply('dump:'.&getudom($safeeval).':'. + &getuname($safeeval).':'. + &getcid($safeeval), + &getuhome($safeeval)); + unless ($reply=~/^error\:/) { + map { + my ($name,$value)=split(/\=/,$_); + $cachedstores{&Apache::lonnet::unescape($name)}= + &Apache::lonnet::unescape($value); + } split(/\&/,$reply); + } + } my @assessdata=(); map { if ($_=~/^A(\d+)/) { @@ -1213,6 +1236,8 @@ sub loadstudent { } } } keys %f; + $cachedassess=''; + undef %cachedstores; &setformulas($safeeval,%f); &setconstants($safeeval,%c); } @@ -1231,8 +1256,17 @@ sub loadcourse { } keys %f; my $now=0; my $since=time; - $r->print('
'. - "
\n"); + $r->print(< + popwin=open('','popwin','width=400,height=100'); + popwin.document.writeln(''+ + '

Spreadsheet Calculation Progress

'+ + '
'+ + '
'+ + ''); + popwin.document.close; + +ENDPOP $r->rflush(); map { if ($_=~/^A(\d+)/) { @@ -1242,9 +1276,9 @@ sub loadcourse { 'studentcalc'); undef %userrdatas; $now++; - $r->print(''."
\n"); + ' secs remaining";'); $r->rflush(); my $index=0; @@ -1263,8 +1297,7 @@ sub loadcourse { } keys %f; &setformulas($safeeval,%f); &setconstants($safeeval,%c); - $r->print(''. - "
\n
"); + $r->print(''); $r->rflush(); } @@ -1286,12 +1319,31 @@ sub loadassessment { unless ($namespace=$cid) { return ''; } # ----------------------------------------------------------- Get stored values + + my %returnhash=(); + + if ($cachedassess eq $uname.':'.$udom) { +# +# get data out of the dumped stores +# + + my $version=$cachedstores{'version:'.$symb}; + my $scope; + for ($scope=1;$scope<=$version;$scope++) { + map { + $returnhash{$_}=$cachedstores{$scope.':'.$symb.':'.$_}; + } split(/\:/,$cachedstores{$scope.':keys:'.$symb}); + } + + } else { +# +# restore individual +# + my $answer=&Apache::lonnet::reply( "restore:$udom:$uname:". &Apache::lonnet::escape($namespace).":". &Apache::lonnet::escape($symb),$uhome); - - my %returnhash=(); map { my ($name,$value)=split(/\=/,$_); $returnhash{&Apache::lonnet::unescape($name)}= @@ -1303,7 +1355,7 @@ sub loadassessment { $returnhash{$_}=$returnhash{$version.':'.$_}; } split(/\:/,$returnhash{$version.':keys'}); } - + } # ----------------------------- returnhash now has all stores for this resource # ---------------------------- initialize coursedata and userdata for this user @@ -1634,10 +1686,6 @@ ENDSCRIPT &outsheet($r,$asheet); $r->print(''); -# --------------------------------- We know this leaks, so terminate this child - - $r->child_terminate(); - # ------------------------------------------------------------------------ Done } else { # ----------------------------- Not in a course, or not allowed to modify parms