/** * Store an entire {@link question_usage_by_activity} in the database, * including all the question_attempts that comprise it. * @param question_usage_by_activity $quba the usage to store. */ public function insert_questions_usage_by_activity(question_usage_by_activity $quba) { $record = new stdClass(); $record->contextid = $quba->get_owning_context()->id; $record->component = $quba->get_owning_component(); $record->preferredbehaviour = $quba->get_preferred_behaviour(); $newid = $this->db->insert_record('question_usages', $record); $quba->set_id_from_database($newid); foreach ($quba->get_attempt_iterator() as $qa) { $this->insert_question_attempt($qa, $quba->get_owning_context()); } }
/** * Store an entire {@link question_usage_by_activity} in the database, * including all the question_attempts that comprise it. * * You should not call this method directly. You should use * @link question_engine::save_questions_usage_by_activity()}. * * @param question_usage_by_activity $quba the usage to store. */ public function insert_questions_usage_by_activity(question_usage_by_activity $quba) { $record = new stdClass(); $record->contextid = $quba->get_owning_context()->id; $record->component = $quba->get_owning_component(); $record->preferredbehaviour = $quba->get_preferred_behaviour(); $newid = $this->db->insert_record('question_usages', $record); $quba->set_id_from_database($newid); // Initially an array of array of question_attempt_step_objects. // Built as a nested array for efficiency, then flattened. $stepdata = array(); foreach ($quba->get_attempt_iterator() as $qa) { $stepdata[] = $this->insert_question_attempt($qa, $quba->get_owning_context()); } $stepdata = call_user_func_array('array_merge', $stepdata); if ($stepdata) { $this->insert_all_step_data($stepdata); } }
/** * Create a question_usage_by_activity from records loaded from the database. * * For internal use only. * * @param Iterator $records Raw records loaded from the database. * @param int $questionattemptid The id of the question_attempt to extract. * @return question_usage_by_activity The newly constructed usage. */ public static function load_from_records($records, $qubaid) { $record = $records->current(); while ($record->qubaid != $qubaid) { $records->next(); if (!$records->valid()) { throw new coding_exception("Question usage $qubaid not found in the database."); } $record = $records->current(); } $quba = new question_usage_by_activity($record->component, context::instance_by_id($record->contextid, IGNORE_MISSING)); $quba->set_id_from_database($record->qubaid); $quba->set_preferred_behaviour($record->preferredbehaviour); $quba->observer = new question_engine_unit_of_work($quba); // If slot is null then the current pointer in $records will not be // advanced in the while loop below, and we get stuck in an infinite loop, // since this method is supposed to always consume at least one record. // Therefore, in this case, advance the record here. if (is_null($record->slot)) { $records->next(); } while ($record && $record->qubaid == $qubaid && !is_null($record->slot)) { $quba->questionattempts[$record->slot] = question_attempt::load_from_records($records, $record->questionattemptid, $quba->observer, $quba->get_preferred_behaviour()); if ($records->valid()) { $record = $records->current(); } else { $record = false; } } return $quba; }
/** * Create a question_usage_by_activity from records loaded from the database. * * For internal use only. * * @param Iterator $records Raw records loaded from the database. * @param int $questionattemptid The id of the question_attempt to extract. * @return question_usage_by_activity The newly constructed usage. */ public static function load_from_records($records, $qubaid) { $record = $records->current(); while ($record->qubaid != $qubaid) { $records->next(); if (!$records->valid()) { throw new coding_exception("Question usage $qubaid not found in the database."); } $record = $records->current(); } $quba = new question_usage_by_activity($record->component, get_context_instance_by_id($record->contextid)); $quba->set_id_from_database($record->qubaid); $quba->set_preferred_behaviour($record->preferredbehaviour); $quba->observer = new question_engine_unit_of_work($quba); while ($record && $record->qubaid == $qubaid && !is_null($record->slot)) { $quba->questionattempts[$record->slot] = question_attempt::load_from_records($records, $record->questionattemptid, $quba->observer, $quba->get_preferred_behaviour()); if ($records->valid()) { $record = $records->current(); } else { $record = false; } } return $quba; }