Merge branch 'MDL-84070-user-pref-race-bug-v2' of https://github.com/brendanheywood/moodle

This commit is contained in:
Huong Nguyen
2025-04-22 08:37:48 +07:00
+23 -12
View File
@@ -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.