From c290ac5510ca06b3eae557c2165c2f106dde46aa Mon Sep 17 00:00:00 2001 From: sam marshall Date: Tue, 18 Jun 2013 17:02:33 +0100 Subject: [PATCH] MDL-39876 update_course_record function to update global COURSE --- backup/moodle2/restore_stepslib.php | 2 +- course/externallib.php | 2 +- course/lib.php | 4 ++-- course/manage.php | 2 +- lib/adminlib.php | 23 ++++++++++------------- lib/datalib.php | 21 +++++++++++++++++++++ lib/modinfolib.php | 28 +++++++++------------------- lib/moodlelib.php | 2 +- lib/tests/accesslib_test.php | 4 ++-- 9 files changed, 48 insertions(+), 40 deletions(-) diff --git a/backup/moodle2/restore_stepslib.php b/backup/moodle2/restore_stepslib.php index 84f6b2322fb..eba88703015 100644 --- a/backup/moodle2/restore_stepslib.php +++ b/backup/moodle2/restore_stepslib.php @@ -1422,7 +1422,7 @@ class restore_course_structure_step extends restore_structure_step { } // Course record ready, update it - $DB->update_record('course', $data); + update_course_record($data); course_get_format($data)->update_course_format_options($data); diff --git a/course/externallib.php b/course/externallib.php index 65881ea5c98..31d7f733b92 100644 --- a/course/externallib.php +++ b/course/externallib.php @@ -1083,7 +1083,7 @@ class core_course_external extends external_api { $course->visible = $params['visible']; // Set shortname and fullname back. - $DB->update_record('course', $course); + update_course_record($course); if (empty($CFG->keeptempdirectoriesonbackup)) { fulldelete($backupbasepath); diff --git a/course/lib.php b/course/lib.php index 3e4c296c665..d61e404d26b 100644 --- a/course/lib.php +++ b/course/lib.php @@ -2053,7 +2053,7 @@ function move_courses($courseids, $categoryid) { $course->visible = 0; } - $DB->update_record('course', $course); + update_course_record($course); add_to_log($course->id, "course", "move", "edit.php?id=$course->id", $course->id); $context = context_course::instance($course->id); @@ -2363,7 +2363,7 @@ function update_course($data, $editoroptions = NULL) { } // Update with the new data - $DB->update_record('course', $data); + update_course_record($data); // make sure the modinfo cache is reset rebuild_course_cache($data->id); diff --git a/course/manage.php b/course/manage.php index 0cec4466391..bb67cfbe455 100644 --- a/course/manage.php +++ b/course/manage.php @@ -247,7 +247,7 @@ if ((!empty($hide) or !empty($show)) && confirm_sesskey()) { require_capability('moodle/course:visibility', $coursecontext); // Set the visibility of the course. we set the old flag when user manually changes visibility of course. $params = array('id' => $course->id, 'visible' => $visible, 'visibleold' => $visible, 'timemodified' => time()); - $DB->update_record('course', $params); + update_course_record((object)$params); cache_helper::purge_by_event('changesincourse'); add_to_log($course->id, "course", ($visible ? 'show' : 'hide'), "edit.php?id=$course->id", $course->id); } diff --git a/lib/adminlib.php b/lib/adminlib.php index 25ae3d0cae1..5d00c603792 100644 --- a/lib/adminlib.php +++ b/lib/adminlib.php @@ -3576,7 +3576,7 @@ class admin_setting_sitesetselect extends admin_setting_configselect { * @return string empty or error message */ public function write_setting($data) { - global $DB, $SITE, $COURSE; + global $SITE, $COURSE; if (!in_array($data, array_keys($this->choices))) { return get_string('errorsetting', 'admin'); } @@ -3587,17 +3587,16 @@ class admin_setting_sitesetselect extends admin_setting_configselect { $record->timemodified = time(); course_get_format($SITE)->update_course_format_options($record); - $DB->update_record('course', $record); + update_course_record($record); // Reset caches. - $SITE = $DB->get_record('course', array('id'=>$SITE->id), '*', MUST_EXIST); + $SITE = get_course($SITE->id); if ($SITE->id == $COURSE->id) { $COURSE = $SITE; } format_base::reset_course_cache($SITE->id); return ''; - } } @@ -3779,22 +3778,21 @@ class admin_setting_sitesetcheckbox extends admin_setting_configcheckbox { * @return string empty string or error message */ public function write_setting($data) { - global $DB, $SITE, $COURSE; + global $SITE, $COURSE; $record = new stdClass(); $record->id = $SITE->id; $record->{$this->name} = ($data == '1' ? 1 : 0); $record->timemodified = time(); course_get_format($SITE)->update_course_format_options($record); - $DB->update_record('course', $record); + update_course_record($record); // Reset caches. - $SITE = $DB->get_record('course', array('id'=>$SITE->id), '*', MUST_EXIST); + $SITE = get_course($SITE->id); if ($SITE->id == $COURSE->id) { $COURSE = $SITE; } format_base::reset_course_cache($SITE->id); - return ''; } } @@ -3841,7 +3839,7 @@ class admin_setting_sitesettext extends admin_setting_configtext { * @return string empty or error message */ public function write_setting($data) { - global $DB, $SITE, $COURSE; + global $SITE, $COURSE; $data = trim($data); $validated = $this->validate($data); if ($validated !== true) { @@ -3854,15 +3852,14 @@ class admin_setting_sitesettext extends admin_setting_configtext { $record->timemodified = time(); course_get_format($SITE)->update_course_format_options($record); - $DB->update_record('course', $record); + update_course_record($record); // Reset caches. - $SITE = $DB->get_record('course', array('id'=>$SITE->id), '*', MUST_EXIST); + $SITE = get_course($SITE->id); if ($SITE->id == $COURSE->id) { $COURSE = $SITE; } format_base::reset_course_cache($SITE->id); - return ''; } } @@ -3905,7 +3902,7 @@ class admin_setting_special_frontpagedesc extends admin_setting { $record->timemodified = time(); course_get_format($SITE)->update_course_format_options($record); - $DB->update_record('course', $record); + update_course_record($record); // Reset caches. $SITE = $DB->get_record('course', array('id'=>$SITE->id), '*', MUST_EXIST); diff --git a/lib/datalib.php b/lib/datalib.php index c7ef03ca556..20fab6f9448 100644 --- a/lib/datalib.php +++ b/lib/datalib.php @@ -584,6 +584,27 @@ function get_course($courseid, $clone = true) { } } +/** + * Updates a course record in database. If the update affects the global $COURSE + * or $SITE, then these variables are also changed. + * + * @param stdClass $courserec Course record + * @throws dml_exception If error updating database + */ +function update_course_record($courserec) { + global $DB, $COURSE, $SITE; + $DB->update_record('course', $courserec); + if (!empty($COURSE->id) && $COURSE->id == $courserec->id) { + foreach ((array)$courserec as $name => $value) { + $COURSE->{$name} = $value; + } + } else if (!empty($SITE->id) && $SITE->id == $courserec->id) { + foreach ((array)$courserec as $name => $value) { + $SITE->{$name} = $value; + } + } +} + /** * Returns list of courses, for whole site, or category * diff --git a/lib/modinfolib.php b/lib/modinfolib.php index 01e80f3ce77..a199be26653 100644 --- a/lib/modinfolib.php +++ b/lib/modinfolib.php @@ -1448,19 +1448,16 @@ function rebuild_course_cache($courseid=0, $clearonly=false) { if ($clearonly) { if (empty($courseid)) { $DB->execute('UPDATE {course} set modinfo = ?, sectioncache = ?', array(null, null)); - } else { - // Clear both fields in one update - $resetobj = (object)array('id' => $courseid, 'modinfo' => null, 'sectioncache' => null); - $DB->update_record('course', $resetobj); - } - // update cached global COURSE too ;-) - if ($courseid == $COURSE->id or empty($courseid)) { + // Clear the cached globals too. $COURSE->modinfo = null; $COURSE->sectioncache = null; - } - if ($courseid == $SITE->id) { $SITE->modinfo = null; $SITE->sectioncache = null; + } else { + // Clear both fields in one update + $resetobj = (object)array('id' => $courseid, 'modinfo' => null, 'sectioncache' => null); + // Update course object including cached globals. + update_course_record($resetobj); } // reset the fast modinfo cache get_fast_modinfo($courseid, 0, true); @@ -1482,16 +1479,9 @@ function rebuild_course_cache($courseid=0, $clearonly=false) { $sectioncache = serialize(course_modinfo::build_section_cache($course->id)); $updateobj = (object)array('id' => $course->id, 'modinfo' => $modinfo, 'sectioncache' => $sectioncache); - $DB->update_record("course", $updateobj); - // update cached global COURSE too ;-) - if ($course->id == $COURSE->id) { - $COURSE->modinfo = $modinfo; - $COURSE->sectioncache = $sectioncache; - } - if ($course->id == $SITE->id) { - $SITE->modinfo = $modinfo; - $SITE->sectioncache = $sectioncache; - } + + // Update course object including cached globals. + update_course_record($updateobj); } $rs->close(); // reset the fast modinfo cache diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 5df8d152fe6..3aca3efde5d 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -5099,7 +5099,7 @@ function remove_course_contents($courseid, $showfeedback = true, array $options if (!empty($options['keep_groups_and_groupings'])) { $oldcourse->defaultgroupingid = 0; } - $DB->update_record('course', $oldcourse); + update_course_record($oldcourse); // Delete course sections and availability options. $DB->delete_records_select('course_sections_availability', diff --git a/lib/tests/accesslib_test.php b/lib/tests/accesslib_test.php index 5180bf72692..84db46882df 100644 --- a/lib/tests/accesslib_test.php +++ b/lib/tests/accesslib_test.php @@ -2433,7 +2433,7 @@ class core_accesslib_testcase extends advanced_testcase { $miscid = $DB->get_field_sql("SELECT MIN(id) FROM {course_categories}"); $categorycontext = context_coursecat::instance($miscid); $course->category = $miscid; - $DB->update_record('course', $course); + update_course_record($course); $context->update_moved($categorycontext); $context = context_course::instance($course->id); @@ -2672,7 +2672,7 @@ class core_accesslib_testcase extends advanced_testcase { $miscid = $DB->get_field_sql("SELECT MIN(id) FROM {course_categories}"); $categorycontext = context_coursecat::instance($miscid); $course->category = $miscid; - $DB->update_record('course', $course); + update_course_record($course); context_moved($context, $categorycontext); $this->assertDebuggingCalled('context_moved() is deprecated, please use context::update_moved() instead.', DEBUG_DEVELOPER); $context = context_course::instance($course->id); -- 2.43.0