Use two queries to mark parent as outdated
Signed-off-by: Ari Selseng <ari@selseng.net>
This commit is contained in:
parent
1b27e9578d
commit
11b3fbf612
|
@ -30,6 +30,7 @@ use OC\Core\Command\Base;
|
||||||
use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
|
use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
|
||||||
use OCA\Files_External\Lib\StorageConfig;
|
use OCA\Files_External\Lib\StorageConfig;
|
||||||
use OCA\Files_External\Service\GlobalStoragesService;
|
use OCA\Files_External\Service\GlobalStoragesService;
|
||||||
|
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||||
use OCP\Files\Notify\IChange;
|
use OCP\Files\Notify\IChange;
|
||||||
use OCP\Files\Notify\INotifyHandler;
|
use OCP\Files\Notify\INotifyHandler;
|
||||||
use OCP\Files\Notify\IRenameChange;
|
use OCP\Files\Notify\IRenameChange;
|
||||||
|
@ -48,8 +49,6 @@ class Notify extends Base {
|
||||||
private $globalService;
|
private $globalService;
|
||||||
/** @var IDBConnection */
|
/** @var IDBConnection */
|
||||||
private $connection;
|
private $connection;
|
||||||
/** @var \OCP\DB\QueryBuilder\IQueryBuilder */
|
|
||||||
private $updateQuery;
|
|
||||||
/** @var ILogger */
|
/** @var ILogger */
|
||||||
private $logger;
|
private $logger;
|
||||||
|
|
||||||
|
@ -58,7 +57,6 @@ class Notify extends Base {
|
||||||
$this->globalService = $globalService;
|
$this->globalService = $globalService;
|
||||||
$this->connection = $connection;
|
$this->connection = $connection;
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
$this->updateQuery = $this->getUpdateQuery($this->connection);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function configure() {
|
protected function configure() {
|
||||||
|
@ -162,13 +160,22 @@ class Notify extends Base {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->updateQuery->execute([$parent, $mountId]);
|
$storageIds = $this->getStorageIds($mountId);
|
||||||
} catch (DriverException $ex) {
|
} catch (DriverException $ex) {
|
||||||
$this->logger->logException($ex, ['app' => 'files_external', 'message' => 'Error while trying to mark folder as outdated', 'level' => ILogger::WARN]);
|
$this->logger->logException($ex, ['message' => 'Error while trying to find correct storage ids.', 'level' => ILogger::WARN]);
|
||||||
$this->connection = $this->reconnectToDatabase($this->connection, $output);
|
$this->connection = $this->reconnectToDatabase($this->connection, $output);
|
||||||
$output->writeln('<info>Needed to reconnect to the database</info>');
|
$output->writeln('<info>Needed to reconnect to the database</info>');
|
||||||
$this->updateQuery = $this->getUpdateQuery($this->connection);
|
$storageIds = $this->getStorageIds($mountId);
|
||||||
$this->updateQuery->execute([$parent, $mountId]);
|
}
|
||||||
|
if (count($storageIds) === 0) {
|
||||||
|
throw new StorageNotAvailableException('No storages found by mount ID ' . $mountId);
|
||||||
|
}
|
||||||
|
$storageIds = array_map('intval', $storageIds);
|
||||||
|
|
||||||
|
$result = $this->updateParent($storageIds, $parent);
|
||||||
|
if ($result === 0) {
|
||||||
|
//TODO: Find existing parent further up the tree in the database and register that folder instead.
|
||||||
|
$this->logger->info('Failed updating parent for "' . $path . '" while trying to register change. It may not exist in the filecache.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,15 +206,33 @@ class Notify extends Base {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return \Doctrine\DBAL\Statement
|
* @param int $mountId
|
||||||
|
* @return array
|
||||||
*/
|
*/
|
||||||
private function getUpdateQuery(IDBConnection $connection) {
|
private function getStorageIds($mountId) {
|
||||||
// the query builder doesn't really like subqueries with parameters
|
$qb = $this->connection->getQueryBuilder();
|
||||||
return $connection->prepare(
|
return $qb
|
||||||
'UPDATE *PREFIX*filecache SET size = -1
|
->select('storage_id')
|
||||||
WHERE `path` = ?
|
->from('mounts')
|
||||||
AND `storage` IN (SELECT storage_id FROM *PREFIX*mounts WHERE mount_id = ?)'
|
->where($qb->expr()->eq('mount_id', $qb->createNamedParameter($mountId, IQueryBuilder::PARAM_INT)))
|
||||||
);
|
->execute()
|
||||||
|
->fetchAll(\PDO::FETCH_COLUMN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $storageIds
|
||||||
|
* @param string $parent
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
private function updateParent($storageIds, $parent) {
|
||||||
|
$pathHash = md5(trim(\OC_Util::normalizeUnicode($parent), '/'));
|
||||||
|
$qb = $this->connection->getQueryBuilder();
|
||||||
|
return $qb
|
||||||
|
->update('filecache')
|
||||||
|
->set('size', $qb->createNamedParameter(-1, IQueryBuilder::PARAM_INT))
|
||||||
|
->where($qb->expr()->in('storage', $qb->createNamedParameter($storageIds, IQueryBuilder::PARAM_INT_ARRAY, ':storage_ids')))
|
||||||
|
->andWhere($qb->expr()->eq('path_hash', $qb->createNamedParameter($pathHash, IQueryBuilder::PARAM_STR)))
|
||||||
|
->execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue