--- loncom/interface/Attic/lonspreadsheet.pm 2001/01/20 12:29:37 1.35
+++ loncom/interface/Attic/lonspreadsheet.pm 2001/01/22 22:54:16 1.38
@@ -3,10 +3,10 @@
#
# 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 Gerd Kortemeyer
+# 01/01/01,02/01,03/01,19/01,20/01,22/01 Gerd Kortemeyer
package Apache::lonspreadsheet;
-
+
use strict;
use Safe;
use Safe::Hole;
@@ -40,11 +40,30 @@ my %parmhash;
my $includedir;
my $tmpdir;
+
+sub mdeb {
+ my $msg=shift;
+ my $mem='';
+ {
+ my $mfh=Apache::File->new('/proc/'.$$.'/status');
+ my $line;
+ while ($line=<$mfh>) {
+ my ($name,$value)=split(/\:/,$line);
+ if ($name eq 'VmSize') { $mem=$value; }
+ }
+ $mfh->close();
+ }
+ print $msg.$mem."
\n";
+}
+
+
+
+
# =============================================================================
# ===================================== Implements an instance of a spreadsheet
sub initsheet {
- my $safeeval = new Safe;
+ my $safeeval = new Safe(shift);
my $safehole = new Safe::Hole;
$safeeval->permit("entereval");
$safeeval->permit(":base_math");
@@ -61,11 +80,11 @@ sub initsheet {
# c: preloaded constants (A-column)
# rl: row label
-%v=();
-%t=();
-%f=();
-%c=();
-%rl=();
+undef %v;
+undef %t;
+undef %f;
+undef %c;
+undef %rl;
$maxrow=0;
$sheettype='';
@@ -309,6 +328,7 @@ sub sett {
$t{$lb}=~s/\#/$trow/g;
$t{$lb}=~s/\.\.+/\,/g;
$t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
+ $t{$lb}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g;
}
}
} keys %f;
@@ -325,12 +345,14 @@ sub sett {
$t{$_}=$f{$_};
$t{$_}=~s/\.\.+/\,/g;
$t{$_}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
+ $t{$_}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g;
}
}
} keys %f;
$t{'A0'}=$f{'A0'};
$t{'A0'}=~s/\.\.+/\,/g;
$t{'A0'}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
+ $t{'A0'}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g;
}
sub calc {
@@ -779,7 +801,7 @@ sub readsheet {
sub makenewsheet {
my ($uname,$udom,$stype,$usymb)=@_;
- my $safeeval=initsheet();
+ my $safeeval=initsheet($stype);
$safeeval->reval(
'$uname="'.$uname.
'";$udom="'.$udom.
@@ -1083,8 +1105,8 @@ sub updatestudentassesssheet {
&Apache::lonnet::declutter($bighash{'map_id_'.$mapid}).
'___'.$resid.'___'.
&Apache::lonnet::declutter($srcf);
- $allassess{$symb}=$bighash{'title_'.$id};
-
+ $allassess{$symb}=
+ ''.$bighash{'title_'.$id}.'';
if ($stype eq 'assesscalc') {
map {
if (($_=~/^stores\_(.*)/) || ($_=~/^parameter\_(.*)/)) {
@@ -1116,8 +1138,6 @@ sub updatestudentassesssheet {
}
$updatedata{$ENV{'request.course.fn'}.'_'.$stype}=
join('___;___',%current);
- undef %allkeys;
- undef %allassess;
} else {
return 'Could not access course data';
}
@@ -1171,13 +1191,14 @@ sub loadstudent {
my $safeeval=shift;
my %c=();
my %f=&getformulas($safeeval);
+ my @assessdata=();
map {
if ($_=~/^A(\d+)/) {
my $row=$1;
unless ($f{$_}=~/^\!/) {
- my @assessdata=&exportsheet(&getuname($safeeval),
- &getudom($safeeval),
- 'assesscalc',$f{$_});
+ @assessdata=&exportsheet(&getuname($safeeval),
+ &getudom($safeeval),
+ 'assesscalc',$f{$_});
my $index=0;
map {
if ($assessdata[$index]) {
@@ -1199,19 +1220,33 @@ sub loadstudent {
# --------------------------------------------------- Load data for one student
sub loadcourse {
- my $safeeval=shift;
+ my ($safeeval,$r)=@_;
my %c=();
my %f=&getformulas($safeeval);
+ my $total=0;
+ map {
+ if ($_=~/^A(\d+)/) {
+ unless ($f{$_}=~/^\!/) { $total++; }
+ }
+ } keys %f;
+ my $now=0;
+ my $since=time;
+ $r->print('
'.
+ "
\n");
+ $r->rflush();
map {
if ($_=~/^A(\d+)/) {
my $row=$1;
- unless (($f{$_}=~/^\!/)
-|| ($row>200))
- {
- my @studentdata=&exportsheet(&getuname($safeeval),
- &getudom($safeeval),
+ unless ($f{$_}=~/^\!/) {
+ my @studentdata=&exportsheet(split(/\:/,$f{$_}),
'studentcalc');
- undef %userrdatas;
+ undef %userrdatas;
+ $now++;
+ $r->print(''."
\n");
+ $r->rflush();
+
my $index=0;
map {
if ($studentdata[$index]) {
@@ -1228,6 +1263,9 @@ sub loadcourse {
} keys %f;
&setformulas($safeeval,%f);
&setconstants($safeeval,%c);
+ $r->print(''.
+ "
\n");
+ $r->rflush();
}
# ------------------------------------------------ Load data for one assessment
@@ -1252,6 +1290,7 @@ sub loadassessment {
"restore:$udom:$uname:".
&Apache::lonnet::escape($namespace).":".
&Apache::lonnet::escape($symb),$uhome);
+
my %returnhash=();
map {
my ($name,$value)=split(/\=/,$_);
@@ -1264,6 +1303,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
@@ -1287,7 +1327,7 @@ sub loadassessment {
my ($name,$value)=split(/\=/,$_);
$courseopt{$userprefix.&Apache::lonnet::unescape($name)}=
&Apache::lonnet::unescape($value);
- } split(/\&/,$courserdatas{$ENV{'request.course.id'}});
+ } split(/\&/,$courserdatas{$cid});
# --------------------------------------------------- Get userdata (if present)
unless
((time-$userrdatas{$uname.'___'.$udom.'.last_cache'})<240) {
@@ -1304,7 +1344,6 @@ sub loadassessment {
&Apache::lonnet::unescape($value);
} split(/\&/,$userrdatas{$uname.'___'.$udom});
}
-
# ----------------- now courseopt, useropt initialized for this user and course
# (used by parmval)
@@ -1323,6 +1362,7 @@ sub loadassessment {
$key=~s/^stores\_/resource\./;
$key=~s/\_/\./;
$c{$_}=$returnhash{$key};
+ $c{$key}=$returnhash{$key};
}
}
}
@@ -1376,11 +1416,11 @@ sub updatesheet {
# Import the data for rows
#
-sub loadrows() {
- my $safeeval=shift;
+sub loadrows {
+ my ($safeeval,$r)=@_;
my $stype=&gettype($safeeval);
if ($stype eq 'classcalc') {
- &loadcourse($safeeval);
+ &loadcourse($safeeval,$r);
} elsif ($stype eq 'studentcalc') {
&loadstudent($safeeval);
} else {
@@ -1394,15 +1434,14 @@ sub loadrows() {
#
sub exportsheet {
+
my ($uname,$udom,$stype,$usymb,$fn)=@_;
my $thissheet=&makenewsheet($uname,$udom,$stype,$usymb);
&readsheet($thissheet,$fn);
&updatesheet($thissheet);
&loadrows($thissheet);
&calcsheet($thissheet);
- my @returnthis=&exportdata($thissheet);
- undef $thissheet;
- return @returnthis;
+ return &exportdata($thissheet);
}
# ================================================================ Main handler
@@ -1576,9 +1615,18 @@ ENDSCRIPT
# ----------------------------------------------------- Update sheet, load rows
+ $r->print("Loaded sheet, updating rows ...
\n");
+ $r->rflush();
+
&updatesheet($asheet);
- &loadrows($asheet);
+ $r->print("Updated rows, loading row data ...
\n");
+ $r->rflush();
+
+ &loadrows($asheet,$r);
+
+ $r->print("Loaded row data, calculating sheet ...
\n");
+ $r->rflush();
my $calcoutput=&calcsheet($asheet);
$r->print('