diff options
author | Robin Appelman <robin@icewind.nl> | 2022-02-02 16:12:57 +0100 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2022-02-23 18:02:33 +0100 |
commit | cfb7923e08ba1902fa5a5f72205cfcbb767b54ad (patch) | |
tree | 1641f6d5c32d3e4c822bac90ceab2d6f326797b6 /lib/private/Files/Config | |
parent | 692da9236bde4a0d6d78cf8ee44bd574fec5b623 (diff) | |
download | nextcloud-server-cfb7923e08ba1902fa5a5f72205cfcbb767b54ad.tar.gz nextcloud-server-cfb7923e08ba1902fa5a5f72205cfcbb767b54ad.zip |
store mountprovider for each mount in the mounts table
this enabled more fine grained filesystem setup
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib/private/Files/Config')
-rw-r--r-- | lib/private/Files/Config/CachedMountFileInfo.php | 17 | ||||
-rw-r--r-- | lib/private/Files/Config/CachedMountInfo.php | 21 | ||||
-rw-r--r-- | lib/private/Files/Config/LazyStorageMountInfo.php | 4 | ||||
-rw-r--r-- | lib/private/Files/Config/UserMountCache.php | 34 |
4 files changed, 60 insertions, 16 deletions
diff --git a/lib/private/Files/Config/CachedMountFileInfo.php b/lib/private/Files/Config/CachedMountFileInfo.php index 7fdc26f7d53..71a6ddb9ea9 100644 --- a/lib/private/Files/Config/CachedMountFileInfo.php +++ b/lib/private/Files/Config/CachedMountFileInfo.php @@ -30,12 +30,21 @@ class CachedMountFileInfo extends CachedMountInfo implements ICachedMountFileInf /** @var string */ private $internalPath; - public function __construct(IUser $user, $storageId, $rootId, $mountPoint, $mountId, $rootInternalPath, $internalPath) { - parent::__construct($user, $storageId, $rootId, $mountPoint, $mountId, $rootInternalPath); + public function __construct( + IUser $user, + int $storageId, + int $rootId, + string $mountPoint, + ?int $mountId, + string $mountProvider, + string $rootInternalPath, + string $internalPath + ) { + parent::__construct($user, $storageId, $rootId, $mountPoint, $mountProvider, $mountId, $rootInternalPath); $this->internalPath = $internalPath; } - public function getInternalPath() { + public function getInternalPath(): string { if ($this->getRootInternalPath()) { return substr($this->internalPath, strlen($this->getRootInternalPath()) + 1); } else { @@ -43,7 +52,7 @@ class CachedMountFileInfo extends CachedMountInfo implements ICachedMountFileInf } } - public function getPath() { + public function getPath(): string { return $this->getMountPoint() . $this->getInternalPath(); } } diff --git a/lib/private/Files/Config/CachedMountInfo.php b/lib/private/Files/Config/CachedMountInfo.php index e7e10cfe2af..c70dba100a4 100644 --- a/lib/private/Files/Config/CachedMountInfo.php +++ b/lib/private/Files/Config/CachedMountInfo.php @@ -58,6 +58,9 @@ class CachedMountInfo implements ICachedMountInfo { */ protected $rootInternalPath; + /** @var string */ + protected $mountProvider; + /** * CachedMountInfo constructor. * @@ -68,13 +71,25 @@ class CachedMountInfo implements ICachedMountInfo { * @param int|null $mountId * @param string $rootInternalPath */ - public function __construct(IUser $user, $storageId, $rootId, $mountPoint, $mountId = null, $rootInternalPath = '') { + public function __construct( + IUser $user, + int $storageId, + int $rootId, + string $mountPoint, + string $mountProvider, + int $mountId = null, + string $rootInternalPath = '' + ) { $this->user = $user; $this->storageId = $storageId; $this->rootId = $rootId; $this->mountPoint = $mountPoint; $this->mountId = $mountId; $this->rootInternalPath = $rootInternalPath; + if (strlen($mountProvider) > 128) { + throw new \Exception("Mount provider $mountProvider name exceeds the limit of 128 characters"); + } + $this->mountProvider = $mountProvider; } /** @@ -138,4 +153,8 @@ class CachedMountInfo implements ICachedMountInfo { public function getRootInternalPath() { return $this->rootInternalPath; } + + public function getMountProvider(): string { + return $this->mountProvider; + } } diff --git a/lib/private/Files/Config/LazyStorageMountInfo.php b/lib/private/Files/Config/LazyStorageMountInfo.php index bfd632c5f6e..fd3bbcbe0fb 100644 --- a/lib/private/Files/Config/LazyStorageMountInfo.php +++ b/lib/private/Files/Config/LazyStorageMountInfo.php @@ -81,4 +81,8 @@ class LazyStorageMountInfo extends CachedMountInfo { public function getRootInternalPath() { return $this->mount->getInternalPath($this->mount->getMountPoint()); } + + public function getMountProvider(): string { + return $this->mount->getMountProvider(); + } } diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index 71eb918a58c..dc2640361e7 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -164,7 +164,8 @@ class UserMountCache implements IUserMountCache { if ( $newMount->getMountPoint() !== $cachedMount->getMountPoint() || $newMount->getStorageId() !== $cachedMount->getStorageId() || - $newMount->getMountId() !== $cachedMount->getMountId() + $newMount->getMountId() !== $cachedMount->getMountId() || + $newMount->getMountProvider() !== $cachedMount->getMountProvider() ) { $changed[] = $newMount; } @@ -180,7 +181,8 @@ class UserMountCache implements IUserMountCache { 'root_id' => $mount->getRootId(), 'user_id' => $mount->getUser()->getUID(), 'mount_point' => $mount->getMountPoint(), - 'mount_id' => $mount->getMountId() + 'mount_id' => $mount->getMountId(), + 'mount_provider_class' => $mount->getMountProvider(), ], ['root_id', 'user_id']); } else { // in some cases this is legitimate, like orphaned shares @@ -195,6 +197,7 @@ class UserMountCache implements IUserMountCache { ->set('storage_id', $builder->createNamedParameter($mount->getStorageId())) ->set('mount_point', $builder->createNamedParameter($mount->getMountPoint())) ->set('mount_id', $builder->createNamedParameter($mount->getMountId(), IQueryBuilder::PARAM_INT)) + ->set('mount_provider_class', $builder->createNamedParameter($mount->getMountProvider())) ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($mount->getUser()->getUID()))) ->andWhere($builder->expr()->eq('root_id', $builder->createNamedParameter($mount->getRootId(), IQueryBuilder::PARAM_INT))); @@ -219,7 +222,15 @@ class UserMountCache implements IUserMountCache { if (!is_null($mount_id)) { $mount_id = (int)$mount_id; } - return new CachedMountInfo($user, (int)$row['storage_id'], (int)$row['root_id'], $row['mount_point'], $mount_id, isset($row['path']) ? $row['path'] : ''); + return new CachedMountInfo( + $user, + (int)$row['storage_id'], + (int)$row['root_id'], + $row['mount_point'], + $row['mount_provider_class'] ?? '', + $mount_id, + isset($row['path']) ? $row['path'] : '', + ); } /** @@ -229,7 +240,7 @@ class UserMountCache implements IUserMountCache { public function getMountsForUser(IUser $user) { if (!isset($this->mountsForUsers[$user->getUID()])) { $builder = $this->connection->getQueryBuilder(); - $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path') + $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path', 'mount_provider_class') ->from('mounts', 'm') ->innerJoin('m', 'filecache', 'f', $builder->expr()->eq('m.root_id', 'f.fileid')) ->where($builder->expr()->eq('user_id', $builder->createPositionalParameter($user->getUID()))); @@ -250,7 +261,7 @@ class UserMountCache implements IUserMountCache { */ public function getMountsForStorageId($numericStorageId, $user = null) { $builder = $this->connection->getQueryBuilder(); - $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path') + $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path', 'mount_provider_class') ->from('mounts', 'm') ->innerJoin('m', 'filecache', 'f', $builder->expr()->eq('m.root_id', 'f.fileid')) ->where($builder->expr()->eq('storage_id', $builder->createPositionalParameter($numericStorageId, IQueryBuilder::PARAM_INT))); @@ -272,7 +283,7 @@ class UserMountCache implements IUserMountCache { */ public function getMountsForRootId($rootFileId) { $builder = $this->connection->getQueryBuilder(); - $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path') + $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path', 'mount_provider_class') ->from('mounts', 'm') ->innerJoin('m', 'filecache', 'f', $builder->expr()->eq('m.root_id', 'f.fileid')) ->where($builder->expr()->eq('root_id', $builder->createPositionalParameter($rootFileId, IQueryBuilder::PARAM_INT))); @@ -286,10 +297,10 @@ class UserMountCache implements IUserMountCache { /** * @param $fileId - * @return array + * @return array{int, string, int} * @throws \OCP\Files\NotFoundException */ - private function getCacheInfoFromFileId($fileId) { + private function getCacheInfoFromFileId($fileId): array { if (!isset($this->cacheInfoCache[$fileId])) { $builder = $this->connection->getQueryBuilder(); $query = $builder->select('storage', 'path', 'mimetype') @@ -303,7 +314,7 @@ class UserMountCache implements IUserMountCache { if (is_array($row)) { $this->cacheInfoCache[$fileId] = [ (int)$row['storage'], - $row['path'], + (string)$row['path'], (int)$row['mimetype'] ]; } else { @@ -326,7 +337,7 @@ class UserMountCache implements IUserMountCache { return []; } $builder = $this->connection->getQueryBuilder(); - $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path') + $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path', 'mount_provider_class') ->from('mounts', 'm') ->innerJoin('m', 'filecache', 'f', $builder->expr()->eq('m.root_id', 'f.fileid')) ->where($builder->expr()->eq('storage_id', $builder->createPositionalParameter($storageId, IQueryBuilder::PARAM_INT))); @@ -343,7 +354,7 @@ class UserMountCache implements IUserMountCache { if ($fileId === (int)$row['root_id']) { return true; } - $internalMountPath = isset($row['path']) ? $row['path'] : ''; + $internalMountPath = $row['path'] ?? ''; return $internalMountPath === '' || substr($internalPath, 0, strlen($internalMountPath) + 1) === $internalMountPath . '/'; }); @@ -356,6 +367,7 @@ class UserMountCache implements IUserMountCache { $mount->getRootId(), $mount->getMountPoint(), $mount->getMountId(), + $mount->getMountProvider(), $mount->getRootInternalPath(), $internalPath ); |