summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2023-12-04 13:26:47 +0100
committerbackportbot-nextcloud[bot] <backportbot-nextcloud[bot]@users.noreply.github.com>2023-12-04 13:58:40 +0000
commit4ce175b88f7706b64855f0ef3dc7eeb794bee654 (patch)
tree53fc74f622a3088ed43f2ce1a21eee9fd25ed1ba /lib
parenta5eaa5631495128cf7ff18649b0803c346801b33 (diff)
downloadnextcloud-server-4ce175b88f7706b64855f0ef3dc7eeb794bee654.tar.gz
nextcloud-server-4ce175b88f7706b64855f0ef3dc7eeb794bee654.zip
fix(metadata): Allow to load metadata of multiple files at once
Signed-off-by: Joas Schilling <coding@schilljs.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/private/FilesMetadata/FilesMetadataManager.php13
-rw-r--r--lib/private/FilesMetadata/Service/MetadataRequestService.php34
-rw-r--r--lib/public/FilesMetadata/IFilesMetadataManager.php14
3 files changed, 60 insertions, 1 deletions
diff --git a/lib/private/FilesMetadata/FilesMetadataManager.php b/lib/private/FilesMetadata/FilesMetadataManager.php
index 28498af4ab0..c651fead0ce 100644
--- a/lib/private/FilesMetadata/FilesMetadataManager.php
+++ b/lib/private/FilesMetadata/FilesMetadataManager.php
@@ -148,6 +148,19 @@ class FilesMetadataManager implements IFilesMetadataManager {
}
/**
+ * returns metadata of multiple file ids
+ *
+ * @param int[] $fileIds file ids
+ *
+ * @return array File ID is the array key, files without metadata are not returned in the array
+ * @psalm-return array<int, IFilesMetadata>
+ * @since 28.0.0
+ */
+ public function getMetadataForFiles(array $fileIds): array {
+ return $this->metadataRequestService->getMetadataFromFileIds($fileIds);
+ }
+
+ /**
* @param IFilesMetadata $filesMetadata metadata
*
* @inheritDoc
diff --git a/lib/private/FilesMetadata/Service/MetadataRequestService.php b/lib/private/FilesMetadata/Service/MetadataRequestService.php
index 85874e92d4a..cdce624d75c 100644
--- a/lib/private/FilesMetadata/Service/MetadataRequestService.php
+++ b/lib/private/FilesMetadata/Service/MetadataRequestService.php
@@ -98,6 +98,40 @@ class MetadataRequestService {
}
/**
+ * returns metadata for multiple file ids
+ *
+ * If
+ *
+ * @param array $fileIds file ids
+ *
+ * @return array File ID is the array key, files without metadata are not returned in the array
+ * @psalm-return array<int, IFilesMetadata>
+ */
+ public function getMetadataFromFileIds(array $fileIds): array {
+ $qb = $this->dbConnection->getQueryBuilder();
+ $qb->select('file_id', 'json', 'sync_token')->from(self::TABLE_METADATA);
+ $qb->where(
+ $qb->expr()->in('file_id', $qb->createNamedParameter($fileIds, IQueryBuilder::PARAM_INT_ARRAY))
+ );
+
+ $list = [];
+ $result = $qb->executeQuery();
+ while ($data = $result->fetch()) {
+ $fileId = (int) $data['file_id'];
+ $metadata = new FilesMetadata($fileId);
+ try {
+ $metadata->importFromDatabase($data);
+ } catch (FilesMetadataNotFoundException) {
+ continue;
+ }
+ $list[$fileId] = $metadata;
+ }
+ $result->closeCursor();
+
+ return $list;
+ }
+
+ /**
* drop metadata related to a file id
*
* @param int $fileId file id
diff --git a/lib/public/FilesMetadata/IFilesMetadataManager.php b/lib/public/FilesMetadata/IFilesMetadataManager.php
index de6fc62ba94..184df2b0418 100644
--- a/lib/public/FilesMetadata/IFilesMetadataManager.php
+++ b/lib/public/FilesMetadata/IFilesMetadataManager.php
@@ -71,7 +71,7 @@ interface IFilesMetadataManager {
): IFilesMetadata;
/**
- * returns metadata from a file id
+ * returns metadata of a file id
*
* @param int $fileId file id
* @param boolean $generate Generate if metadata does not exist
@@ -83,6 +83,18 @@ interface IFilesMetadataManager {
public function getMetadata(int $fileId, bool $generate = false): IFilesMetadata;
/**
+ * returns metadata of multiple file ids
+ *
+ * @param int[] $fileIds file ids
+ *
+ * @return array File ID is the array key, files without metadata are not returned in the array
+ * @psalm-return array<int, IFilesMetadata>
+ * @throws FilesMetadataNotFoundException if not found
+ * @since 28.0.0
+ */
+ public function getMetadataForFiles(array $fileIds): array;
+
+ /**
* save metadata to database and refresh indexes.
* metadata are saved if new data are available.
* on update, a check on syncToken is done to avoid conflict (race condition)