-
Improvement
-
Resolution: Fixed
-
Minor
-
None
-
2.9.6
-
None
-
MOODLE_29_STABLE
Hello
My English ability is very poor. I am sorry.
I use moodle 2.9.4. My students take 5 seconds to login.
I think it is " get_user_access_sitewide() " funtion on accesslib.php
I change mysql query.
it is origin source (866 line, get_user_access_sitewide, accesslib.php, moodle 2.9.4)
foreach ($raparents as $roleid=>$ras) {
$cp++;
list($sqlcids, $cids) = $DB->get_in_or_equal($ras, SQL_PARAMS_NAMED, 'c'.$cp.'_');
$params = array_merge($params, $cids);
$params['r'.$cp] = $roleid;
$sqls[] = "(SELECT ctx.path, rc.roleid, rc.capability, rc.permission
FROM
{role_capabilities} rcJOIN {context} ctx
ON (ctx.id = rc.contextid)
JOIN {context} pctx
ON (pctx.id $sqlcids
AND (ctx.id = pctx.id
OR ctx.path LIKE ".$DB->sql_concat('pctx.path',"'/%'")."
OR pctx.path LIKE ".$DB->sql_concat('ctx.path',"'/%'")."))
LEFT JOIN {block_instances} bi
ON (ctx.contextlevel = ".CONTEXT_BLOCK." AND bi.id = ctx.instanceid)
LEFT JOIN {context} bpctx
ON (bpctx.id = bi.parentcontextid)
WHERE rc.roleid = :r{$cp}
AND (ctx.contextlevel <= ".CONTEXT_COURSE." OR bpctx.contextlevel < ".CONTEXT_COURSE.")
)";
}
I change.
foreach ($raparents as $roleid=>$ras) {
$cp++;
list($sqlcids, $cids) = $DB->get_in_or_equal($ras, SQL_PARAMS_NAMED, 'c'.$cp.'_');
$params = array_merge($params, $cids);
$params['r1'.$cp] = $roleid;
$params['r2'.$cp] = $roleid;
$params['r3'.$cp] = $roleid;
$sqls[] = "(SELECT ctx.path, rc.roleid, rc.capability, rc.permission
FROM (SELECT contextid FROM mdl_role_capabilities rc2
WHERE rc2.roleid = :r1{$cp}
GROUP BY contextid) rc2
JOIN {context} ctx
ON (ctx.id = rc2.contextid)
JOIN {context} pctx
ON (pctx.id $sqlcids
AND (ctx.id = pctx.id
OR ctx.path LIKE ".$DB->sql_concat('pctx.path',"'/%'")."
OR pctx.path LIKE ".$DB->sql_concat('ctx.path',"'/%'")."))
JOIN {role_capabilities}
rc
ON (rc2.contextid = rc.contextid AND rc.roleid = :r2{$cp})
LEFT JOIN
{block_instances}bi
ON (ctx.contextlevel = ".CONTEXT_BLOCK." AND bi.id = ctx.instanceid)
LEFT JOIN
{context}bpctx
ON (bpctx.id = bi.parentcontextid)
WHERE rc.roleid = :r3{$cp}
AND (ctx.contextlevel <= ".CONTEXT_COURSE." OR bpctx.contextlevel < ".CONTEXT_COURSE.")
)";
}
I want to know It is OK?
please verify my source code
- will be (partly) resolved by
-
MDL-49398 Role definition caching & accesslib refactoring
-
- Closed
-