Skip to content

Commit

Permalink
Merge pull request #39889 from nextcloud/cache-di
Browse files Browse the repository at this point in the history
  • Loading branch information
skjnldsv authored Feb 13, 2024
2 parents f2a7bfd + e9d97a5 commit 56640c7
Show file tree
Hide file tree
Showing 12 changed files with 142 additions and 82 deletions.
5 changes: 3 additions & 2 deletions apps/files_external/tests/Service/StoragesServiceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@
use OCP\Files\Config\IUserMountCache;
use OCP\Files\Mount\IMountPoint;
use OCP\Files\Storage\IStorage;
use OCP\IDBConnection;
use OCP\IUser;
use OCP\Server;

class CleaningDBConfig extends DBConfigService {
private $mountIds = [];
Expand All @@ -66,7 +68,6 @@ public function clean() {
* @group DB
*/
abstract class StoragesServiceTest extends \Test\TestCase {

/**
* @var StoragesService
*/
Expand Down Expand Up @@ -315,7 +316,7 @@ public function testDeleteStorage($backendOptions, $rustyStorageId) {

// manually trigger storage entry because normally it happens on first
// access, which isn't possible within this test
$storageCache = new \OC\Files\Cache\Storage($rustyStorageId);
$storageCache = new \OC\Files\Cache\Storage($rustyStorageId, true, Server::get(IDBConnection::class));

/** @var IUserMountCache $mountCache */
$mountCache = \OC::$server->get(IUserMountCache::class);
Expand Down
11 changes: 7 additions & 4 deletions apps/files_sharing/lib/Cache.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@
*/
namespace OCA\Files_Sharing;

use OC\Files\Cache\CacheDependencies;
use OC\Files\Cache\FailedCache;
use OC\Files\Cache\Wrapper\CacheJail;
use OC\Files\Search\SearchBinaryOperator;
use OC\Files\Search\SearchComparison;
use OC\Files\Storage\Wrapper\Jail;
use OC\User\DisplayNameCache;
use OCP\Files\Cache\ICache;
use OCP\Files\Cache\ICacheEntry;
use OCP\Files\Search\ISearchBinaryOperator;
use OCP\Files\Search\ISearchComparison;
Expand Down Expand Up @@ -62,18 +64,19 @@ class Cache extends CacheJail {
public function __construct(
$storage,
ICacheEntry $sourceRootInfo,
DisplayNameCache $displayNameCache,
CacheDependencies $dependencies,
IShare $share
) {
$this->storage = $storage;
$this->sourceRootInfo = $sourceRootInfo;
$this->numericId = $sourceRootInfo->getStorageId();
$this->displayNameCache = $displayNameCache;
$this->displayNameCache = $dependencies->getDisplayNameCache();
$this->share = $share;

parent::__construct(
null,
''
'',
$dependencies,
);
}

Expand All @@ -98,7 +101,7 @@ protected function getGetUnjailedRoot() {
return $this->sourceRootInfo->getPath();
}

public function getCache() {
public function getCache(): ICache {
if (is_null($this->cache)) {
$sourceStorage = $this->storage->getSourceStorage();
if ($sourceStorage) {
Expand Down
6 changes: 3 additions & 3 deletions apps/files_sharing/lib/SharedStorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
*/
namespace OCA\Files_Sharing;

use OC\Files\Cache\CacheDependencies;
use OC\Files\Cache\FailedCache;
use OC\Files\Cache\NullWatcher;
use OC\Files\Cache\Watcher;
Expand All @@ -40,7 +41,6 @@
use OC\Files\Storage\FailedStorage;
use OC\Files\Storage\Home;
use OC\Files\Storage\Wrapper\PermissionsMask;
use OC\User\DisplayNameCache;
use OC\User\NoUserException;
use OCA\Files_External\Config\ExternalMountPoint;
use OCP\Constants;
Expand Down Expand Up @@ -410,10 +410,10 @@ public function getCache($path = '', $storage = null) {
return new FailedCache();
}

$this->cache = new \OCA\Files_Sharing\Cache(
$this->cache = new Cache(
$storage,
$sourceRoot,
\OC::$server->get(DisplayNameCache::class),
\OC::$server->get(CacheDependencies::class),
$this->getShare()
);
return $this->cache;
Expand Down
1 change: 1 addition & 0 deletions lib/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -1339,6 +1339,7 @@
'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\\Cache' => $baseDir . '/lib/private/Files/Cache/Cache.php',
'OC\\Files\\Cache\\CacheDependencies' => $baseDir . '/lib/private/Files/Cache/CacheDependencies.php',
'OC\\Files\\Cache\\CacheEntry' => $baseDir . '/lib/private/Files/Cache/CacheEntry.php',
'OC\\Files\\Cache\\CacheQueryBuilder' => $baseDir . '/lib/private/Files/Cache/CacheQueryBuilder.php',
'OC\\Files\\Cache\\FailedCache' => $baseDir . '/lib/private/Files/Cache/FailedCache.php',
Expand Down
1 change: 1 addition & 0 deletions lib/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -1372,6 +1372,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'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\\Cache' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/Cache.php',
'OC\\Files\\Cache\\CacheDependencies' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/CacheDependencies.php',
'OC\\Files\\Cache\\CacheEntry' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/CacheEntry.php',
'OC\\Files\\Cache\\CacheQueryBuilder' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/CacheQueryBuilder.php',
'OC\\Files\\Cache\\FailedCache' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/FailedCache.php',
Expand Down
80 changes: 36 additions & 44 deletions lib/private/Files/Cache/Cache.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
use OC\Files\Search\SearchComparison;
use OC\Files\Search\SearchQuery;
use OC\Files\Storage\Wrapper\Encryption;
use OC\SystemConfig;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\Cache\CacheEntryInsertedEvent;
Expand Down Expand Up @@ -82,62 +83,53 @@ class Cache implements ICache {
/**
* @var array partial data for the cache
*/
protected $partial = [];

/**
* @var string
*/
protected $storageId;

private $storage;

/**
* @var Storage $storageCache
*/
protected $storageCache;

/** @var IMimeTypeLoader */
protected $mimetypeLoader;

/**
* @var IDBConnection
*/
protected $connection;

/**
* @var IEventDispatcher
*/
protected $eventDispatcher;

/** @var QuerySearchHelper */
protected $querySearchHelper;

/**
* @param IStorage $storage
*/
public function __construct(IStorage $storage) {
protected array $partial = [];
protected string $storageId;
protected Storage $storageCache;
protected IMimeTypeLoader$mimetypeLoader;
protected IDBConnection $connection;
protected SystemConfig $systemConfig;
protected LoggerInterface $logger;
protected QuerySearchHelper $querySearchHelper;
protected IEventDispatcher $eventDispatcher;
protected IFilesMetadataManager $metadataManager;

public function __construct(
private IStorage $storage,
// this constructor is used in to many pleases to easily do proper di
// so instead we group it all together
CacheDependencies $dependencies = null,
) {
$this->storageId = $storage->getId();
$this->storage = $storage;
if (strlen($this->storageId) > 64) {
$this->storageId = md5($this->storageId);
}

$this->storageCache = new Storage($storage);
$this->mimetypeLoader = \OC::$server->getMimeTypeLoader();
$this->connection = \OC::$server->getDatabaseConnection();
$this->eventDispatcher = \OC::$server->get(IEventDispatcher::class);
$this->querySearchHelper = \OCP\Server::get(QuerySearchHelper::class);
if (!$dependencies) {
$dependencies = \OC::$server->get(CacheDependencies::class);
}
$this->storageCache = new Storage($this->storage, true, $dependencies->getConnection());
$this->mimetypeLoader = $dependencies->getMimeTypeLoader();
$this->connection = $dependencies->getConnection();
$this->systemConfig = $dependencies->getSystemConfig();
$this->logger = $dependencies->getLogger();
$this->querySearchHelper = $dependencies->getQuerySearchHelper();
$this->eventDispatcher = $dependencies->getEventDispatcher();
$this->metadataManager = $dependencies->getMetadataManager();
}

protected function getQueryBuilder() {
return new CacheQueryBuilder(
$this->connection,
\OC::$server->getSystemConfig(),
\OC::$server->get(LoggerInterface::class),
\OC::$server->get(IFilesMetadataManager::class),
$this->systemConfig,
$this->logger,
$this->metadataManager,
);
}

public function getStorageCache(): Storage {
return $this->storageCache;
}

/**
* Get the numeric storage id for this cache's storage
*
Expand Down
57 changes: 57 additions & 0 deletions lib/private/Files/Cache/CacheDependencies.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php

namespace OC\Files\Cache;

use OC\SystemConfig;
use OC\User\DisplayNameCache;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\IMimeTypeLoader;
use OCP\FilesMetadata\IFilesMetadataManager;
use OCP\IDBConnection;
use Psr\Log\LoggerInterface;

class CacheDependencies {
public function __construct(
private IMimeTypeLoader $mimeTypeLoader,
private IDBConnection $connection,
private IEventDispatcher $eventDispatcher,
private QuerySearchHelper $querySearchHelper,
private SystemConfig $systemConfig,
private LoggerInterface $logger,
private IFilesMetadataManager $metadataManager,
private DisplayNameCache $displayNameCache,
) {
}

public function getMimeTypeLoader(): IMimeTypeLoader {
return $this->mimeTypeLoader;
}

public function getConnection(): IDBConnection {
return $this->connection;
}

public function getEventDispatcher(): IEventDispatcher {
return $this->eventDispatcher;
}

public function getQuerySearchHelper(): QuerySearchHelper {
return $this->querySearchHelper;
}

public function getSystemConfig(): SystemConfig {
return $this->systemConfig;
}

public function getLogger(): LoggerInterface {
return $this->logger;
}

public function getDisplayNameCache(): DisplayNameCache {
return $this->displayNameCache;
}

public function getMetadataManager(): IFilesMetadataManager {
return $this->metadataManager;
}
}
4 changes: 2 additions & 2 deletions lib/private/Files/Cache/Storage.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@

use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Files\Storage\IStorage;
use OCP\IDBConnection;
use Psr\Log\LoggerInterface;

/**
Expand Down Expand Up @@ -65,7 +66,7 @@ public static function getGlobalCache() {
* @param bool $isAvailable
* @throws \RuntimeException
*/
public function __construct($storage, $isAvailable = true) {
public function __construct($storage, $isAvailable, IDBConnection $connection) {
if ($storage instanceof IStorage) {
$this->storageId = $storage->getId();
} else {
Expand All @@ -76,7 +77,6 @@ public function __construct($storage, $isAvailable = true) {
if ($row = self::getStorageById($this->storageId)) {
$this->numericId = (int)$row['numeric_id'];
} else {
$connection = \OC::$server->getDatabaseConnection();
$available = $isAvailable ? 1 : 0;
if ($connection->insertIfNotExist('*PREFIX*storages', ['id' => $this->storageId, 'available' => $available])) {
$this->numericId = $connection->lastInsertId('*PREFIX*storages');
Expand Down
14 changes: 8 additions & 6 deletions lib/private/Files/Cache/Wrapper/CacheJail.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,10 @@
namespace OC\Files\Cache\Wrapper;

use OC\Files\Cache\Cache;
use OC\Files\Cache\CacheDependencies;
use OC\Files\Search\SearchBinaryOperator;
use OC\Files\Search\SearchComparison;
use OCP\Files\Cache\ICache;
use OCP\Files\Cache\ICacheEntry;
use OCP\Files\Search\ISearchBinaryOperator;
use OCP\Files\Search\ISearchComparison;
Expand All @@ -45,12 +47,12 @@ class CacheJail extends CacheWrapper {
protected $root;
protected $unjailedRoot;

/**
* @param ?\OCP\Files\Cache\ICache $cache
* @param string $root
*/
public function __construct($cache, $root) {
parent::__construct($cache);
public function __construct(
?ICache $cache,
string $root,
CacheDependencies $dependencies = null,
) {
parent::__construct($cache, $dependencies);
$this->root = $root;

if ($cache instanceof CacheJail) {
Expand Down
23 changes: 11 additions & 12 deletions lib/private/Files/Cache/Wrapper/CacheWrapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,33 +30,32 @@
namespace OC\Files\Cache\Wrapper;

use OC\Files\Cache\Cache;
use OC\Files\Cache\QuerySearchHelper;
use OC\Files\Cache\CacheDependencies;
use OCP\Files\Cache\ICache;
use OCP\Files\Cache\ICacheEntry;
use OCP\Files\IMimeTypeLoader;
use OCP\Files\Search\ISearchOperator;
use OCP\Files\Search\ISearchQuery;
use OCP\IDBConnection;
use OCP\Server;

class CacheWrapper extends Cache {
/**
* @var \OCP\Files\Cache\ICache
* @var ?ICache
*/
protected $cache;

/**
* @param \OCP\Files\Cache\ICache $cache
*/
public function __construct($cache) {
public function __construct(?ICache $cache, CacheDependencies $dependencies = null) {
$this->cache = $cache;
if ($cache instanceof Cache) {
if (!$dependencies && $cache instanceof Cache) {
$this->mimetypeLoader = $cache->mimetypeLoader;
$this->connection = $cache->connection;
$this->querySearchHelper = $cache->querySearchHelper;
} else {
$this->mimetypeLoader = \OC::$server->get(IMimeTypeLoader::class);
$this->connection = \OC::$server->get(IDBConnection::class);
$this->querySearchHelper = \OC::$server->get(QuerySearchHelper::class);
if (!$dependencies) {
$dependencies = Server::get(CacheDependencies::class);
}
$this->mimetypeLoader = $dependencies->getMimeTypeLoader();
$this->connection = $dependencies->getConnection();
$this->querySearchHelper = $dependencies->getQuerySearchHelper();
}
}

Expand Down
Loading

0 comments on commit 56640c7

Please sign in to comment.