/** * 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; }
/** * Update a question_usages row to refect any changes in a usage (but not * any of its question_attempts. * @param question_usage_by_activity $quba the usage that has changed. */ public function update_questions_usage_by_activity(question_usage_by_activity $quba) { $record = new stdClass(); $record->id = $quba->get_id(); $record->contextid = $quba->get_owning_context()->id; $record->component = $quba->get_owning_component(); $record->preferredbehaviour = $quba->get_preferred_behaviour(); $this->db->update_record('question_usages', $record); }
/** * 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; }