diff options
author | Carl Schwan <carl@carlschwan.eu> | 2022-04-05 18:57:55 +0200 |
---|---|---|
committer | Carl Schwan <carl@carlschwan.eu> | 2022-04-05 19:29:54 +0200 |
commit | 9cb992e93c7c0fbf816323381f8ee082cf3f073f (patch) | |
tree | e2bf00ec4d7361a82600bf051ff5286436536168 | |
parent | 9c84aa5870204a871024ca18b4994ed40defdd9b (diff) | |
download | nextcloud-server-9cb992e93c7c0fbf816323381f8ee082cf3f073f.tar.gz nextcloud-server-9cb992e93c7c0fbf816323381f8ee082cf3f073f.zip |
Cache account information
Currently, each field of the profile settings is fetching the account
information. This patch makes it so that only the first time do a DB call
and all the later ones are cached.
Reduce by 5 queries when loading the profile setting page and I suppose
other pages are affected since loading a page generates always fetch at
least once the account information to see if the profile feature is enabled
for the user.
Signed-off-by: Carl Schwan <carl@carlschwan.eu>
-rw-r--r-- | lib/private/Accounts/AccountManager.php | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/private/Accounts/AccountManager.php b/lib/private/Accounts/AccountManager.php index 127adc9ef38..5792ba1dc5d 100644 --- a/lib/private/Accounts/AccountManager.php +++ b/lib/private/Accounts/AccountManager.php @@ -41,6 +41,7 @@ use libphonenumber\PhoneNumber; use libphonenumber\PhoneNumberFormat; use libphonenumber\PhoneNumberUtil; use OC\Profile\TProfileHelper; +use OC\Cache\CappedMemoryCache; use OCA\Settings\BackgroundJobs\VerifyUserData; use OCP\Accounts\IAccount; use OCP\Accounts\IAccountManager; @@ -116,6 +117,7 @@ class AccountManager implements IAccountManager { private $crypto; /** @var IFactory */ private $l10nfactory; + private CappedMemoryCache $internalCache; public function __construct( IDBConnection $connection, @@ -142,6 +144,7 @@ class AccountManager implements IAccountManager { $this->crypto = $crypto; // DIing IL10N results in a dependency loop $this->l10nfactory = $factory; + $this->internalCache = new CappedMemoryCache(); } /** @@ -763,7 +766,12 @@ class AccountManager implements IAccountManager { } public function getAccount(IUser $user): IAccount { - return $this->parseAccountData($user, $this->getUser($user)); + if ($this->internalCache->hasKey($user->getUID())) { + return $this->internalCache->get($user->getUID()); + } + $account = $this->parseAccountData($user, $this->getUser($user)); + $this->internalCache->set($user->getUID(), $account); + return $account; } public function updateAccount(IAccount $account): void { @@ -813,5 +821,6 @@ class AccountManager implements IAccountManager { } $this->updateUser($account->getUser(), $data, true); + $this->internalCache->set($account->getUser()->getUID(), $account); } } |