123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- <?php
- namespace OC\Files\Cache;
- use OCP\DB\QueryBuilder\IQueryBuilder;
- use OCP\Files\Storage\IStorage;
- use OCP\IDBConnection;
- use Psr\Log\LoggerInterface;
- class Storage {
-
- private static $globalCache = null;
- private $storageId;
- private $numericId;
-
- public static function getGlobalCache() {
- if (is_null(self::$globalCache)) {
- self::$globalCache = new StorageGlobal(\OC::$server->getDatabaseConnection());
- }
- return self::$globalCache;
- }
-
- public function __construct($storage, $isAvailable, IDBConnection $connection) {
- if ($storage instanceof IStorage) {
- $this->storageId = $storage->getId();
- } else {
- $this->storageId = $storage;
- }
- $this->storageId = self::adjustStorageId($this->storageId);
- if ($row = self::getStorageById($this->storageId)) {
- $this->numericId = (int)$row['numeric_id'];
- } else {
- $available = $isAvailable ? 1 : 0;
- if ($connection->insertIfNotExist('*PREFIX*storages', ['id' => $this->storageId, 'available' => $available])) {
- $this->numericId = $connection->lastInsertId('*PREFIX*storages');
- } else {
- if ($row = self::getStorageById($this->storageId)) {
- $this->numericId = (int)$row['numeric_id'];
- } else {
- throw new \RuntimeException('Storage could neither be inserted nor be selected from the database: ' . $this->storageId);
- }
- }
- }
- }
-
- public static function getStorageById($storageId) {
- return self::getGlobalCache()->getStorageInfo($storageId);
- }
-
- public static function adjustStorageId($storageId) {
- if (strlen($storageId) > 64) {
- return md5($storageId);
- }
- return $storageId;
- }
-
- public function getNumericId() {
- return $this->numericId;
- }
-
- public static function getStorageId(int $numericId): ?string {
- $storage = self::getGlobalCache()->getStorageInfoByNumericId($numericId);
- return $storage['id'] ?? null;
- }
-
- public static function getNumericStorageId($storageId) {
- $storageId = self::adjustStorageId($storageId);
- if ($row = self::getStorageById($storageId)) {
- return (int)$row['numeric_id'];
- } else {
- return null;
- }
- }
-
- public function getAvailability() {
- if ($row = self::getStorageById($this->storageId)) {
- return [
- 'available' => (int)$row['available'] === 1,
- 'last_checked' => $row['last_checked']
- ];
- } else {
- return [
- 'available' => true,
- 'last_checked' => time(),
- ];
- }
- }
-
- public function setAvailability($isAvailable, int $delay = 0) {
- $available = $isAvailable ? 1 : 0;
- if (!$isAvailable) {
- \OCP\Server::get(LoggerInterface::class)->info('Storage with ' . $this->storageId . ' marked as unavailable', ['app' => 'lib']);
- }
- $query = \OC::$server->getDatabaseConnection()->getQueryBuilder();
- $query->update('storages')
- ->set('available', $query->createNamedParameter($available))
- ->set('last_checked', $query->createNamedParameter(time() + $delay))
- ->where($query->expr()->eq('id', $query->createNamedParameter($this->storageId)));
- $query->executeStatement();
- }
-
- public static function exists($storageId) {
- return !is_null(self::getNumericStorageId($storageId));
- }
-
- public static function remove($storageId) {
- $storageId = self::adjustStorageId($storageId);
- $numericId = self::getNumericStorageId($storageId);
- $query = \OC::$server->getDatabaseConnection()->getQueryBuilder();
- $query->delete('storages')
- ->where($query->expr()->eq('id', $query->createNamedParameter($storageId)));
- $query->executeStatement();
- if (!is_null($numericId)) {
- $query = \OC::$server->getDatabaseConnection()->getQueryBuilder();
- $query->delete('filecache')
- ->where($query->expr()->eq('storage', $query->createNamedParameter($numericId)));
- $query->executeStatement();
- }
- }
-
- public static function cleanByMountId(int $mountId) {
- $db = \OC::$server->getDatabaseConnection();
- try {
- $db->beginTransaction();
- $query = $db->getQueryBuilder();
- $query->select('storage_id')
- ->from('mounts')
- ->where($query->expr()->eq('mount_id', $query->createNamedParameter($mountId, IQueryBuilder::PARAM_INT)));
- $storageIds = $query->executeQuery()->fetchAll(\PDO::FETCH_COLUMN);
- $storageIds = array_unique($storageIds);
- $query = $db->getQueryBuilder();
- $query->delete('filecache')
- ->where($query->expr()->in('storage', $query->createNamedParameter($storageIds, IQueryBuilder::PARAM_INT_ARRAY)));
- $query->executeStatement();
- $query = $db->getQueryBuilder();
- $query->delete('storages')
- ->where($query->expr()->in('numeric_id', $query->createNamedParameter($storageIds, IQueryBuilder::PARAM_INT_ARRAY)));
- $query->executeStatement();
- $query = $db->getQueryBuilder();
- $query->delete('mounts')
- ->where($query->expr()->eq('mount_id', $query->createNamedParameter($mountId, IQueryBuilder::PARAM_INT)));
- $query->executeStatement();
- $db->commit();
- } catch (\Exception $e) {
- $db->rollBack();
- throw $e;
- }
- }
- }
|