diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 65e85901e0..d74b6d1197 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -174,8 +174,10 @@ return array( 'OCP\\Files' => $baseDir . '/lib/public/Files.php', 'OCP\\Files\\AlreadyExistsException' => $baseDir . '/lib/public/Files/AlreadyExistsException.php', 'OCP\\Files\\Cache\\CacheInsertEvent' => $baseDir . '/lib/public/Files/Cache/CacheInsertEvent.php', + 'OCP\\Files\\Cache\\CacheUpdateEvent' => $baseDir . '/lib/public/Files/Cache/CacheUpdateEvent.php', 'OCP\\Files\\Cache\\ICache' => $baseDir . '/lib/public/Files/Cache/ICache.php', 'OCP\\Files\\Cache\\ICacheEntry' => $baseDir . '/lib/public/Files/Cache/ICacheEntry.php', + 'OCP\\Files\\Cache\\ICacheEvent' => $baseDir . '/lib/public/Files/Cache/ICacheEvent.php', 'OCP\\Files\\Cache\\IPropagator' => $baseDir . '/lib/public/Files/Cache/IPropagator.php', 'OCP\\Files\\Cache\\IScanner' => $baseDir . '/lib/public/Files/Cache/IScanner.php', 'OCP\\Files\\Cache\\IUpdater' => $baseDir . '/lib/public/Files/Cache/IUpdater.php', @@ -759,6 +761,7 @@ return array( 'OC\\Federation\\CloudIdManager' => $baseDir . '/lib/private/Federation/CloudIdManager.php', 'OC\\Files\\AppData\\AppData' => $baseDir . '/lib/private/Files/AppData/AppData.php', 'OC\\Files\\AppData\\Factory' => $baseDir . '/lib/private/Files/AppData/Factory.php', + 'OC\\Files\\Cache\\AbstractCacheEvent' => $baseDir . '/lib/private/Files/Cache/AbstractCacheEvent.php', 'OC\\Files\\Cache\\Cache' => $baseDir . '/lib/private/Files/Cache/Cache.php', 'OC\\Files\\Cache\\CacheEntry' => $baseDir . '/lib/private/Files/Cache/CacheEntry.php', 'OC\\Files\\Cache\\FailedCache' => $baseDir . '/lib/private/Files/Cache/FailedCache.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 273b0fff1a..a0a6cb0af3 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -204,8 +204,10 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\Files' => __DIR__ . '/../../..' . '/lib/public/Files.php', 'OCP\\Files\\AlreadyExistsException' => __DIR__ . '/../../..' . '/lib/public/Files/AlreadyExistsException.php', 'OCP\\Files\\Cache\\CacheInsertEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Cache/CacheInsertEvent.php', + 'OCP\\Files\\Cache\\CacheUpdateEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Cache/CacheUpdateEvent.php', 'OCP\\Files\\Cache\\ICache' => __DIR__ . '/../../..' . '/lib/public/Files/Cache/ICache.php', 'OCP\\Files\\Cache\\ICacheEntry' => __DIR__ . '/../../..' . '/lib/public/Files/Cache/ICacheEntry.php', + 'OCP\\Files\\Cache\\ICacheEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Cache/ICacheEvent.php', 'OCP\\Files\\Cache\\IPropagator' => __DIR__ . '/../../..' . '/lib/public/Files/Cache/IPropagator.php', 'OCP\\Files\\Cache\\IScanner' => __DIR__ . '/../../..' . '/lib/public/Files/Cache/IScanner.php', 'OCP\\Files\\Cache\\IUpdater' => __DIR__ . '/../../..' . '/lib/public/Files/Cache/IUpdater.php', @@ -789,6 +791,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Federation\\CloudIdManager' => __DIR__ . '/../../..' . '/lib/private/Federation/CloudIdManager.php', 'OC\\Files\\AppData\\AppData' => __DIR__ . '/../../..' . '/lib/private/Files/AppData/AppData.php', 'OC\\Files\\AppData\\Factory' => __DIR__ . '/../../..' . '/lib/private/Files/AppData/Factory.php', + 'OC\\Files\\Cache\\AbstractCacheEvent' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/AbstractCacheEvent.php', 'OC\\Files\\Cache\\Cache' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/Cache.php', 'OC\\Files\\Cache\\CacheEntry' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/CacheEntry.php', 'OC\\Files\\Cache\\FailedCache' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/FailedCache.php', diff --git a/lib/private/Files/Cache/AbstractCacheEvent.php b/lib/private/Files/Cache/AbstractCacheEvent.php new file mode 100644 index 0000000000..c8a41ce54d --- /dev/null +++ b/lib/private/Files/Cache/AbstractCacheEvent.php @@ -0,0 +1,68 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OC\Files\Cache; + +use OCP\Files\Cache\ICacheEvent; +use OCP\Files\Storage\IStorage; +use Symfony\Component\EventDispatcher\Event; + +class AbstractCacheEvent extends Event implements ICacheEvent { + protected $storage; + protected $path; + protected $fileId; + + /** + * @param IStorage $storage + * @param string $path + * @param int $fileId + * @since 16.0.0 + */ + public function __construct(IStorage $storage, string $path, int $fileId) { + $this->storage = $storage; + $this->path = $path; + $this->fileId = $fileId; + } + + /** + * @return IStorage + * @since 16.0.0 + */ + public function getStorage(): IStorage { + return $this->storage; + } + + /** + * @return string + * @since 16.0.0 + */ + public function getPath(): string { + return $this->path; + } + + /** + * @return int + * @since 16.0.0 + */ + public function getFileId(): int { + return $this->fileId; + } +} diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php index 17e870bcbb..7b42cc2aa5 100644 --- a/lib/private/Files/Cache/Cache.php +++ b/lib/private/Files/Cache/Cache.php @@ -41,6 +41,7 @@ use Doctrine\DBAL\Exception\UniqueConstraintViolationException; use OCP\DB\QueryBuilder\IQueryBuilder; use Doctrine\DBAL\Driver\Statement; use OCP\Files\Cache\CacheInsertEvent; +use OCP\Files\Cache\CacheUpdateEvent; use OCP\Files\Cache\ICache; use OCP\Files\Cache\ICacheEntry; use \OCP\Files\IMimeTypeLoader; @@ -230,7 +231,7 @@ class Cache implements ICache { */ public function put($file, array $data) { if (($id = $this->getId($file)) > -1) { - $this->update($id, $data); + $this->update($id, $data, $file); return $id; } else { return $this->insert($file, $data); @@ -337,6 +338,11 @@ class Cache implements ICache { ') AND `fileid` = ? '; $this->connection->executeQuery($sql, $params); + $path = $this->getPathById($id); + // path can still be null if the file doesn't exist + if ($path !== null) { + $this->eventDispatcher->dispatch(CacheUpdateEvent::class, new CacheUpdateEvent($this->storage, $path, $id)); + } } /** diff --git a/lib/public/Files/Cache/CacheInsertEvent.php b/lib/public/Files/Cache/CacheInsertEvent.php index 071f039d45..6c2e3f34c7 100644 --- a/lib/public/Files/Cache/CacheInsertEvent.php +++ b/lib/public/Files/Cache/CacheInsertEvent.php @@ -21,52 +21,12 @@ namespace OCP\Files\Cache; -use OCP\Files\Storage\IStorage; -use Symfony\Component\EventDispatcher\Event; +use OC\Files\Cache\AbstractCacheEvent; /** + * Event for when a new entry gets added to the cache + * * @since 16.0.0 */ -class CacheInsertEvent extends Event { - private $storage; - private $path; - private $fileId; - - /** - * CacheInsertEvent constructor. - * - * @param IStorage $storage - * @param string $path - * @param int $fileId - * @since 16.0.0 - */ - public function __construct(IStorage $storage, string $path, int $fileId) { - $this->storage = $storage; - $this->path = $path; - $this->fileId = $fileId; - } - - /** - * @return IStorage - * @since 16.0.0 - */ - public function getStorage(): IStorage { - return $this->storage; - } - - /** - * @return string - * @since 16.0.0 - */ - public function getPath(): string { - return $this->path; - } - - /** - * @return int - * @since 16.0.0 - */ - public function getFileId(): int { - return $this->fileId; - } +class CacheInsertEvent extends AbstractCacheEvent { } diff --git a/lib/public/Files/Cache/CacheUpdateEvent.php b/lib/public/Files/Cache/CacheUpdateEvent.php new file mode 100644 index 0000000000..e750c0bf8f --- /dev/null +++ b/lib/public/Files/Cache/CacheUpdateEvent.php @@ -0,0 +1,32 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCP\Files\Cache; + +use OC\Files\Cache\AbstractCacheEvent; + +/** + * Event for when an existing entry in the cache gets updated + * + * @since 16.0.0 + */ +class CacheUpdateEvent extends AbstractCacheEvent { +} diff --git a/lib/public/Files/Cache/ICacheEvent.php b/lib/public/Files/Cache/ICacheEvent.php new file mode 100644 index 0000000000..f3ad9c03ac --- /dev/null +++ b/lib/public/Files/Cache/ICacheEvent.php @@ -0,0 +1,47 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCP\Files\Cache; + +use OCP\Files\Storage\IStorage; + +/** + * @since 16.0.0 + */ +interface ICacheEvent { + /** + * @return IStorage + * @since 16.0.0 + */ + public function getStorage(): IStorage; + + /** + * @return string + * @since 16.0.0 + */ + public function getPath(): string; + + /** + * @return int + * @since 16.0.0 + */ + public function getFileId(): int; +}