CleanUpSS4Files::run()   A
last analyzed

Complexity

Conditions 4
Paths 6

Size

Total Lines 32
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 19
c 0
b 0
f 0
dl 0
loc 32
rs 9.6333
cc 4
nc 6
nop 1
1
<?php
2
3
namespace Sunnysideup\MigrateData\Tasks;
4
5
use SilverStripe\Assets\File;
6
use SilverStripe\Control\Director;
7
use SilverStripe\Dev\BuildTask;
8
use SilverStripe\ORM\DB;
9
10
/**
11
 * Update all systems.
12
 *
13
 * Class UpdateSystemsWithProductCodeVariantKeywords
14
 */
15
class CleanUpSS4Files extends BuildTask
16
{
17
    /**
18
     * @var string
19
     */
20
    protected $title = 'Removes non-existent files from DB';
21
22
    /**
23
     * @var string
24
     */
25
    protected $description = 'You can run this script straight after an upgrade to remove files that are not physically present.';
26
27
    /**
28
     * Method to save all System dataobjects and trigger the onBeforeWrite() event handler.
29
     *
30
     * @param mixed $request
31
     */
32
    public function run($request)
33
    {
34
        $sql = '
35
        SELECT Filename
36
        FROM `File`
37
            LEFT JOIN File_Live ON File.ID = File_Live.ID
38
        WHERE File_Live.ID IS NULL AND File.ClassName = \'SilverStripe\\\Assets\\\File\' ORDER BY File.Filename
39
        ';
40
        $rows = DB::query($sql);
41
        echo '<h2>Files that are not published</h2>';
42
        foreach ($rows as $row) {
43
            DB::alteration_message($row['Filename'], 'deleted');
44
        }
45
46
        $sql = '
47
            SELECT "Filename", "ID"
48
            FROM "File"
49
            WHERE
50
                "ClassName" = \'' . addslashes(File::class) . '\'
51
            ORDER BY Filename ASC';
52
        $rows = DB::query($sql);
53
        $baseDir = Director::baseFolder() . '/public/';
54
        foreach ($rows as $row) {
55
            $fullName = $baseDir . $row['Filename'];
56
            if (file_exists($fullName)) {
57
                echo '.';
58
            } else {
59
                DB::alteration_message('DELETING: ' . $fullName, 'deleted');
60
                $sql = 'DELETE FROM File WHERE ID = ' . $row['ID'] . ';';
61
                DB::query($sql);
62
                $sql = 'DELETE FROM File_Live WHERE ID = ' . $row['ID'] . ';';
63
                DB::query($sql);
64
            }
65
        }
66
    }
67
}
68