-
-
Notifications
You must be signed in to change notification settings - Fork 4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add interface for lower level filecache acess without having to…
… do direct db queries Signed-off-by: Robin Appelman <[email protected]>
- Loading branch information
1 parent
46906b7
commit a994585
Showing
4 changed files
with
177 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace OC\Files\Cache; | ||
|
||
use OC\FilesMetadata\FilesMetadataManager; | ||
use OC\SystemConfig; | ||
use OCP\DB\QueryBuilder\IQueryBuilder; | ||
use OCP\Files\Cache\IFileAccess; | ||
use OCP\Files\IMimeTypeLoader; | ||
use OCP\IDBConnection; | ||
use Psr\Log\LoggerInterface; | ||
|
||
/** | ||
* Lower level access to the file cache | ||
*/ | ||
class FileAccess implements IFileAccess { | ||
public function __construct( | ||
private IDBConnection $connection, | ||
private SystemConfig $systemConfig, | ||
private LoggerInterface $logger, | ||
private FilesMetadataManager $metadataManager, | ||
private IMimeTypeLoader $mimeTypeLoader, | ||
) { | ||
} | ||
|
||
private function getQuery(): CacheQueryBuilder { | ||
return new CacheQueryBuilder( | ||
$this->connection, | ||
$this->systemConfig, | ||
$this->logger, | ||
$this->metadataManager, | ||
); | ||
} | ||
|
||
public function getByFileIdInStorage(int $fileId, int $storageId): ?CacheEntry { | ||
$items = $this->getByFileIdsInStorage([$fileId], $storageId); | ||
return (count($items) > 0) ? $items[0] : null; | ||
} | ||
|
||
public function getByPathInStorage(string $path, int $storageId): ?CacheEntry { | ||
$query = $this->getQuery()->selectFileCache(); | ||
$query->andWhere($query->expr()->eq('filecache.path_hash', $query->createNamedParameter(md5($path)))); | ||
$query->andWhere($query->expr()->eq('filecache.storage', $query->createNamedParameter($storageId, IQueryBuilder::PARAM_INT))); | ||
|
||
$row = $query->executeQuery()->fetch(); | ||
return $row ? Cache::cacheEntryFromData($row, $this->mimeTypeLoader) : null; | ||
} | ||
|
||
public function getByFileId(int $fileId): ?CacheEntry { | ||
$items = $this->getByFileIds([$fileId]); | ||
return (count($items) > 0) ? $items[0] : null; | ||
} | ||
|
||
/** | ||
* @param array[] $rows | ||
* @return array<int, CacheEntry> | ||
*/ | ||
private function rowsToEntries(array $rows): array { | ||
$result = []; | ||
foreach ($rows as $row) { | ||
$entry = Cache::cacheEntryFromData($row, $this->mimeTypeLoader); | ||
$result[$entry->getId()] = $entry; | ||
} | ||
return $result; | ||
} | ||
|
||
/** | ||
* @param int[] $fileIds | ||
* @return array<int, CacheEntry> | ||
*/ | ||
public function getByFileIds(array $fileIds): array { | ||
$query = $this->getQuery()->selectFileCache(); | ||
$query->andWhere($query->expr()->in('filecache.fileid', $query->createNamedParameter($fileIds, IQueryBuilder::PARAM_INT_ARRAY))); | ||
|
||
$rows = $query->executeQuery()->fetchAll(); | ||
return $this->rowsToEntries($rows); | ||
} | ||
|
||
/** | ||
* @param int[] $fileIds | ||
* @param int $storageId | ||
* @return array<int, CacheEntry> | ||
*/ | ||
public function getByFileIdsInStorage(array $fileIds, int $storageId): array { | ||
$fileIds = array_values($fileIds); | ||
$query = $this->getQuery()->selectFileCache(); | ||
$query->andWhere($query->expr()->in('filecache.fileid', $query->createNamedParameter($fileIds, IQueryBuilder::PARAM_INT_ARRAY))); | ||
$query->andWhere($query->expr()->eq('filecache.storage', $query->createNamedParameter($storageId, IQueryBuilder::PARAM_INT))); | ||
|
||
$rows = $query->executeQuery()->fetchAll(); | ||
return $this->rowsToEntries($rows); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace OCP\Files\Cache; | ||
|
||
/** | ||
* Low level access to the file cache. | ||
* | ||
* This is intended for use cases where data from the filecache needs to be loaded by the full filesystem apis are | ||
* insufficient or to inefficient. | ||
* | ||
* @since 29.0.0 | ||
*/ | ||
interface IFileAccess { | ||
/** | ||
* Get a filecache data by file id from a specific storage. | ||
* | ||
* This is preferred over `getByFileId` when the storage id is known as it | ||
* can be more efficient in some setups. | ||
* | ||
* @param int $fileId | ||
* @param int $storageId | ||
* @return ICacheEntry|null | ||
* | ||
* @since 29.0.0 | ||
*/ | ||
public function getByFileIdInStorage(int $fileId, int $storageId): ?ICacheEntry; | ||
|
||
/** | ||
* Get a filecache data by path and storage id. | ||
* | ||
* @param string $path | ||
* @param int $storageId | ||
* @return ICacheEntry|null | ||
* | ||
* @since 29.0.0 | ||
*/ | ||
public function getByPathInStorage(string $path, int $storageId): ?ICacheEntry; | ||
|
||
/** | ||
* Get a filecache data by file id. | ||
* | ||
* If the storage id is known than `getByFileIdInStorage` is preferred as it can be more efficient in some setups. | ||
* | ||
* @param int $fileId | ||
* @return ICacheEntry|null | ||
* | ||
* @since 29.0.0 | ||
*/ | ||
public function getByFileId(int $fileId): ?ICacheEntry; | ||
|
||
/** | ||
* Get filecache data by file ids. | ||
* | ||
* If the storage id is known than `getByFileIdsInStorage` is preferred as it can be more efficient in some setups. | ||
* | ||
* @param int[] $fileIds | ||
* @return array<int, ICacheEntry> | ||
* | ||
* @since 29.0.0 | ||
*/ | ||
public function getByFileIds(array $fileIds): array; | ||
|
||
/** | ||
* Get filecache data by file ids from a specific storage. | ||
* | ||
* This is prefered over `getByFileIds` when the storage id is known as it | ||
* can be more efficient in some setups. | ||
* | ||
* @param int[] $fileIds | ||
* @param int $storageId | ||
* @return array<int, ICacheEntry> | ||
* | ||
* @since 29.0.0 | ||
*/ | ||
public function getByFileIdsInStorage(array $fileIds, int $storageId): array; | ||
} |