Skip to content

Commit

Permalink
MDL-46682 auth/db: Increase of chunk size and update change.
Browse files Browse the repository at this point in the history
The update query was not checking the mnet auth id and could
have been updating the wrong entry.
  • Loading branch information
abgreeve committed Jul 6, 2016
1 parent 6f08f36 commit 3261b9e
Showing 1 changed file with 8 additions and 7 deletions.
15 changes: 8 additions & 7 deletions auth/db/auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -303,19 +303,19 @@ function sync_users(progress_trace $trace, $do_updates=false) {
// Find obsolete users.
if (count($userlist)) {
$remove_users = array();
// Oracle IN clause is limited to 1000 parameters. We need to chunk the SQL.
$userlistchunks = array_chunk($userlist , 999);
// All the drivers can cope with chunks of 10,000. See line 4491 of lib/dml/tests/dml_est.php
$userlistchunks = array_chunk($userlist , 10000);
foreach($userlistchunks as $userlistchunk) {
list($notin_sql, $params) = $DB->get_in_or_equal($userlistchunk, SQL_PARAMS_NAMED, 'u', false);
$params['authtype'] = $this->authtype;
$sql = "SELECT u.*
$sql = "SELECT u.id, u.username
FROM {user} u
WHERE u.auth=:authtype AND u.deleted=0 AND u.mnethostid=:mnethostid $suspendselect AND u.username $notin_sql";
$params['mnethostid'] = $CFG->mnet_localhost_id;
$remove_users = $remove_users + $DB->get_records_sql($sql, $params);
}
} else {
$sql = "SELECT u.*
$sql = "SELECT u.id, u.username
FROM {user} u
WHERE u.auth=:authtype AND u.deleted=0 AND u.mnethostid=:mnethostid $suspendselect";
$params = array();
Expand Down Expand Up @@ -366,14 +366,15 @@ function sync_users(progress_trace $trace, $do_updates=false) {
// Only go ahead if we actually have fields to update locally.
if (!empty($updatekeys)) {
$update_users = array();
// Oracle IN clause is limited to 1000 parameters. We need to chunk the SQL.
$userlistchunks = array_chunk($userlist , 999);
// All the drivers can cope with chunks of 10,000. See line 4491 of lib/dml/tests/dml_est.php
$userlistchunks = array_chunk($userlist , 10000);
foreach($userlistchunks as $userlistchunk) {
list($in_sql, $params) = $DB->get_in_or_equal($userlistchunk, SQL_PARAMS_NAMED, 'u', true);
$params['authtype'] = $this->authtype;
$params['mnethostid'] = $CFG->mnet_localhost_id;
$sql = "SELECT u.id, u.username
FROM {user} u
WHERE u.auth=:authtype AND u.deleted=0 AND u.username {$in_sql}";
WHERE u.auth = :authtype AND u.deleted = 0 AND u.mnethostid = :mnethostid AND u.username {$in_sql}";
$update_users = $update_users + $DB->get_records_sql($sql, $params);
}

Expand Down

0 comments on commit 3261b9e

Please sign in to comment.