/** * Rebuilds or resets the cached list of course activities stored in MUC. * * rebuild_course_cache() must NEVER be called from lib/db/upgrade.php. * At the same time course cache may ONLY be cleared using this function in * upgrade scripts of plugins. * * During the bulk operations if it is necessary to reset cache of multiple * courses it is enough to call {@link increment_revision_number()} for the * table 'course' and field 'cacherev' specifying affected courses in select. * * Cached course information is stored in MUC core/coursemodinfo and is * validated with the DB field {course}.cacherev * * @global moodle_database $DB * @param int $courseid id of course to rebuild, empty means all * @param boolean $clearonly only clear the cache, gets rebuild automatically on the fly. * Recommended to set to true to avoid unnecessary multiple rebuilding. */ function rebuild_course_cache($courseid=0, $clearonly=false) { global $COURSE, $SITE, $DB, $CFG; // Function rebuild_course_cache() can not be called during upgrade unless it's clear only. if (!$clearonly && !upgrade_ensure_not_running(true)) { $clearonly = true; } // Destroy navigation caches navigation_cache::destroy_volatile_caches(); if (class_exists('format_base')) { // if file containing class is not loaded, there is no cache there anyway format_base::reset_course_cache($courseid); } $cachecoursemodinfo = cache::make('core', 'coursemodinfo'); if (empty($courseid)) { // Clearing caches for all courses. increment_revision_number('course', 'cacherev', ''); $cachecoursemodinfo->purge(); course_modinfo::clear_instance_cache(); // Update global values too. $sitecacherev = $DB->get_field('course', 'cacherev', array('id' => SITEID)); $SITE->cachrev = $sitecacherev; if ($COURSE->id == SITEID) { $COURSE->cacherev = $sitecacherev; } else { $COURSE->cacherev = $DB->get_field('course', 'cacherev', array('id' => $COURSE->id)); } } else { // Clearing cache for one course, make sure it is deleted from user request cache as well. increment_revision_number('course', 'cacherev', 'id = :id', array('id' => $courseid)); $cachecoursemodinfo->delete($courseid); course_modinfo::clear_instance_cache($courseid); // Update global values too. if ($courseid == $COURSE->id || $courseid == $SITE->id) { $cacherev = $DB->get_field('course', 'cacherev', array('id' => $courseid)); if ($courseid == $COURSE->id) { $COURSE->cacherev = $cacherev; } if ($courseid == $SITE->id) { $SITE->cachrev = $cacherev; } } } if ($clearonly) { return; } if ($courseid) { $select = array('id'=>$courseid); } else { $select = array(); core_php_time_limit::raise(); // this could take a while! MDL-10954 } $rs = $DB->get_recordset("course", $select,'','id,'.join(',', course_modinfo::$cachedfields)); // Rebuild cache for each course. foreach ($rs as $course) { course_modinfo::build_course_cache($course); } $rs->close(); }
/** * Rebuilds the cached list of course activities stored in the database * @param int $courseid - id of course to rebuild, empty means all * @param boolean $clearonly - only clear the modinfo fields, gets rebuild automatically on the fly */ function rebuild_course_cache($courseid = 0, $clearonly = false) { global $COURSE, $SITE, $DB, $CFG; // Destroy navigation caches navigation_cache::destroy_volatile_caches(); if (class_exists('format_base')) { // if file containing class is not loaded, there is no cache there anyway format_base::reset_course_cache($courseid); } if ($clearonly) { if (empty($courseid)) { $DB->set_field('course', 'modinfo', null); $DB->set_field('course', 'sectioncache', 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)) { $COURSE->modinfo = null; $COURSE->sectioncache = null; } if ($courseid == $SITE->id) { $SITE->modinfo = null; $SITE->sectioncache = null; } // reset the fast modinfo cache get_fast_modinfo($courseid, 0, true); return; } require_once "{$CFG->dirroot}/course/lib.php"; if ($courseid) { $select = array('id' => $courseid); } else { $select = array(); @set_time_limit(0); // this could take a while! MDL-10954 } $rs = $DB->get_recordset("course", $select, '', 'id,fullname'); foreach ($rs as $course) { $modinfo = serialize(get_array_of_activities($course->id)); $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; } } $rs->close(); // reset the fast modinfo cache get_fast_modinfo($courseid, 0, true); }
/** * Rebuilds the cached list of course activities stored in the database * @param int $courseid - id of course to rebuild, empty means all * @param boolean $clearonly - only clear the modinfo fields, gets rebuild automatically on the fly */ function rebuild_course_cache($courseid = 0, $clearonly = false) { global $COURSE, $DB, $CFG; // Destroy navigation caches navigation_cache::destroy_volatile_caches(); if ($clearonly) { if (empty($courseid)) { $courseselect = array(); } else { $courseselect = array('id' => $courseid); } $DB->set_field('course', 'modinfo', null, $courseselect); // update cached global COURSE too ;-) if ($courseid == $COURSE->id or empty($courseid)) { $COURSE->modinfo = null; } // reset the fast modinfo cache $reset = 'reset'; get_fast_modinfo($reset); return; } require_once "{$CFG->dirroot}/course/lib.php"; if ($courseid) { $select = array('id' => $courseid); } else { $select = array(); @set_time_limit(0); // this could take a while! MDL-10954 } $rs = $DB->get_recordset("course", $select, '', 'id,fullname'); foreach ($rs as $course) { $modinfo = serialize(get_array_of_activities($course->id)); $DB->set_field("course", "modinfo", $modinfo, array("id" => $course->id)); // update cached global COURSE too ;-) if ($course->id == $COURSE->id) { $COURSE->modinfo = $modinfo; } } $rs->close(); // reset the fast modinfo cache $reset = 'reset'; get_fast_modinfo($reset); }
/** * Rebuilds the cached list of course activities stored in the database * @param int $courseid - id of course to rebuild, empty means all * @param boolean $clearonly - only clear the modinfo fields, gets rebuild automatically on the fly */ function rebuild_course_cache($courseid=0, $clearonly=false) { global $COURSE, $DB, $CFG; if (!$clearonly && !empty($CFG->upgraderunning)) { debugging('Function rebuild_course_cache() should not be called from upgrade script unless with argument clearonly.', DEBUG_DEVELOPER); $clearonly = true; } // Destroy navigation caches navigation_cache::destroy_volatile_caches(); if ($clearonly) { if (empty($courseid)) { $DB->set_field('course', 'modinfo', null); $DB->set_field('course', 'sectioncache', 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)) { $COURSE->modinfo = null; $COURSE->sectioncache = null; } // reset the fast modinfo cache $reset = 'reset'; get_fast_modinfo($reset); return; } require_once("$CFG->dirroot/course/lib.php"); if ($courseid) { $select = array('id'=>$courseid); } else { $select = array(); @set_time_limit(0); // this could take a while! MDL-10954 } $rs = $DB->get_recordset("course", $select,'','id,fullname'); foreach ($rs as $course) { $modinfo = serialize(get_array_of_activities($course->id)); $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; } } $rs->close(); // reset the fast modinfo cache $reset = 'reset'; get_fast_modinfo($reset); }