version 1.9, 2004/12/13 21:08:09
|
version 1.10, 2004/12/16 22:04:41
|
Line 47 use Apache::Constants qw(:common :http);
|
Line 47 use Apache::Constants qw(:common :http);
|
use Apache::lonnet(); |
use Apache::lonnet(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Time::HiRes; |
use Time::HiRes; |
|
use Time::Local; |
|
|
sub get_data { |
sub get_data { |
my ($r,$prog_state,$navmap,$mode) = @_; |
my ($r,$prog_state,$navmap,$mode) = @_; |
Line 55 sub get_data {
|
Line 56 sub get_data {
|
&Apache::lonhtmlcommon::Update_PrgWin |
&Apache::lonhtmlcommon::Update_PrgWin |
($r,$prog_state,&mt('Composing Query')); |
($r,$prog_state,&mt('Composing Query')); |
# |
# |
my $query = &build_query($mode); |
|
# Allow the other server to begin processing the data before we ask for it. |
# Allow the other server to begin processing the data before we ask for it. |
sleep(5); |
sleep(5); |
&Apache::lonnet::logthis('sending query '.$query); |
# |
|
my $max_time = &get_max_time_in_db($r,$prog_state); |
|
if (defined($max_time)) { |
|
$r->print('<h3>'.&mt('Activity data goes to [_1]', |
|
&Apache::lonlocal::locallocaltime($max_time)). |
|
'</h3>'); |
|
$r->rflush(); |
|
} else { |
|
$r->print('<h3>'.&mt('Unable to retrieve any data. Please reload this page and try again.').'</h3>'); |
|
return; |
|
} |
|
my $query = &build_query($mode); |
## |
## |
## Send it along |
## Send it along |
my $home = $ENV{'course.'.$ENV{'request.course.id'}.'.home'}; |
my $home = $ENV{'course.'.$ENV{'request.course.id'}.'.home'}; |
Line 90 sub get_data {
|
Line 101 sub get_data {
|
$r->print(&mt('Please try again in a few minutes.')); |
$r->print(&mt('Please try again in a few minutes.')); |
return; |
return; |
} |
} |
# $r->print('<h2>'.&mt('Elapsed Time = [_1] seconds', |
|
# time-$starttime).'</h2>'); |
|
$r->rflush(); |
$r->rflush(); |
|
# |
&Apache::lonhtmlcommon::Update_PrgWin |
&Apache::lonhtmlcommon::Update_PrgWin |
($r,$prog_state,&mt('Parsing results')); |
($r,$prog_state,&mt('Parsing results')); |
# $r->print('<h2>'. |
# |
# &mt('Reloading this page may result in newer data'). |
|
# '</h2>'); |
|
&output_results($r,$results_file,$navmap,$mode); |
&output_results($r,$results_file,$navmap,$mode); |
&Apache::lonhtmlcommon::Update_PrgWin($r,$prog_state,&mt('Finished!')); |
&Apache::lonhtmlcommon::Update_PrgWin($r,$prog_state,&mt('Finished!')); |
return; |
return; |
} |
} |
|
|
|
sub table_names { |
|
my $cid = $ENV{'request.course.id'}; |
|
my $domain = $ENV{'course.'.$cid.'.domain'}; |
|
my $home = $ENV{'course.'.$cid.'.home'}; |
|
my $course = $ENV{'course.'.$cid.'.num'}; |
|
my $prefix = $course.'_'.$domain.'_'; |
|
# |
|
my %tables = |
|
( student => $prefix.'students', |
|
res => $prefix.'resource', |
|
machine => $prefix.'machine_table', |
|
activity=> $prefix.'activity', |
|
); |
|
return %tables; |
|
} |
|
|
|
sub get_max_time_in_db { |
|
my ($r,$prog_state) = @_; |
|
my %table = &table_names(); |
|
my $query = qq{SELECT MAX(time) FROM $table{'activity'} }; |
|
# |
|
my $home = $ENV{'course.'.$ENV{'request.course.id'}.'.home'}; |
|
my $reply=&Apache::lonnet::metadata_query($query,undef,undef,[$home]); |
|
if (ref($reply) ne 'HASH') { |
|
return undef; |
|
} |
|
my $results_file = $r->dir_config('lonDaemons').'/tmp/'.$reply->{$home}; |
|
my $endfile = $results_file.'.end'; |
|
## |
|
## Check for the results |
|
&Apache::lonhtmlcommon::Update_PrgWin |
|
($r,$prog_state,&mt('Waiting for results')); |
|
my $maxtime = 500; |
|
my $starttime = time; |
|
while (! -e $endfile && (time-$starttime < $maxtime)) { |
|
&Apache::lonhtmlcommon::Update_PrgWin |
|
($r,$prog_state,&mt('Waiting up to [_1] seconds for results', |
|
$starttime+$maxtime-time)); |
|
sleep(1); |
|
} |
|
if (! -e $endfile) { |
|
$r->print('<h2>'. |
|
&mt('Unable to retrieve data.').'</h2>'); |
|
$r->print(&mt('Please try again in a few minutes.')); |
|
return undef; |
|
} |
|
$r->rflush(); |
|
# |
|
&Apache::lonhtmlcommon::Update_PrgWin |
|
($r,$prog_state,&mt('Parsing results')); |
|
# |
|
if (! open(TIMEDATA,$results_file)) { |
|
$r->print('<h2>'.&mt('Unable to read results file.').'</h2>'. |
|
'<p>'. |
|
&mt('This is a serious error and has been logged. '. |
|
'You should contact your system administrator '. |
|
'to resolve this issue.'). |
|
'</p>'); |
|
return; |
|
} |
|
# |
|
my $timestr = ''; |
|
while (my $line = <TIMEDATA>) { |
|
chomp($line); |
|
$timestr = &Apache::lonnet::unescape($line); |
|
} |
|
close(TIMEDATA); |
|
my ($year,$month,$day,$hour,$min,$sec) = |
|
($timestr =~ /^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/); |
|
$month -= 1; # Good old timelocal |
|
my $max_time = undef; |
|
if (eval("&timelocal($sec,$min,$hour,$day,$month,$year)")) { |
|
$max_time = &timelocal($sec,$min,$hour,$day,$month,$year); |
|
} |
|
return $max_time; |
|
} |
|
|
sub build_query { |
sub build_query { |
my ($mode) = @_; |
my ($mode) = @_; |
my $cid = $ENV{'request.course.id'}; |
my $cid = $ENV{'request.course.id'}; |
Line 111 sub build_query {
|
Line 196 sub build_query {
|
my $course = $ENV{'course.'.$cid.'.num'}; |
my $course = $ENV{'course.'.$cid.'.num'}; |
my $prefix = $course.'_'.$domain.'_'; |
my $prefix = $course.'_'.$domain.'_'; |
# |
# |
my $student_table = $prefix.'students'; |
my %table = &table_names(); |
my $res_table = $prefix.'resource'; |
|
my $action_table = $prefix.'actions'; |
|
my $machine_table = $prefix.'machine_table'; |
|
my $activity_table = $prefix.'activity'; |
|
# |
# |
my $query; |
my $query; |
if ($mode eq 'full_class') { |
if ($mode eq 'full_class') { |
$query = qq{ |
$query = qq{ |
SELECT B.resource,A.time,C.student,A.action,E.machine,A.action_values |
SELECT B.resource,A.time,C.student,A.action,E.machine,A.action_values |
FROM $activity_table AS A |
FROM $table{'activity'} AS A |
LEFT JOIN $res_table AS B ON B.res_id=A.res_id |
LEFT JOIN $table{'res'} AS B ON B.res_id=A.res_id |
LEFT JOIN $student_table AS C ON C.student_id=A.student_id |
LEFT JOIN $table{'student'} AS C ON C.student_id=A.student_id |
LEFT JOIN $machine_table AS E ON E.machine_id=A.machine_id |
LEFT JOIN $table{'machine'} AS E ON E.machine_id=A.machine_id |
WHERE A.student_id>10 |
|
ORDER BY A.time DESC |
ORDER BY A.time DESC |
LIMIT 500 |
LIMIT 500 |
}; |
}; |
Line 133 sub build_query {
|
Line 213 sub build_query {
|
my $student = $1.':'.$2; |
my $student = $1.':'.$2; |
$query = qq{ |
$query = qq{ |
SELECT B.resource,A.time,A.action,E.machine,A.action_values |
SELECT B.resource,A.time,A.action,E.machine,A.action_values |
FROM $activity_table AS A |
FROM $table{'activity'} AS A |
LEFT JOIN $res_table AS B ON B.res_id=A.res_id |
LEFT JOIN $table{'res'} AS B ON B.res_id=A.res_id |
LEFT JOIN $student_table AS C ON C.student_id=A.student_id |
LEFT JOIN $table{'student'} AS C ON C.student_id=A.student_id |
LEFT JOIN $machine_table AS E ON E.machine_id=A.machine_id |
LEFT JOIN $table{'machine'} AS E ON E.machine_id=A.machine_id |
WHERE C.student='$student' |
WHERE C.student='$student' |
ORDER BY A.time DESC |
ORDER BY A.time DESC |
LIMIT 500 |
LIMIT 500 |
Line 189 sub output_results {
|
Line 269 sub output_results {
|
## |
## |
## |
## |
while (my $line = <ACTIVITYDATA>) { |
while (my $line = <ACTIVITYDATA>) { |
|
# FIXME: does not pass symbs along :( |
chomp($line); |
chomp($line); |
$line = &Apache::lonnet::unescape($line); |
$line = &Apache::lonnet::unescape($line); |
if (++$count % 50 == 0) { |
if (++$count % 50 == 0) { |