diff options
author | Julius Härtl <jus@bitgrid.net> | 2022-03-23 13:52:47 +0100 |
---|---|---|
committer | Julius Härtl <jus@bitgrid.net> | 2022-04-04 09:02:56 +0200 |
commit | 40f1ad60c245bfe35998b718aab2fe0f726f3798 (patch) | |
tree | e98cc8e991ef582f330db2235f54155223ef4121 /lib/private/Files/Lock | |
parent | 94004a7bd40e8527b3b89d954c32529ab13efbdc (diff) | |
download | nextcloud-server-40f1ad60c245bfe35998b718aab2fe0f726f3798.tar.gz nextcloud-server-40f1ad60c245bfe35998b718aab2fe0f726f3798.zip |
Add public API for owner based locking
Signed-off-by: Julius Härtl <jus@bitgrid.net>
Diffstat (limited to 'lib/private/Files/Lock')
-rw-r--r-- | lib/private/Files/Lock/LockManager.php | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/private/Files/Lock/LockManager.php b/lib/private/Files/Lock/LockManager.php new file mode 100644 index 00000000000..59022613fdb --- /dev/null +++ b/lib/private/Files/Lock/LockManager.php @@ -0,0 +1,72 @@ +<?php + +namespace OC\Files\Lock; + +use OCP\Files\Lock\ILock; +use OCP\Files\Lock\ILockManager; +use OCP\Files\Lock\ILockProvider; +use OCP\Files\Lock\LockScope; +use OCP\PreConditionNotMetException; + +class LockManager implements ILockManager { + private ?ILockProvider $lockProvider = null; + private ?LockScope $lockInScope = null; + + public function registerLockProvider(ILockProvider $lockProvider): void { + if ($this->lockProvider) { + throw new PreConditionNotMetException('There is already a registered lock provider'); + } + + $this->lockProvider = $lockProvider; + } + + public function isLockProviderAvailable(): bool { + return $this->lockProvider !== null; + } + + public function runInScope(LockScope $lock, callable $callback): void { + if (!$this->lockProvider) { + $callback(); + return; + } + + if ($this->lockInScope) { + throw new PreConditionNotMetException('Could not obtain lock scope as already in use by ' . $this->lockInScope); + } + + try { + $this->lockInScope = $lock; + $callback(); + } finally { + $this->lockInScope = null; + } + } + + public function getLockInScope(): ?LockScope { + return $this->lockInScope; + } + + public function getLocks(int $fileId): array { + if (!$this->lockProvider) { + throw new PreConditionNotMetException('No lock provider available'); + } + + return $this->lockProvider->getLocks($fileId); + } + + public function lock(LockScope $lockInfo): ILock { + if (!$this->lockProvider) { + throw new PreConditionNotMetException('No lock provider available'); + } + + return $this->lockProvider->lock($lockInfo); + } + + public function unlock(LockScope $lockInfo): void { + if (!$this->lockProvider) { + throw new PreConditionNotMetException('No lock provider available'); + } + + $this->lockProvider->unlock($lockInfo); + } +} |