You are here

function _multichoice_move_old_answers in Quiz 6.4

Same name and namespace in other branches
  1. 8.4 question_types/multichoice/multichoice_update_6400.inc \_multichoice_move_old_answers()
  2. 7 question_types/multichoice/multichoice_update_6400.inc \_multichoice_move_old_answers()
  3. 7.4 question_types/multichoice/multichoice_update_6400.inc \_multichoice_move_old_answers()

Move/convert user answer data from the old data model to the new

Parameters

$to_return: Array where progress can be reported

$sandbox: Array where persistent data can be stored, and progress can be found

File

question_types/multichoice/multichoice_update_6400.inc, line 85

Code

function _multichoice_move_old_answers(&$to_return, &$sandbox = NULL) {

  // Store persistent data in the sandbox variable
  if (!isset($sandbox['step_progress'])) {
    $sandbox['step_progress'] = 0;
    $sandbox['last_rid'] = -1;
    $sandbox['last_nid'] = -1;
    $sandbox['last_vid'] = -1;
    $sandbox['last_id'] = -1;
    $sandbox['step_max'] = db_result(db_query('SELECT COUNT(DISTINCT id) FROM {quiz_multichoice_user_answers}'));
  }

  // Fetch old user ans
  $sql = 'SELECT id, answer_id, question_nid, question_vid, result_id
          FROM {quiz_multichoice_user_answers}
          WHERE result_id >= %d
          ORDER BY result_id, question_nid, question_vid, answer_id';
  $res = db_query_range($sql, $sandbox['last_rid'], 0, 500);
  $progress_to_add = 0;
  while ($res_o = db_fetch_object($res)) {
    if ($res_o->question_nid == $sandbox['last_nid'] && $res_o->question_vid == $sandbox['last_vid'] && $res_o->result_id == $sandbox['last_rid']) {

      // We only keep one row for each question result in quiz_multichoice_user_answers
      if ($res_o->id > $sandbox['last_id']) {
        $sql2 = 'DELETE FROM {quiz_multichoice_user_answers}
                 WHERE id = %d';
        db_query($sql2, $res_o->id);
        if ($progress_to_add + $sandbox['step_progress'] + 1 >= $sandbox['step_max']) {
          $sandbox['step_progress'] = $sandbox['step_max'];
        }
      }
    }
    else {

      // This is the first row for this question result
      $sandbox['last_nid'] = $res_o->question_nid;
      $sandbox['last_vid'] = $res_o->question_vid;
      $sandbox['last_rid'] = $res_o->result_id;
      $sandbox['last_id'] = $res_o->id;
      $sandbox['step_progress'] += $progress_to_add;
      $progress_to_add = 0;
    }

    // We insert ther answers in quiz_multichoice_user_answer_multi
    $sql = 'INSERT IGNORE INTO {quiz_multichoice_user_answer_multi}
            (user_answer_id, answer_id)
            VALUES(%d, %d)';
    db_query($sql, $sandbox['last_id'], $res_o->answer_id);
    $progress_to_add++;
  }

  // We move on if all user answers have been moved
  if ($sandbox['step_progress'] >= $sandbox['step_max']) {
    _multichoice_next_step($to_return, $sandbox);
  }
}