--- loncom/interface/loncoursedata.pm 2004/04/06 15:45:13 1.130 +++ loncom/interface/loncoursedata.pm 2004/07/22 15:55:57 1.138 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursedata.pm,v 1.130 2004/04/06 15:45:13 matthew Exp $ +# $Id: loncoursedata.pm,v 1.138 2004/07/22 15:55:57 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -199,6 +199,7 @@ sub get_sequence_assessment_data { my @Ids = $curRes->responseIds($part); $partdata{$part}->{'ResponseTypes'}= \@Responses; $partdata{$part}->{'ResponseIds'} = \@Ids; + $partdata{$part}->{'Survey'} = $curRes->is_survey($part); # Count how many responses of each type there are in this part foreach (@Responses) { $partdata{$part}->{$_}++; @@ -547,12 +548,14 @@ store student data. ################################################ ################################################ sub init_dbs { - my $courseid = shift; + my ($courseid,$drop) = @_; &setup_table_names($courseid); # # Drop any of the existing tables - foreach my $table (@Tables) { - &Apache::lonmysql::drop_table($table); + if ($drop) { + foreach my $table (@Tables) { + &Apache::lonmysql::drop_table($table); + } } # # Note - changes to this table must be reflected in the code that @@ -580,7 +583,7 @@ sub init_dbs { restrictions => 'NOT NULL', auto_inc => 'yes', }, { name => 'part', - type => 'VARCHAR(100)', + type => 'VARCHAR(100) BINARY', restrictions => 'NOT NULL'}, ], 'PRIMARY KEY' => ['part (100)'], @@ -595,16 +598,16 @@ sub init_dbs { restrictions => 'NOT NULL', auto_inc => 'yes', }, { name => 'student', - type => 'VARCHAR(100)', + type => 'VARCHAR(100) BINARY', restrictions => 'NOT NULL UNIQUE'}, { name => 'section', - type => 'VARCHAR(100)', + type => 'VARCHAR(100) BINARY', restrictions => 'NOT NULL'}, { name => 'status', - type => 'VARCHAR(15)', + type => 'VARCHAR(15) BINARY', restrictions => 'NOT NULL'}, { name => 'classification', - type => 'varchar(100)', }, + type => 'VARCHAR(100) BINARY', }, { name => 'updatetime', type => 'INT UNSIGNED'}, { name => 'fullupdatetime', @@ -629,7 +632,7 @@ sub init_dbs { type => 'MEDIUMINT UNSIGNED', restrictions => 'NOT NULL' }, { name => 'part', - type => 'VARCHAR(100)', + type => 'VARCHAR(100) BINARY', restrictions => 'NOT NULL'}, { name => 'solved', type => 'TINYTEXT' }, @@ -709,7 +712,7 @@ sub init_dbs { { name => 'awarddetail', type => 'TINYTEXT' }, # { name => 'message', -# type => 'CHAR' }, +# type => 'CHAR BINARY'}, { name => 'response_specific', type => 'TINYTEXT' }, { name => 'response_specific_value', @@ -1081,6 +1084,7 @@ sub populate_student_table { } # &setup_table_names($courseid); + &init_dbs($courseid,0); my $dbh = &Apache::lonmysql::get_dbh(); my $request = 'INSERT IGNORE INTO '.$student_table. "(student,section,status) VALUES "; @@ -1594,7 +1598,7 @@ sub ensure_tables_are_set_up { !$found_performance || !$found_parameters || !$found_fulldump_part || !$found_fulldump_response || !$found_fulldump_timestamp || !$found_weight ) { - if (&init_dbs($courseid)) { + if (&init_dbs($courseid,1)) { return 'error'; } } @@ -2030,12 +2034,14 @@ sub get_problem_statistics { } my ($solved) = &execute_SQL_request($dbh,$request); # + $Solved -= $solved; + # $num = 0 if (! defined($num)); $tries = 0 if (! defined($tries)); $max = 0 if (! defined($max)); $min = 0 if (! defined($min)); $STD = 0 if (! defined($STD)); - $Solved = 0 if (! defined($Solved)); + $Solved = 0 if (! defined($Solved) || $Solved < 0); $solved = 0 if (! defined($solved)); # # Compute the more complicated statistics @@ -2297,6 +2303,14 @@ sub get_sum_of_scores { if (! defined($courseid)) { $courseid = $ENV{'request.course.id'}; } + if (defined($students) && + ((@$students == 0) || + (@$students == 1 && (! defined($students->[0]) || + $students->[0] eq '')) + ) + ){ + undef($students); + } # &setup_table_names($courseid); my $dbh = &Apache::lonmysql::get_dbh(); @@ -2319,7 +2333,9 @@ sub get_sum_of_scores { $sth->execute(); my $rows = $sth->fetchrow_arrayref(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 1 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed, fetchrow_arrayrefed'. + $/.$request); return (undef,undef); } return ($rows->[0],$rows->[1]); @@ -2456,14 +2472,14 @@ sub count_stats { $request .= ' AND '.$enrollment_limits; } $request .= ' GROUP BY a.student_id'; - &Apache::lonnet::logthis('request = '.$/.$request); +# &Apache::lonnet::logthis('request = '.$/.$request); my $sth = $dbh->prepare($request); $sth->execute(); $request = 'SELECT AVG(count),STD(count),MAX(count),MIN(count),COUNT(count) '. 'FROM '.$stats_table; my ($ave,$std,$max,$min,$count) = &execute_SQL_request($dbh,$request); - &Apache::lonnet::logthis('request = '.$/.$request); +# &Apache::lonnet::logthis('request = '.$/.$request); return($min,$max,$ave,$std,$count); } @@ -2499,7 +2515,8 @@ sub get_student_data { my $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 2 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } my $dataset = $sth->fetchall_arrayref(); @@ -2524,7 +2541,15 @@ sub get_response_data { # &setup_table_names($courseid); my $symb_id = &get_symb_id($symb); + if (! defined($symb_id)) { + &Apache::lonnet::logthis('Unable to find symb for '.$symb.' in '.$courseid); + return undef; + } my $response_id = &get_part_id($response); + if (! defined($response_id)) { + &Apache::lonnet::logthis('Unable to find id for '.$response.' in '.$courseid); + return undef; + } # my $dbh = &Apache::lonmysql::get_dbh(); return undef if (! defined($dbh)); @@ -2560,7 +2585,8 @@ sub get_response_data { my $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 3 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } my $dataset = $sth->fetchall_arrayref(); @@ -2616,7 +2642,8 @@ sub get_response_data_by_student { my $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 4 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } my $dataset = $sth->fetchall_arrayref(); @@ -2668,7 +2695,8 @@ sub get_response_time_data { my $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 5 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } my $dataset = $sth->fetchall_arrayref(); @@ -2758,7 +2786,8 @@ sub get_student_scores { my $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 6 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } $request = 'SELECT score,COUNT(*) FROM '.$tmptable.' GROUP BY score'; @@ -2766,7 +2795,8 @@ sub get_student_scores { $sth = $dbh->prepare($request); $sth->execute(); if ($dbh->err) { - &Apache::lonnet::logthis('error = '.$dbh->errstr()); + &Apache::lonnet::logthis('error 7 = '.$dbh->errstr()); + &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } my $dataset = $sth->fetchall_arrayref(); @@ -2873,7 +2903,7 @@ $ENV{'course.'.$cid.'.domain'}, and $ENV Returns a reference to a hash which contains: keys '$sname:$sdom' - values [$sdom,$sname,$end,$start,$id,$section,$fullname,$status,$type] + values [$sdom,$sname,$end,$start,$id,$section,$fullname,$status,$type,$lockedtype] The constant values CL_SDOM, CL_SNAME, CL_END, etc. can be used as indices into the returned list to future-proof clients against @@ -2893,6 +2923,7 @@ sub CL_SECTION { return 5; } sub CL_FULLNAME { return 6; } sub CL_STATUS { return 7; } sub CL_TYPE { return 8; } +sub CL_LOCKEDTYPE { return 9; } sub get_classlist { my ($cid,$cdom,$cnum) = @_; @@ -2909,9 +2940,9 @@ sub get_classlist { } my ($sname,$sdom) = split(/:/,$student); my @Values = split(/:/,$info); - my ($end,$start,$id,$section,$fullname,$type); + my ($end,$start,$id,$section,$fullname,$type,$lockedtype); if (@Values > 2) { - ($end,$start,$id,$section,$fullname,$type) = @Values; + ($end,$start,$id,$section,$fullname,$type,$lockedtype) = @Values; } else { # We have to get the data ourselves ($end,$start) = @Values; $section = &Apache::lonnet::getsection($sdom,$sname,$cid); @@ -2948,11 +2979,11 @@ sub get_classlist { $status='Active'; } $classlist{$student} = - [$sdom,$sname,$end,$start,$id,$section,$fullname,$status,$type]; + [$sdom,$sname,$end,$start,$id,$section,$fullname,$status,$type,$lockedtype]; } if (wantarray()) { return (\%classlist,['domain','username','end','start','id', - 'section','fullname','status','type']); + 'section','fullname','status','type','lockedtype']); } else { return \%classlist; }