Merge branch 'MDL-84070-user-pref-race-bug-v2' of https://github.com/brendanheywood/moodle
This commit is contained in:
+23
-12
@@ -1522,19 +1522,30 @@ function set_user_preference($name, $value, $user = null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($preference = $DB->get_record('user_preferences', array('userid' => $user->id, 'name' => $name))) {
|
||||
if ($preference->value === $value and isset($user->preference[$name]) and $user->preference[$name] === $value) {
|
||||
// Preference already set to this value.
|
||||
return true;
|
||||
}
|
||||
$DB->set_field('user_preferences', 'value', $value, array('id' => $preference->id));
|
||||
$retry = 0;
|
||||
$saved = false;
|
||||
|
||||
} else {
|
||||
$preference = new stdClass();
|
||||
$preference->userid = $user->id;
|
||||
$preference->name = $name;
|
||||
$preference->value = $value;
|
||||
$DB->insert_record('user_preferences', $preference);
|
||||
while (!$saved && $retry++ < 2) {
|
||||
if ($preference = $DB->get_record('user_preferences', ['userid' => $user->id, 'name' => $name])) {
|
||||
if ($preference->value === $value && isset($user->preference[$name]) && $user->preference[$name] === $value) {
|
||||
// Preference already set to this value.
|
||||
return true;
|
||||
}
|
||||
$DB->set_field('user_preferences', 'value', $value, ['id' => $preference->id]);
|
||||
$saved = true;
|
||||
} else {
|
||||
$preference = new stdClass();
|
||||
$preference->userid = $user->id;
|
||||
$preference->name = $name;
|
||||
$preference->value = $value;
|
||||
try {
|
||||
$DB->insert_record('user_preferences', $preference);
|
||||
$saved = true;
|
||||
} catch (dml_write_exception $e) {
|
||||
// We have an insert race, so just ignore and try again.
|
||||
$saved = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update value in cache.
|
||||
|
||||
Reference in New Issue
Block a user