From 911e039979b26d3fd176b2ca7d74ac993bdc516f Mon Sep 17 00:00:00 2001 From: Maxence Lange Date: Mon, 13 Nov 2023 16:16:17 -0100 Subject: [PATCH] ignore metadata if migration to 28 is not done Signed-off-by: Maxence Lange --- core/Migrations/Version28000Date20231004103301.php | 7 +++++++ lib/private/Files/Cache/Cache.php | 2 +- lib/private/Files/Cache/CacheQueryBuilder.php | 4 ++-- lib/private/FilesMetadata/FilesMetadataManager.php | 11 +++++++++-- lib/public/FilesMetadata/IFilesMetadataManager.php | 4 ++-- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/core/Migrations/Version28000Date20231004103301.php b/core/Migrations/Version28000Date20231004103301.php index 8888bf5191042..ab8c0ecc1889e 100644 --- a/core/Migrations/Version28000Date20231004103301.php +++ b/core/Migrations/Version28000Date20231004103301.php @@ -93,6 +93,13 @@ public function changeSchema(IOutput $output, Closure $schemaClosure, array $opt return null; } + /** + * We need to tell FilesMetadataManager that the migration is done + * and successful, so it can start joining the metadata table + */ + $config = \OCP\Server::get(\OCP\IConfig::class); + $config->setAppValue('core', \OC\FilesMetadata\FilesMetadataManager::CONFIG_KEY, '[]'); + return $schema; } } diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php index 240f02b3fbae7..940b73245f3ed 100644 --- a/lib/private/Files/Cache/Cache.php +++ b/lib/private/Files/Cache/Cache.php @@ -178,7 +178,7 @@ public function get($file) { } elseif (!$data) { return $data; } else { - $data['metadata'] = $metadataQuery->extractMetadata($data)->asArray(); + $data['metadata'] = $metadataQuery?->extractMetadata($data)->asArray() ?? []; return self::cacheEntryFromData($data, $this->mimetypeLoader); } } diff --git a/lib/private/Files/Cache/CacheQueryBuilder.php b/lib/private/Files/Cache/CacheQueryBuilder.php index 7971b5c630715..c835ff59976c3 100644 --- a/lib/private/Files/Cache/CacheQueryBuilder.php +++ b/lib/private/Files/Cache/CacheQueryBuilder.php @@ -135,9 +135,9 @@ public function whereParentInParameter(string $parameter) { return $this; } - public function selectMetadata(): IMetadataQuery { + public function selectMetadata(): ?IMetadataQuery { $metadataQuery = $this->filesMetadataManager->getMetadataQuery($this, $this->alias, 'fileid'); - $metadataQuery->retrieveMetadata(); + $metadataQuery?->retrieveMetadata(); return $metadataQuery; } } diff --git a/lib/private/FilesMetadata/FilesMetadataManager.php b/lib/private/FilesMetadata/FilesMetadataManager.php index b4c91c3836a50..e6e2b44a155f9 100644 --- a/lib/private/FilesMetadata/FilesMetadataManager.php +++ b/lib/private/FilesMetadata/FilesMetadataManager.php @@ -214,7 +214,7 @@ public function deleteMetadata(int $fileId): void { * @param string $fileIdField alias of the field that contains file ids * * @inheritDoc - * @return IMetadataQuery + * @return IMetadataQuery|null * @see IMetadataQuery * @since 28.0.0 */ @@ -222,7 +222,14 @@ public function getMetadataQuery( IQueryBuilder $qb, string $fileTableAlias, string $fileIdField - ): IMetadataQuery { + ): ?IMetadataQuery { + /** + * during the upgrade to 28, and before the migration is trigered, we + * need to not join metadata table as it does not exist yet. + */ + if ($this->config->getAppValue('core', self::CONFIG_KEY, '') === '') { + return null; + } return new MetadataQuery($qb, $this->getKnownMetadata(), $fileTableAlias, $fileIdField); } diff --git a/lib/public/FilesMetadata/IFilesMetadataManager.php b/lib/public/FilesMetadata/IFilesMetadataManager.php index 61494cac37143..3fe316375f947 100644 --- a/lib/public/FilesMetadata/IFilesMetadataManager.php +++ b/lib/public/FilesMetadata/IFilesMetadataManager.php @@ -106,7 +106,7 @@ public function deleteMetadata(int $fileId): void; * @param string $fileTableAlias alias of the table that contains data about files * @param string $fileIdField alias of the field that contains file ids * - * @return IMetadataQuery + * @return IMetadataQuery|null NULL if table are not set yet * @see IMetadataQuery * @since 28.0.0 */ @@ -114,7 +114,7 @@ public function getMetadataQuery( IQueryBuilder $qb, string $fileTableAlias, string $fileIdField - ): IMetadataQuery; + ): ?IMetadataQuery; /** * returns all type of metadata currently available.