--- loncom/interface/Attic/lonspreadsheet.pm 2001/01/03 14:27:30 1.33
+++ 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 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;
@@ -25,6 +25,7 @@ my %spreadsheets;
my %courserdatas;
my %userrdatas;
my %defaultsheets;
+my %updatedata;
#
# These global hashes are dependent on user, course and resource,
@@ -39,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");
@@ -60,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='';
@@ -308,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;
@@ -324,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 {
@@ -427,22 +450,22 @@ ENDDEFS
# ------------------------------------------------ Add or change formula values
sub setformulas {
- my ($safeeval,@f)=@_;
- $safeeval->reval('%f='."('".join("','",@f)."');");
+ my ($safeeval,%f)=@_;
+ %{$safeeval->varglob('f')}=%f;
}
# ------------------------------------------------ Add or change formula values
sub setconstants {
- my ($safeeval,@c)=@_;
- $safeeval->reval('%c='."('".join("','",@c)."');");
+ my ($safeeval,%c)=@_;
+ %{$safeeval->varglob('c')}=%c;
}
# ------------------------------------------------ Add or change formula values
sub setrowlabels {
- my ($safeeval,@rl)=@_;
- $safeeval->reval('%rl='."('".join("','",@rl)."');");
+ my ($safeeval,%rl)=@_;
+ %{$safeeval->varglob('rl')}=%rl;
}
# ------------------------------------------------------- Calculate spreadsheet
@@ -463,7 +486,7 @@ sub getvalues {
sub getformulas {
my $safeeval=shift;
- return $safeeval->reval('%f');
+ return %{$safeeval->varglob('f')};
}
# -------------------------------------------------------------------- Get type
@@ -778,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.
@@ -1060,6 +1083,9 @@ sub updateclasssheet {
sub updatestudentassesssheet {
my $safeeval=shift;
my %bighash;
+ my $stype=&gettype($safeeval);
+ my %current=();
+ unless ($updatedata{$ENV{'request.course.fn'}.'_'.$stype}) {
# -------------------------------------------------------------------- Tie hash
if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
&GDBM_READER,0640)) {
@@ -1068,8 +1094,6 @@ sub updatestudentassesssheet {
my %allkeys=();
my %allassess=();
- my $stype=&gettype($safeeval);
-
map {
if ($_=~/^src\_(\d+)\.(\d+)$/) {
my $mapid=$1;
@@ -1081,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\_(.*)/)) {
@@ -1106,17 +1130,26 @@ sub updatestudentassesssheet {
# %allkeys has a list of storage and parameter displays by unikey
# %allassess has a list of all resource displays by symb
#
-# -------------------- Find discrepancies between the course row table and this
-#
- my %f=&getformulas($safeeval);
- my $changed=0;
- my %current=();
if ($stype eq 'assesscalc') {
%current=%allkeys;
} elsif ($stype eq 'studentcalc') {
%current=%allassess;
}
+ $updatedata{$ENV{'request.course.fn'}.'_'.$stype}=
+ join('___;___',%current);
+ } else {
+ return 'Could not access course data';
+ }
+# ------------------------------------------------------ Get current from cache
+ } else {
+ %current=split(/\_\_\_\;\_\_\_/,
+ $updatedata{$ENV{'request.course.fn'}.'_'.$stype});
+ }
+# -------------------- Find discrepancies between the course row table and this
+#
+ my %f=&getformulas($safeeval);
+ my $changed=0;
my $maxrow=0;
my %existing=();
@@ -1142,15 +1175,14 @@ sub updatestudentassesssheet {
$f{'A'.$maxrow}=$_;
}
} keys %current;
-
+
if ($changed) { &setformulas($safeeval,%f); }
&setmaxrow($safeeval,$maxrow);
&setrowlabels($safeeval,%current);
-
- } else {
- return 'Could not access course data';
- }
+
+ undef %current;
+ undef %existing;
}
# ------------------------------------------------ Load data for one assessment
@@ -1159,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]) {
@@ -1187,21 +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]) {
@@ -1218,6 +1263,9 @@ sub loadcourse {
} keys %f;
&setformulas($safeeval,%f);
&setconstants($safeeval,%c);
+ $r->print(''.
+ "
\n");
+ $r->rflush();
}
# ------------------------------------------------ Load data for one assessment
@@ -1242,6 +1290,7 @@ sub loadassessment {
"restore:$udom:$uname:".
&Apache::lonnet::escape($namespace).":".
&Apache::lonnet::escape($symb),$uhome);
+
my %returnhash=();
map {
my ($name,$value)=split(/\=/,$_);
@@ -1254,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
@@ -1277,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) {
@@ -1294,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)
@@ -1313,6 +1362,7 @@ sub loadassessment {
$key=~s/^stores\_/resource\./;
$key=~s/\_/\./;
$c{$_}=$returnhash{$key};
+ $c{$key}=$returnhash{$key};
}
}
}
@@ -1366,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 {
@@ -1384,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
@@ -1566,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('