diff options
author | Robin Appelman <robin@icewind.nl> | 2017-07-12 15:49:36 +0200 |
---|---|---|
committer | Morris Jobke <hey@morrisjobke.de> | 2017-07-13 16:37:38 +0200 |
commit | 350e036c56d1ddd60e8a8d6d8822dbf8979f8719 (patch) | |
tree | 6b6a9180d6cc0a639b3f0a73a8619b4b0206c25d /lib/private/Repair/NC13 | |
parent | 4a727a578ca1a75bfb85167d6a1b3fa3bbdf3a3e (diff) | |
download | nextcloud-server-350e036c56d1ddd60e8a8d6d8822dbf8979f8719.tar.gz nextcloud-server-350e036c56d1ddd60e8a8d6d8822dbf8979f8719.zip |
chunk getting invalid paths and reuse queries
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib/private/Repair/NC13')
-rw-r--r-- | lib/private/Repair/NC13/RepairInvalidPaths.php | 88 |
1 files changed, 61 insertions, 27 deletions
diff --git a/lib/private/Repair/NC13/RepairInvalidPaths.php b/lib/private/Repair/NC13/RepairInvalidPaths.php index 47a007baf5f..cf0b9e7783e 100644 --- a/lib/private/Repair/NC13/RepairInvalidPaths.php +++ b/lib/private/Repair/NC13/RepairInvalidPaths.php @@ -22,17 +22,25 @@ namespace OC\Repair\NC13; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IConfig; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; class RepairInvalidPaths implements IRepairStep { + const MAX_ROWS = 1000; + /** @var IDBConnection */ private $connection; /** @var IConfig */ private $config; + private $getIdQuery; + private $updateQuery; + private $reparentQuery; + private $deleteQuery; + public function __construct(IDBConnection $connection, IConfig $config) { $this->connection = $connection; $this->config = $config; @@ -58,51 +66,77 @@ class RepairInvalidPaths implements IRepairStep { $builder->expr()->eq('f.parent', 'p.fileid'), $builder->expr()->neq('p.name', $builder->createNamedParameter('')) )) - ->where($builder->expr()->neq('f.path', $computedPath)); - - $result = $query->execute(); - while ($row = $result->fetch()) { - yield $row; - } + ->where($builder->expr()->neq('f.path', $computedPath)) + ->setMaxResults(self::MAX_ROWS); + + do { + $result = $query->execute(); + $rows = $result->fetchAll(); + foreach ($rows as $row) { + yield $row; + } + $result->closeCursor(); + } while (count($rows) >= self::MAX_ROWS); } private function getId($storage, $path) { - $builder = $this->connection->getQueryBuilder(); + if (!$this->getIdQuery) { + $builder = $this->connection->getQueryBuilder(); + + $this->getIdQuery = $builder->select('fileid') + ->from('filecache') + ->where($builder->expr()->eq('storage', $builder->createParameter('storage'))) + ->andWhere($builder->expr()->eq('path', $builder->createParameter('path'))); + } - $query = $builder->select('fileid') - ->from('filecache') - ->where($builder->expr()->eq('storage', $builder->createNamedParameter($storage))) - ->andWhere($builder->expr()->eq('path', $builder->createNamedParameter($path))); + $this->getIdQuery->setParameter('storage', $storage, IQueryBuilder::PARAM_INT); + $this->getIdQuery->setParameter('path', $path); - return $query->execute()->fetchColumn(); + return $this->getIdQuery->execute()->fetchColumn(); } private function update($fileid, $newPath) { - $builder = $this->connection->getQueryBuilder(); + if (!$this->updateQuery) { + $builder = $this->connection->getQueryBuilder(); - $query = $builder->update('filecache') - ->set('path', $builder->createNamedParameter($newPath)) - ->set('path_hash', $builder->createNamedParameter(md5($newPath))) - ->where($builder->expr()->eq('fileid', $builder->createNamedParameter($fileid))); + $this->updateQuery = $builder->update('filecache') + ->set('path', $builder->createParameter('newpath')) + ->set('path_hash', $builder->func()->md5($builder->createParameter('newpath'))) + ->where($builder->expr()->eq('fileid', $builder->createParameter('fileid'))); + } - $query->execute(); + $this->updateQuery->setParameter('newpath', $newPath); + $this->updateQuery->setParameter('fileid', $fileid, IQueryBuilder::PARAM_INT); + + $this->updateQuery->execute(); } private function reparent($from, $to) { - $builder = $this->connection->getQueryBuilder(); + if (!$this->reparentQuery) { + $builder = $this->connection->getQueryBuilder(); + + $this->reparentQuery = $builder->update('filecache') + ->set('parent', $builder->createParameter('to')) + ->where($builder->expr()->eq('fileid', $builder->createParameter('from'))); + } + + $this->reparentQuery->setParameter('from', $from); + $this->reparentQuery->setParameter('to', $to); - $query = $builder->update('filecache') - ->set('parent', $builder->createNamedParameter($to)) - ->where($builder->expr()->eq('fileid', $builder->createNamedParameter($from))); - $query->execute(); + $this->reparentQuery->execute(); } private function delete($fileid) { - $builder = $this->connection->getQueryBuilder(); + if (!$this->deleteQuery) { + $builder = $this->connection->getQueryBuilder(); + + $this->deleteQuery = $builder->delete('filecache') + ->where($builder->expr()->eq('fileid', $builder->createParameter('fileid'))); + } + + $this->deleteQuery->setParameter('fileid', $fileid, IQueryBuilder::PARAM_INT); - $query = $builder->delete('filecache') - ->where($builder->expr()->eq('fileid', $builder->createNamedParameter($fileid))); - $query->execute(); + $this->deleteQuery->execute(); } private function repair() { |