aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+studip@gmail.com>2023-02-21 15:17:26 +0000
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2023-02-21 15:17:26 +0000
commitfa07240be6a9644e47a79233d0011e97533f1c21 (patch)
tree8a7471226d5d7b86ee5f023067b75962daa83c40
parentbb6445bf676b4a480fd050d482bab1238089fa5a (diff)
let RolePersistence cache the loaded roles in memory as well, fixes #2201
Closes #2201 Merge request studip/studip!1434
-rw-r--r--lib/plugins/db/RolePersistence.class.php37
1 files changed, 21 insertions, 16 deletions
diff --git a/lib/plugins/db/RolePersistence.class.php b/lib/plugins/db/RolePersistence.class.php
index ff17a94..bc8490b 100644
--- a/lib/plugins/db/RolePersistence.class.php
+++ b/lib/plugins/db/RolePersistence.class.php
@@ -17,6 +17,8 @@ class RolePersistence
const USER_ROLES_CACHE_KEY = 'roles/user';
const PLUGIN_ROLES_CACHE_KEY = 'roles/plugin';
+ protected static $all_roles = null;
+
/**
* Returns all available roles.
*
@@ -24,32 +26,34 @@ class RolePersistence
*/
public static function getAllRoles(bool $grouped = false): array
{
- // read cache
- $cache = StudipCacheFactory::getCache();
-
- // cache miss, retrieve from database
- $roles = $cache->read(self::ROLES_CACHE_KEY);
- if (!$roles) {
- $query = "SELECT `roleid`, `rolename`, `system` = 'y' AS `is_system`
+ if (self::$all_roles === null) {
+ // read cache
+ $cache = StudipCacheFactory::getCache();
+
+ // cache miss, retrieve from database
+ self::$all_roles = $cache->read(self::ROLES_CACHE_KEY);
+ if (!self::$all_roles) {
+ $query = "SELECT `roleid`, `rolename`, `system` = 'y' AS `is_system`
FROM `roles`
ORDER BY `rolename`";
- $statement = DBManager::get()->query($query);
- $statement->setFetchMode(PDO::FETCH_ASSOC);
+ $statement = DBManager::get()->query($query);
+ $statement->setFetchMode(PDO::FETCH_ASSOC);
- $roles = [];
- foreach ($statement as $row) {
- $roles[$row['roleid']] = new Role($row['roleid'], $row['rolename'], $row['is_system']);
- }
+ self::$all_roles = [];
+ foreach ($statement as $row) {
+ self::$all_roles[$row['roleid']] = new Role($row['roleid'], $row['rolename'], $row['is_system']);
+ }
- $cache->write(self::ROLES_CACHE_KEY, $roles);
+ $cache->write(self::ROLES_CACHE_KEY, self::$all_roles);
+ }
}
if (!$grouped) {
- return $roles;
+ return self::$all_roles;
}
$groups = ['system' => [], 'other' => []];
- foreach ($roles as $id => $role) {
+ foreach (self::$all_roles as $id => $role) {
$index = $role->getSystemtype() ? 'system' : 'other';
$groups[$index][$id] = $role;
}
@@ -510,6 +514,7 @@ class RolePersistence
*/
public static function expireRolesCache()
{
+ self::$all_roles = null;
StudipCacheFactory::getCache()->expire(self::ROLES_CACHE_KEY);
}