PluginProbe
Disk Usage Insights / trunk
Disk Usage Insights vtrunk
trunk 1.0 1.10 1.11 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9
disk-usage-insights / src / Domain / Collect / DetermineDirRecursiveSizesJob.php

DetermineDirRecursiveSizesJob.php in Disk Usage Insights trunk, at src/Domain/Collect/DetermineDirRecursiveSizesJob.php

59 lines 1.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Mgleis\DiskUsageInsights\Domain\Collect;
4
5 use Mgleis\DiskUsageInsights\Domain\Jobs\BaseJob;
6 use Mgleis\DiskUsageInsights\Domain\Jobs\PhaseCoordinatorJob;
7
8 class DetermineDirRecursiveSizesJob extends BaseJob {
9
10 public function work() {
11 $this->log(self::class);
12
13 $db = $this->queue->db;
14 $stmt = $db->prepare("
15 WITH RECURSIVE directory_sizes AS (
16 -- Base case: Start with all directories
17 SELECT
18 id AS directory_id,
19 id AS current_id,
20 COALESCE(size, 0) AS size
21 FROM fileentries
22 WHERE type = 'dir'
23
24 UNION ALL
25
26 -- Recursive step: Add files and subdirectories
27 SELECT
28 ds.directory_id,
29 fe.id AS current_id,
30 COALESCE(fe.size, 0)
31 FROM directory_sizes ds
32 JOIN fileentries fe ON fe.parent_id = ds.current_id
33 )
34 -- Update the table
35 UPDATE fileentries
36 SET dir_recursive_size = (
37 SELECT SUM(size)
38 FROM directory_sizes
39 WHERE directory_sizes.directory_id = fileentries.id
40 )
41 WHERE type = 'dir';
42 ");
43 $stmt->execute();
44
45 if ($this->queue->size() == 0) {
46 $this->queue->push((new PhaseCoordinatorJob())->toArray());
47 }
48 }
49
50 public function toArray() {
51 return ['type' => self::class, 'args' => []];
52 }
53
54 public function toDescription(): string {
55 return 'Calculating recursive dir sizes...';
56 }
57
58 }
59