--- loncom/interface/loncoursedata.pm 2021/03/02 19:51:02 1.205 +++ loncom/interface/loncoursedata.pm 2021/09/16 16:02:41 1.208 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursedata.pm,v 1.205 2021/03/02 19:51:02 raeburn Exp $ +# $Id: loncoursedata.pm,v 1.208 2021/09/16 16:02:41 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -777,6 +777,8 @@ sub symb_is_for_task { return ($symb =~ /\.task$/); } +my $requested_max_packet = 0; +my $max_allowed_packet; sub update_full_student_data { my ($sname,$sdom,$courseid) = @_; @@ -964,9 +966,26 @@ sub update_full_student_data { } ## ## Store the response data - $store_command = 'INSERT IGNORE INTO '.$fulldump_response_table. + my $store_prefix = 'INSERT IGNORE INTO '.$fulldump_response_table. ' VALUES '."\n"; $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 ($part_id,$hash2) = each (%$hash1)) { while (my ($resp_id,$hash3) = each (%$hash2)) { @@ -978,7 +997,7 @@ sub update_full_student_data { # and odd number of '\' cause insert errors to occur. # Best trap this somehow... $submission = $dbh->quote($submission); - $store_command .= "('". + my $sql_values = "('". join("','",$symb_id,$part_id, $resp_id,$student_id, $transaction, @@ -986,20 +1005,51 @@ sub update_full_student_data { $data->{'response_specific'}, $data->{'response_specific_value'}, $data->{'response_specific_2'}, - $data->{'response_specific_value_2'}). - "',".$submission."),"; + $data->{'response_specific_value_2'})."',"; + if ($max_values) { + 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++; } } } } if ($store_rows) { - chop($store_command); - $dbh->do($store_command); - if ($dbh->err) { - $returnstatus = 'error saving response data'; - &Apache::lonnet::logthis('insert error '.$dbh->errstr()); - &Apache::lonnet::logthis("While attempting\n".$store_command); + if ($curr_values ne '') { + push(@store_values,$curr_values); + } + foreach my $item (@store_values) { + chop($item); + if ($item ne '') { + $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; + } + } } } ## @@ -1012,7 +1062,7 @@ sub update_full_student_data { $returnstatus = 'error saving current data:'.$status; } elsif ($status ne 'okay') { $returnstatus .= ' error saving current data:'.$status; - } + } ## ## Update the students time...... if ($returnstatus eq 'okay') { @@ -1082,9 +1132,6 @@ sub store_updatetime { $dbh->do($request); } -my $requested_max_packet = 0; -my $max_allowed_packet; - sub store_student_data { my ($sname,$sdom,$courseid,$student_data) = @_; # @@ -1150,18 +1197,28 @@ sub store_student_data { 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("Skipping this item. You may want to increase the max_allowed_packet size from the current: $max_allowed_packet"); - next; - } else { - if ($length + $curr_params_length > $max_param) { - push(@store_parameters_values,$curr_params_values); - $curr_params_values = $sql_parameter; - $curr_params_length = $length; + &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 { - $curr_params_values .= $sql_parameter; - $curr_params_length += $length; + &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; } @@ -2463,7 +2520,7 @@ sub get_student_scores { &Apache::lonnet::logthis('prepared then executed '.$/.$request); return undef; } - $request = 'SELECT score,COUNT(*) FROM '.$tmptable.' GROUP BY score'; + $request = 'SELECT score,COUNT(*) FROM '.$tmptable.' GROUP BY score ORDER BY score'; # &Apache::lonnet::logthis("request = \n".$request); $sth = $dbh->prepare($request); $sth->execute();