Some wider caching

This commit is contained in:
moodler
2006-08-13 15:48:57 +00:00
parent e5605780cf
commit 340ea4e89e
+81 -39
View File
@@ -30,6 +30,8 @@ define('CONTEXT_GROUP', 60);
define('CONTEXT_MODULE', 70);
define('CONTEXT_BLOCK', 80);
$context_cache = array(); // Cache of all used context objects for performance (by level and instance)
$context_cache_id = array(); // Index to above cache by id
/**
* This functions get all the course categories in proper order
@@ -40,7 +42,7 @@ define('CONTEXT_BLOCK', 80);
function get_parent_cats($contextid, $type) {
$parents = array();
$context = get_record('context', 'id', $contextid);
$context = get_context_instance_by_id($contextid);
switch($type) {
@@ -95,17 +97,25 @@ function get_parent_cats($contextid, $type) {
* @param kill bool - if set, kill when the user has no capability
* @return bool
*/
function has_capability($capability, $contextid, $kill=false, $userid=NULL) {
function has_capability($capability, $contextid=NULL, $kill=false, $userid=NULL) {
global $USER;
global $USER, $CONTEXT;
if ($userid && $userid != $USER->id) { // loading other user's capability
$capabilities = load_user_capability($capability, $contextid, $userid);
$capabilities = load_user_capability($capability, $contextid, $userid);
} else {
$capabilities = $USER->capabilities;
}
$context = get_record('context','id',$contextid);
if (empty($contextid)) {
if (empty($CONTEXT)) {
return false;
} else {
$context = $CONTEXT;
}
} else {
$context = get_context_instance_by_id($contextid);
}
// Check site
$sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID);
@@ -231,7 +241,7 @@ function capability_search($capability, $contextid, $kill=false, $capabilities)
}
/* Then, we check the cache recursively */
$context = get_record('context','id',$contextid); // shared
$context = get_context_instance_by_id($contextid);
$permission = 0;
switch (context_level($contextid)) {
@@ -330,7 +340,7 @@ function load_user_capability($capability='', $contextid ='', $userid='') {
// First we generate a list of all relevant contexts of the user
if ($contextid) { // if context is specified
$context = get_record('context', 'id', $contextid);
$context = get_context_instance_by_id($contextid);
$usercontexts = get_parent_contexts($context->id);
$listofcontexts = '('.implode(',', $usercontexts).')';
@@ -530,7 +540,7 @@ function capability_prohibits($capability, $contextid, $sum='', $array='') {
return true;
}
}
$context = get_record('context', 'id', $contextid);
$context = get_context_instance_by_id($contextid);
switch (context_level($contextid)) {
case CONTEXT_SYSTEM:
@@ -804,28 +814,58 @@ function create_context($level, $instanceid) {
* @param $level
* @param $instance
*/
function get_context_instance($level, $instance=SITEID) {
function get_context_instance($level=NULL, $instance=SITEID) {
static $contexts; // Cache context lookups per page for performance
global $CONTEXT;
if (!isset($contexts)) {
$contexts = array();
/// If no level is supplied then return the current global context if there is one
if (empty($level)) {
if (empty($CONTEXT)) {
if ($CFG->debug > 7) {
notify("Error: get_context_instance() called without a context");
}
} else {
return $CONTEXT;
}
}
if (isset($contexts[$level][$instance])) { // Already cached
return $contexts[$level][$instance];
/// Check the cache
if (isset($context_cache[$level][$instance])) { // Already cached
return $context_cache[$level][$instance];
}
/// Get it from the database, or create it
if (!$context = get_record('context', 'level', $level, 'instanceid', $instance)) {
create_context($level, $instance);
$context = get_record('context', 'level', $level, 'instanceid', $instance);
}
$contexts[$level][$instance] = $context; // Cache it for later
/// Update the cache
$context_cache[$level][$instance] = $context; // Cache it for later
$context_cache_id[$context->id] = $context; // Cache it for later
return $context;
}
/**
* Get a context instance as an object, from a given id.
* @param $id
*/
function get_context_instance_by_id($id) {
if (isset($context_cache_id[$id])) { // Already cached
return $context_cache[$id];
}
if ($context = get_record('context', 'id', $id)) { // Update the cache and return
$context_cache[$context->level][$context->instance] = $context;
$context_cache_id[$context->id] = $context;
return $context;
}
return false;
}
/**
* Looks up the context level.
@@ -833,8 +873,10 @@ function get_context_instance($level, $instance=SITEID) {
* @return int
*/
function context_level($contextid) {
$context = get_record('context','id',$contextid);
return ($context->level);
if ($context = get_context_instance_by_id($contextid)) {
return $context->level;
}
return false;
}
@@ -1181,44 +1223,44 @@ function capabilities_cleanup($component, $newcapdef=NULL) {
* prints human readable context identifier.
*/
function print_context_name($contextid) {
$name = '';
$context = get_record('context', 'id', $contextid);
$context = get_context_instance_by_id($contextid);
switch ($context->level) {
switch ($context->level) {
case CONTEXT_SYSTEM: // by now it's a definite an inherit
$name = get_string('site');
break;
break;
case CONTEXT_PERSONAL:
$name = get_string('personal');
break;
break;
case CONTEXT_USERID:
if ($user = get_record('user', 'id', $context->instanceid)) {
$name = get_string('user').': '.fullname($user);
}
break;
break;
case CONTEXT_COURSECAT: // Coursecat -> coursecat or site
if ($category = get_record('course_categories', 'id', $context->instanceid)) {
$name = get_string('category').': '.$category->name;
}
break;
break;
case CONTEXT_COURSE: // 1 to 1 to course cat
if ($course = get_record('course', 'id', $context->instanceid)) {
$name = get_string('course').': '.$course->fullname;
}
break;
break;
case CONTEXT_GROUP: // 1 to 1 to course
if ($group = get_record('groups', 'id', $context->instanceid)) {
$name = get_string('group').': '.$group->name;
}
break;
break;
case CONTEXT_MODULE: // 1 to 1 to course
if ($cm = get_record('course_modules','id',$context->instanceid)) {
@@ -1228,7 +1270,7 @@ function print_context_name($contextid) {
}
}
}
break;
break;
case CONTEXT_BLOCK: // 1 to 1 to course
if ($blockinstance = get_record('block_instance','id',$context->instanceid)) {
@@ -1236,15 +1278,15 @@ function print_context_name($contextid) {
$name = get_string('blocks').': '.get_string($block->name, 'block_'.$block->name);
}
}
break;
break;
default:
error ('This is an unknown context!');
return false;
}
return $name;
return false;
}
return $name;
}
@@ -1292,7 +1334,7 @@ function fetch_context_capabilities($contextid) {
break;
case CONTEXT_MODULE: // mod caps
$context = get_record('context','id',$contextid);
$context = get_context_instance_by_id($contextid);
$cm = get_record('course_modules', 'id', $context->instanceid);
$module = get_record('modules', 'id', $cm->module);
@@ -1301,7 +1343,7 @@ function fetch_context_capabilities($contextid) {
break;
case CONTEXT_BLOCK: // block caps
$context = get_record('context','id',$contextid);
$context = get_context_instance_by_id($contextid);
$cb = get_record('block_instance', 'id', $context->instanceid);
$block = get_record('block', 'id', $cb->blockid);
@@ -1336,7 +1378,7 @@ function role_context_capabilities($roleid, $contextid) {
}
// first of all, figure out all parental contexts
$context = get_record('context', 'id', $contextid);
$context = get_context_instance_by_id($contextid);
$contexts = array_reverse(get_parent_contexts($context));
$contexts = '('.implode(',', $contexts).')';