MDL-31072: Fixed bug causing memory overflow for many-user systems:

when function find_users was supposed to be used for user validation but no userids were passed to it, it retrieved all users in the system.
This caused memory overflow on systems with too many users (like moodle.org).
Now we make sure that find_users is not called for validation if there is nobody to validate.

Also improved query inside find_users to make it work faster
This commit is contained in:
Marina Glancy
2012-01-19 18:35:34 +01:00
committed by kordan
parent 41fb628f93
commit 037ef684a3
2 changed files with 9 additions and 11 deletions
+4 -6
View File
@@ -1044,10 +1044,9 @@ class potential_assignees_below_course extends role_assign_user_selector_base {
$sql = " FROM {user} u
WHERE u.id IN ($enrolsql) $wherecondition
AND u.id NOT IN (
SELECT u.id
FROM {role_assignments} r, {user} u
SELECT r.userid
FROM {role_assignments} r
WHERE r.contextid = :contextid
AND u.id = r.userid
AND r.roleid = :roleid)";
$order = ' ORDER BY lastname ASC, firstname ASC';
@@ -1096,10 +1095,9 @@ class potential_assignees_course_and_above extends role_assign_user_selector_bas
$sql = " FROM {user}
WHERE $wherecondition
AND id NOT IN (
SELECT u.id
FROM {role_assignments} r, {user} u
SELECT r.userid
FROM {role_assignments} r
WHERE r.contextid = :contextid
AND u.id = r.userid
AND r.roleid = :roleid)";
$order = ' ORDER BY lastname ASC, firstname ASC';
+5 -5
View File
@@ -369,13 +369,13 @@ abstract class user_selector_base {
// See if we got anything.
if ($this->multiselect) {
$userids = optional_param_array($this->name, array(), PARAM_INTEGER);
} else {
$userid = optional_param($this->name, 0, PARAM_INTEGER);
if (empty($userid)) {
return array();
}
} else if ($userid = optional_param($this->name, 0, PARAM_INTEGER)) {
$userids = array($userid);
}
// If there are no users there is nobody to load
if (empty($userids)) {
return array();
}
// If we did, use the find_users method to validate the ids.
$this->validatinguserids = $userids;