Merge pull request #34471 from starypatyk/dav_read_share_notes

Reduce number of database queries during WebDAV propfind request
This commit is contained in:
Vincent Petry 2022-10-14 15:33:13 +02:00 committed by GitHub
commit 95d45c2058
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 15 deletions

View file

@ -355,23 +355,19 @@ abstract class Node implements \Sabre\DAV\INode {
return '';
}
$types = [
IShare::TYPE_USER,
IShare::TYPE_GROUP,
IShare::TYPE_CIRCLE,
IShare::TYPE_ROOM
];
foreach ($types as $shareType) {
$shares = $this->shareManager->getSharedWith($user, $shareType, $this, -1);
foreach ($shares as $share) {
$note = $share->getNote();
if ($share->getShareOwner() !== $user && !empty($note)) {
return $note;
}
}
// Retrieve note from the share object already loaded into
// memory, to avoid additional database queries.
$storage = $this->getNode()->getStorage();
if (!$storage->instanceOfStorage(\OCA\Files_Sharing\SharedStorage::class)) {
return '';
}
/** @var \OCA\Files_Sharing\SharedStorage $storage */
$share = $storage->getShare();
$note = $share->getNote();
if ($share->getShareOwner() !== $user) {
return $note;
}
return '';
}

View file

@ -229,6 +229,13 @@ class MountProvider implements IMountProvider {
->setShareType($shares[0]->getShareType())
->setTarget($shares[0]->getTarget());
// Gather notes from all the shares.
// Since these are readly available here, storing them
// enables the DAV FilesPlugin to avoid executing many
// DB queries to retrieve the same information.
$allNotes = implode("\n", array_map(function ($sh) { return $sh->getNote(); }, $shares));
$superShare->setNote($allNotes);
// use most permissive permissions
// this covers the case where there are multiple shares for the same
// file e.g. from different groups and different permissions