Diff for /loncom/interface/loncoursedata.pm between versions 1.201.2.6 and 1.202

version 1.201.2.6, 2021/09/16 16:20:36 version 1.202, 2017/12/18 23:51:14
Line 777  sub symb_is_for_task { Line 777  sub symb_is_for_task {
     return ($symb =~ /\.task$/);      return ($symb =~ /\.task$/);
 }  }
   
 my $requested_max_packet = 0;  
 my $max_allowed_packet;  
   
 sub update_full_student_data {  sub update_full_student_data {
     my ($sname,$sdom,$courseid) = @_;      my ($sname,$sdom,$courseid) = @_;
Line 966  sub update_full_student_data { Line 964  sub update_full_student_data {
     }      }
     ##      ##
     ## Store the response data      ## Store the response data
     my $store_prefix = 'INSERT IGNORE INTO '.$fulldump_response_table.      $store_command = 'INSERT IGNORE INTO '.$fulldump_response_table.
         ' VALUES '."\n";          ' VALUES '."\n";
     $store_rows = 0;      $store_rows = 0;
     unless ($requested_max_packet) {  
         (undef,$max_allowed_packet) = $dbh->selectrow_array(  
                                              qq{show variables LIKE ? },  
                                              undef,  
                                              "max_allowed_packet");  
         if ($max_allowed_packet !~ /^\d+$/) {  
             $max_allowed_packet = '';  
         }  
         $requested_max_packet = 1;  
     }  
     my @store_values = ();  
     my $curr_values = '';  
     my $curr_length = 0;  
     my ($max_values);  
     if ($max_allowed_packet) {  
         $max_values = $max_allowed_packet - length($store_prefix);  
     }  
     while (my ($symb_id,$hash1) = each (%$respdata)) {      while (my ($symb_id,$hash1) = each (%$respdata)) {
         while (my ($part_id,$hash2) = each (%$hash1)) {          while (my ($part_id,$hash2) = each (%$hash1)) {
             while (my ($resp_id,$hash3) = each (%$hash2)) {              while (my ($resp_id,$hash3) = each (%$hash2)) {
Line 997  sub update_full_student_data { Line 978  sub update_full_student_data {
                     # and odd number of '\' cause insert errors to occur.                        # and odd number of '\' cause insert errors to occur.  
                     # Best trap this somehow...                      # Best trap this somehow...
                     $submission = $dbh->quote($submission);                      $submission = $dbh->quote($submission);
                     my $sql_values = "('".                      $store_command .= "('".
                         join("','",$symb_id,$part_id,                          join("','",$symb_id,$part_id,
                              $resp_id,$student_id,                               $resp_id,$student_id,
                              $transaction,                               $transaction,
Line 1005  sub update_full_student_data { Line 986  sub update_full_student_data {
                              $data->{'response_specific'},                               $data->{'response_specific'},
                              $data->{'response_specific_value'},                               $data->{'response_specific_value'},
                              $data->{'response_specific_2'},                               $data->{'response_specific_2'},
                              $data->{'response_specific_value_2'})."',";                               $data->{'response_specific_value_2'}).
                     if ($max_values) {                               "',".$submission."),";
                         my $length = length($sql_values) + length($submission."),");  
                         if ($length > $max_values) {  
                             &Apache::lonnet::logthis("SQL responsedata insert for student: $sname would exceed max_allowed_packet size");  
                             &Apache::lonnet::logthis("symb_id: $symb_id, part_id: $part_id, resp_id: $resp_id");  
                             &Apache::lonnet::logthis("You may want to increase the max_allowed_packet size from the current: $max_allowed_packet");  
                             $sql_values .= $dbh->quote('WARNING: Submission too large -- see grading interface for actual submission')."),";  
                             $length = length($sql_values);  
                             &Apache::lonnet::logthis("Placeholder inserted instead of value of actual submission");  
                             &Apache::lonnet::logthis("See grading interface for the actual submission");  
                         } else {  
                             $sql_values .= $submission."),";  
                         }  
                         if ($length + $curr_length > $max_values) {  
                             push(@store_values,$curr_values);  
                             $curr_values = $sql_values;  
                             $curr_length = $length;  
                         } else {  
                             $curr_values .= $sql_values;  
                             $curr_length += $length;  
                         }  
                     } else {  
                         $curr_values .= $sql_values.$submission."),";  
                     }  
                     $store_rows++;                      $store_rows++;
                 }                  }
             }              }
         }          }
     }      }
     if ($store_rows) {      if ($store_rows) {
         if ($curr_values ne '') {          chop($store_command);
             push(@store_values,$curr_values);          $dbh->do($store_command);
         }          if ($dbh->err) {
         foreach my $item (@store_values) {              $returnstatus = 'error saving response data';
             chop($item);              &Apache::lonnet::logthis('insert error '.$dbh->errstr());
             if ($item ne '') {              &Apache::lonnet::logthis("While attempting\n".$store_command);
                 $dbh->do($store_prefix.$item);  
                 if ($dbh->err) {  
                     $returnstatus = 'error saving response data';  
                     &Apache::lonnet::logthis('insert error '.$dbh->errstr());  
                     &Apache::lonnet::logthis("While attempting\n".$store_prefix.$item);  
                     last;  
                 }  
             }  
         }          }
     }      }
     ##      ##
Line 1062  sub update_full_student_data { Line 1012  sub update_full_student_data {
         $returnstatus = 'error saving current data:'.$status;          $returnstatus = 'error saving current data:'.$status;
     } elsif ($status ne 'okay') {      } elsif ($status ne 'okay') {
         $returnstatus .= ' error saving current data:'.$status;          $returnstatus .= ' error saving current data:'.$status;
     }      }        
     ##      ##
     ## Update the students time......      ## Update the students time......
     if ($returnstatus eq 'okay') {      if ($returnstatus eq 'okay') {
Line 1152  sub store_student_data { Line 1102  sub store_student_data {
     my $starttime = Time::HiRes::time;      my $starttime = Time::HiRes::time;
     my $elapsed = 0;      my $elapsed = 0;
     my $rows_stored;      my $rows_stored;
     my $store_parameters_prefix  = 'INSERT IGNORE INTO '.$parameters_table.      my $store_parameters_command  = 'INSERT IGNORE INTO '.$parameters_table.
         ' VALUES '."\n";          ' VALUES '."\n";
     my $num_parameters = 0;      my $num_parameters = 0;
     my $store_performance_prefix = 'INSERT IGNORE INTO '.$performance_table.      my $store_performance_command = 'INSERT IGNORE INTO '.$performance_table.
         ' VALUES '."\n";          ' VALUES '."\n";
     return ('error',undef) if (! defined($dbh));      return ('error',undef) if (! defined($dbh));
     unless ($requested_max_packet) {  
         (undef,$max_allowed_packet) = $dbh->selectrow_array(  
                                              qq{show variables LIKE ? },  
                                              undef,  
                                              "max_allowed_packet");  
         if ($max_allowed_packet !~ /^\d+$/) {  
             $max_allowed_packet = '';  
         }  
         $requested_max_packet = 1;  
     }  
     my @store_parameters_values = ();  
     my $curr_params_values = '';  
     my $curr_params_length = 0;  
     my @store_performance_values = ();  
     my $curr_perf_values = '';  
     my $curr_perf_length = 0;  
     my ($max_param,$max_perf);  
     if ($max_allowed_packet) {  
         $max_param = $max_allowed_packet - length($store_parameters_prefix);  
         $max_perf = $max_allowed_packet - length($store_performance_prefix);  
     }  
     while (my ($current_symb,$param_hash) = each(%{$student_data})) {      while (my ($current_symb,$param_hash) = each(%{$student_data})) {
         #          #
         # make sure the symb is set up properly          # make sure the symb is set up properly
Line 1191  sub store_student_data { Line 1120  sub store_student_data {
                                               $symb_id,$student_id,                                                $symb_id,$student_id,
                                               $parameter)."',".                                                $parameter)."',".
                                                   $dbh->quote($value)."),\n";                                                    $dbh->quote($value)."),\n";
                   $num_parameters ++;
                 if ($sql_parameter !~ /''/) {                  if ($sql_parameter !~ /''/) {
                     if ($max_param) {                      $store_parameters_command .= $sql_parameter;
                         my $length = length($sql_parameter);  
                         if ($length > $max_param) {  
                             &Apache::lonnet::logthis("SQL parameter insert for student: $sname for parameter: $parameter would exceed max_allowed_packet size");  
                             &Apache::lonnet::logthis("symb_id: $symb_id");  
                             &Apache::lonnet::logthis("You may want to increase the max_allowed_packet size from the current: $max_allowed_packet");  
                             if ($parameter =~ /\.submission$/) {  
                                 $sql_parameter = "('".join("','",  
                                               $symb_id,$student_id,  
                                               $parameter)."',".  
                                                   $dbh->quote('WARNING: Submission too large -- see grading interface for actual submission')."),\n";  
                                 $length = length($sql_parameter);  
                                 &Apache::lonnet::logthis("Placeholder inserted instead of value of actual submission");  
                                 &Apache::lonnet::logthis("See grading interface for the actual submission");  
                             } else {  
                                 &Apache::lonnet::logthis("Skipping this item");  
                                 next;  
                             }  
                         }  
                         if ($length + $curr_params_length > $max_param) {  
                             push(@store_parameters_values,$curr_params_values);  
                             $curr_params_values = $sql_parameter;  
                             $curr_params_length = $length;  
                         } else {  
                             $curr_params_values .= $sql_parameter;  
                             $curr_params_length += $length;  
                         }  
                     } else {  
                         $curr_params_values .= $sql_parameter;  
                     }  
                     #$rows_stored++;                      #$rows_stored++;
                     $num_parameters ++;  
                 }                  }
             }              }
         }          }
Line 1265  sub store_student_data { Line 1165  sub store_student_data {
                 "('".join("','",$symb_id,$student_id,$part_id,$part,                  "('".join("','",$symb_id,$student_id,$part_id,$part,
                                 $solved,$tries,$awarded,$award,                                  $solved,$tries,$awarded,$award,
                                 $awarddetail,$timestamp)."'),\n";                                  $awarddetail,$timestamp)."'),\n";
             if ($max_perf) {              $store_performance_command .= $sql_performance;
                 my $length = length($sql_performance);  
                 if ($length > $max_perf) {  
                             &Apache::lonnet::logthis("SQL performance insert for student: $sname would exceed max_allowed_packet size");  
                             &Apache::lonnet::logthis("symb_id: $symb_id");  
                             &Apache::lonnet::logthis("Skipping this item.  You may want to increase the max_allowed_packet size from the current: $max_allowed_packet");  
                             next;  
                 } else {  
                     if ($length + $curr_perf_length > $max_perf) {  
                         push(@store_performance_values,$curr_perf_values);  
                         $curr_perf_values = $sql_performance;  
                         $curr_perf_length = $length;  
                     } else {  
                         $curr_perf_values .= $sql_performance;  
                         $curr_perf_length += $length;  
                     }  
                 }  
             } else {  
                 $curr_perf_values .= $sql_performance;  
             }  
             $rows_stored++;              $rows_stored++;
         }          }
     }      }
     if ($curr_params_values ne '') {  
         push(@store_parameters_values,$curr_params_values);  
     }  
     if ($curr_perf_values ne '') {  
         push(@store_performance_values,$curr_perf_values);  
     }  
     if (! $rows_stored) { return ($returnstatus, undef); }      if (! $rows_stored) { return ($returnstatus, undef); }
       $store_parameters_command =~ s|,\n$||;
       $store_performance_command =~ s|,\n$||;
     my $start = Time::HiRes::time;      my $start = Time::HiRes::time;
     foreach my $item (@store_performance_values) {      $dbh->do($store_performance_command);
         $item =~ s|,\n$||;      if ($dbh->err()) {
         if ($item ne '') {          &Apache::lonnet::logthis('performance bigass insert error:'.
             $dbh->do($store_performance_prefix.$item);                                   $dbh->errstr());
             if ($dbh->err()) {          &Apache::lonnet::logthis('command = '.$/.$store_performance_command);
                 &Apache::lonnet::logthis('performance insert error:'.          $returnstatus = 'error: unable to insert performance into database';
                                          $dbh->errstr());          return ($returnstatus,$student_data);
                 &Apache::lonnet::logthis('command = '.$/.$store_performance_prefix.$item);  
                 $returnstatus = 'error: unable to insert performance into database';  
                 return ($returnstatus,$student_data);  
             }  
         }  
     }      }
     if ($num_parameters > 0) {      $dbh->do($store_parameters_command) if ($num_parameters>0);
         foreach my $item (@store_parameters_values) {      if ($dbh->err()) {
             $item =~ s|,\n$||;          &Apache::lonnet::logthis('parameters bigass insert error:'.
             if ($item ne '') {                                   $dbh->errstr());
                 $dbh->do($store_parameters_prefix.$item);          &Apache::lonnet::logthis('command = '.$/.$store_parameters_command);
                 if ($dbh->err()) {          &Apache::lonnet::logthis('rows_stored = '.$rows_stored);
                      &Apache::lonnet::logthis('parameters insert error:'.          &Apache::lonnet::logthis('student_id = '.$student_id);
                                               $dbh->errstr());          $returnstatus = 'error: unable to insert parameters into database';
                      &Apache::lonnet::logthis('command = '.$/.$store_parameters_prefix.$item);          return ($returnstatus,$student_data);
                      &Apache::lonnet::logthis('rows_stored = '.$rows_stored);  
                      &Apache::lonnet::logthis('student_id = '.$student_id);  
                      $returnstatus = 'error: unable to insert parameters into database';  
                      return ($returnstatus,$student_data);  
                 }  
             }  
         }  
     }      }
     $elapsed += Time::HiRes::time - $start;      $elapsed += Time::HiRes::time - $start;
     return ($returnstatus,$student_data);      return ($returnstatus,$student_data);
Line 1812  sub get_problem_statistics { Line 1677  sub get_problem_statistics {
     #      #
     $request = 'SELECT MAX(tries),MIN(tries) FROM '.$stats_table.      $request = 'SELECT MAX(tries),MIN(tries) FROM '.$stats_table.
         ' WHERE awarded>0';          ' WHERE awarded>0';
       if (defined($time_requirements)) {
           $request .= ' AND '.$time_requirements;
       }
     my ($max,$min) = &execute_SQL_request($dbh,$request);      my ($max,$min) = &execute_SQL_request($dbh,$request);
     #      #
     $request = 'SELECT SUM(awarded) FROM '.$stats_table;      $request = 'SELECT SUM(awarded) FROM '.$stats_table;
       if (defined($time_requirements)) {
           $request .= ' AND '.$time_requirements;
       }
     my ($Solved) = &execute_SQL_request($dbh,$request);      my ($Solved) = &execute_SQL_request($dbh,$request);
     #      #
     $request = 'SELECT SUM(awarded) FROM '.$stats_table.      $request = 'SELECT SUM(awarded) FROM '.$stats_table.
         " WHERE solved='correct_by_override'";          " WHERE solved='correct_by_override'";
       if (defined($time_requirements)) {
           $request .= ' AND '.$time_requirements;
       }
     my ($solved) = &execute_SQL_request($dbh,$request);      my ($solved) = &execute_SQL_request($dbh,$request);
     #      #
     $Solved -= $solved;      $Solved -= $solved;
Line 1901  sub populate_weight_table { Line 1775  sub populate_weight_table {
     my @resources;      my @resources;
     foreach my $seq (@sequences) {      foreach my $seq (@sequences) {
         push(@resources,$navmap->retrieveResources($seq,          push(@resources,$navmap->retrieveResources($seq,
                                                    sub {shift->is_problem();},                                                     sub {shift->is_gradable();},
                                                    0,0,0));                                                     0,0,0));
     }      }
     if (! scalar(@resources)) {      if (! scalar(@resources)) {
Line 2059  sub rank_students_by_scores_on_resources Line 1933  sub rank_students_by_scores_on_resources
         $limits =~ s/( AND )$//;   # Remove extra conjunction          $limits =~ s/( AND )$//;   # Remove extra conjunction
         $request .= "WHERE $limits";          $request .= "WHERE $limits";
     }       } 
     $request .= " $award_clause GROUP BY a.student_id ORDER BY score, b.student";      $request .= " $award_clause GROUP BY a.student_id ORDER BY score";
     #&Apache::lonnet::logthis('request = '.$/.$request);      #&Apache::lonnet::logthis('request = '.$/.$request);
     my $sth = $dbh->prepare($request) or die "Can't prepare $request";      my $sth = $dbh->prepare($request) or die "Can't prepare $request";
     $sth->execute();      $sth->execute();
Line 2520  sub get_student_scores { Line 2394  sub get_student_scores {
         &Apache::lonnet::logthis('prepared then executed '.$/.$request);          &Apache::lonnet::logthis('prepared then executed '.$/.$request);
         return undef;          return undef;
     }      }
     $request = 'SELECT score,COUNT(*) FROM '.$tmptable.' GROUP BY score ORDER BY score';      $request = 'SELECT score,COUNT(*) FROM '.$tmptable.' GROUP BY score';
 #    &Apache::lonnet::logthis("request = \n".$request);  #    &Apache::lonnet::logthis("request = \n".$request);
     $sth = $dbh->prepare($request);      $sth = $dbh->prepare($request);
     $sth->execute();      $sth->execute();

Removed from v.1.201.2.6  
changed lines
  Added in v.1.202


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>