Passed
Push — master ( 2fbb6b...81caef )
by Roeland
12:37 queued 10s
created
apps/files/lib/Command/RepairTree.php 1 patch
Indentation   +100 added lines, -100 removed lines patch added patch discarded remove patch
@@ -29,104 +29,104 @@
 block discarded – undo
29 29
 use Symfony\Component\Console\Output\OutputInterface;
30 30
 
31 31
 class RepairTree extends Command {
32
-	public const CHUNK_SIZE = 200;
33
-
34
-	/**
35
-	 * @var IDBConnection
36
-	 */
37
-	protected $connection;
38
-
39
-	public function __construct(IDBConnection $connection) {
40
-		$this->connection = $connection;
41
-		parent::__construct();
42
-	}
43
-
44
-	protected function configure() {
45
-		$this
46
-			->setName('files:repair-tree')
47
-			->setDescription('Try and repair malformed filesystem tree structures')
48
-			->addOption('dry-run');
49
-	}
50
-
51
-	public function execute(InputInterface $input, OutputInterface $output): int {
52
-		$rows = $this->findBrokenTreeBits();
53
-		$fix = !$input->getOption('dry-run');
54
-
55
-		$output->writeln("Found " . count($rows) . " file entries with an invalid path");
56
-
57
-		if ($fix) {
58
-			$this->connection->beginTransaction();
59
-		}
60
-
61
-		$query = $this->connection->getQueryBuilder();
62
-		$query->update('filecache')
63
-			->set('path', $query->createParameter('path'))
64
-			->set('path_hash', $query->func()->md5($query->createParameter('path')))
65
-			->set('storage', $query->createParameter('storage'))
66
-			->where($query->expr()->eq('fileid', $query->createParameter('fileid')));
67
-
68
-		foreach ($rows as $row) {
69
-			$output->writeln("Path of file ${row['fileid']} is ${row['path']} but should be ${row['parent_path']}/${row['name']} based on it's parent", OutputInterface::VERBOSITY_VERBOSE);
70
-
71
-			if ($fix) {
72
-				$fileId = $this->getFileId((int)$row['parent_storage'], $row['parent_path'] . '/' . $row['name']);
73
-				if ($fileId > 0) {
74
-					$output->writeln("Cache entry has already be recreated with id $fileId, deleting instead");
75
-					$this->deleteById((int)$row['fileid']);
76
-				} else {
77
-					$query->setParameters([
78
-						'fileid' => $row['fileid'],
79
-						'path' => $row['parent_path'] . '/' . $row['name'],
80
-						'storage' => $row['parent_storage'],
81
-					]);
82
-					$query->execute();
83
-				}
84
-			}
85
-		}
86
-
87
-		if ($fix) {
88
-			$this->connection->commit();
89
-		}
90
-
91
-		return 0;
92
-	}
93
-
94
-	private function getFileId(int $storage, string $path) {
95
-		$query = $this->connection->getQueryBuilder();
96
-		$query->select('fileid')
97
-			->from('filecache')
98
-			->where($query->expr()->eq('storage', $query->createNamedParameter($storage)))
99
-			->andWhere($query->expr()->eq('path_hash', $query->createNamedParameter(md5($path))));
100
-		return $query->execute()->fetch(\PDO::FETCH_COLUMN);
101
-	}
102
-
103
-	private function deleteById(int $fileId) {
104
-		$query = $this->connection->getQueryBuilder();
105
-		$query->delete('filecache')
106
-			->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId)));
107
-		$query->execute();
108
-	}
109
-
110
-	private function findBrokenTreeBits(): array {
111
-		$query = $this->connection->getQueryBuilder();
112
-
113
-		$query->select('f.fileid', 'f.path', 'f.parent', 'f.name')
114
-			->selectAlias('p.path', 'parent_path')
115
-			->selectAlias('p.storage', 'parent_storage')
116
-			->from('filecache', 'f')
117
-			->innerJoin('f', 'filecache', 'p', $query->expr()->eq('f.parent', 'p.fileid'))
118
-			->where($query->expr()->orX(
119
-				$query->expr()->andX(
120
-					$query->expr()->neq('p.path_hash', $query->createNamedParameter(md5(''))),
121
-					$query->expr()->neq('f.path', $query->func()->concat('p.path', $query->func()->concat($query->createNamedParameter('/'), 'f.name')))
122
-				),
123
-				$query->expr()->andX(
124
-					$query->expr()->eq('p.path_hash', $query->createNamedParameter(md5(''))),
125
-					$query->expr()->neq('f.path', 'f.name')
126
-				),
127
-				$query->expr()->neq('f.storage', 'p.storage')
128
-			));
129
-
130
-		return $query->execute()->fetchAll();
131
-	}
32
+    public const CHUNK_SIZE = 200;
33
+
34
+    /**
35
+     * @var IDBConnection
36
+     */
37
+    protected $connection;
38
+
39
+    public function __construct(IDBConnection $connection) {
40
+        $this->connection = $connection;
41
+        parent::__construct();
42
+    }
43
+
44
+    protected function configure() {
45
+        $this
46
+            ->setName('files:repair-tree')
47
+            ->setDescription('Try and repair malformed filesystem tree structures')
48
+            ->addOption('dry-run');
49
+    }
50
+
51
+    public function execute(InputInterface $input, OutputInterface $output): int {
52
+        $rows = $this->findBrokenTreeBits();
53
+        $fix = !$input->getOption('dry-run');
54
+
55
+        $output->writeln("Found " . count($rows) . " file entries with an invalid path");
56
+
57
+        if ($fix) {
58
+            $this->connection->beginTransaction();
59
+        }
60
+
61
+        $query = $this->connection->getQueryBuilder();
62
+        $query->update('filecache')
63
+            ->set('path', $query->createParameter('path'))
64
+            ->set('path_hash', $query->func()->md5($query->createParameter('path')))
65
+            ->set('storage', $query->createParameter('storage'))
66
+            ->where($query->expr()->eq('fileid', $query->createParameter('fileid')));
67
+
68
+        foreach ($rows as $row) {
69
+            $output->writeln("Path of file ${row['fileid']} is ${row['path']} but should be ${row['parent_path']}/${row['name']} based on it's parent", OutputInterface::VERBOSITY_VERBOSE);
70
+
71
+            if ($fix) {
72
+                $fileId = $this->getFileId((int)$row['parent_storage'], $row['parent_path'] . '/' . $row['name']);
73
+                if ($fileId > 0) {
74
+                    $output->writeln("Cache entry has already be recreated with id $fileId, deleting instead");
75
+                    $this->deleteById((int)$row['fileid']);
76
+                } else {
77
+                    $query->setParameters([
78
+                        'fileid' => $row['fileid'],
79
+                        'path' => $row['parent_path'] . '/' . $row['name'],
80
+                        'storage' => $row['parent_storage'],
81
+                    ]);
82
+                    $query->execute();
83
+                }
84
+            }
85
+        }
86
+
87
+        if ($fix) {
88
+            $this->connection->commit();
89
+        }
90
+
91
+        return 0;
92
+    }
93
+
94
+    private function getFileId(int $storage, string $path) {
95
+        $query = $this->connection->getQueryBuilder();
96
+        $query->select('fileid')
97
+            ->from('filecache')
98
+            ->where($query->expr()->eq('storage', $query->createNamedParameter($storage)))
99
+            ->andWhere($query->expr()->eq('path_hash', $query->createNamedParameter(md5($path))));
100
+        return $query->execute()->fetch(\PDO::FETCH_COLUMN);
101
+    }
102
+
103
+    private function deleteById(int $fileId) {
104
+        $query = $this->connection->getQueryBuilder();
105
+        $query->delete('filecache')
106
+            ->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId)));
107
+        $query->execute();
108
+    }
109
+
110
+    private function findBrokenTreeBits(): array {
111
+        $query = $this->connection->getQueryBuilder();
112
+
113
+        $query->select('f.fileid', 'f.path', 'f.parent', 'f.name')
114
+            ->selectAlias('p.path', 'parent_path')
115
+            ->selectAlias('p.storage', 'parent_storage')
116
+            ->from('filecache', 'f')
117
+            ->innerJoin('f', 'filecache', 'p', $query->expr()->eq('f.parent', 'p.fileid'))
118
+            ->where($query->expr()->orX(
119
+                $query->expr()->andX(
120
+                    $query->expr()->neq('p.path_hash', $query->createNamedParameter(md5(''))),
121
+                    $query->expr()->neq('f.path', $query->func()->concat('p.path', $query->func()->concat($query->createNamedParameter('/'), 'f.name')))
122
+                ),
123
+                $query->expr()->andX(
124
+                    $query->expr()->eq('p.path_hash', $query->createNamedParameter(md5(''))),
125
+                    $query->expr()->neq('f.path', 'f.name')
126
+                ),
127
+                $query->expr()->neq('f.storage', 'p.storage')
128
+            ));
129
+
130
+        return $query->execute()->fetchAll();
131
+    }
132 132
 }
Please login to merge, or discard this patch.