1 | <?php |
||
2 | |||
3 | namespace Sunnysideup\MigrateData\Tasks; |
||
4 | |||
5 | use SilverStripe\Control\Director; |
||
6 | use SilverStripe\Dev\BuildTask; |
||
7 | use SilverStripe\ORM\DB; |
||
8 | use Sunnysideup\Flush\FlushNow; |
||
9 | use Sunnysideup\Flush\FlushNowImplementor; |
||
10 | |||
11 | class ImportSql extends BuildTask |
||
12 | { |
||
13 | /** |
||
14 | * standard SS variable. |
||
15 | * |
||
16 | * @var string |
||
17 | */ |
||
18 | protected $title = 'Import SQL'; |
||
19 | |||
20 | /** |
||
21 | * standard SS variable. |
||
22 | * |
||
23 | * @var string |
||
24 | */ |
||
25 | protected $description = 'CAREFUL!!! - Import data from an SQL file'; |
||
26 | |||
27 | private static $file_names = [ |
||
28 | // 'my-sql-file-goes-here.sql', |
||
29 | ]; |
||
30 | |||
31 | public function isEnabled() |
||
32 | { |
||
33 | return Director::isDev(); |
||
34 | } |
||
35 | |||
36 | public function run($request) |
||
37 | { |
||
38 | foreach ($this->config()->get('file_names') as $fileName) { |
||
39 | FlushNowImplementor::do_flush("<hr /><hr /><hr /><hr /><hr /><hr /><hr />START: '.{$fileName}.'<hr /><hr /><hr /><hr /><hr /><hr /><hr />"); |
||
40 | |||
41 | $fileName = Director::baseFolder() . '/' . $fileName; |
||
42 | |||
43 | // Temporary variable, used to store current query |
||
44 | $templine = ''; |
||
45 | |||
46 | if (!file($fileName)) { |
||
47 | die('File not found: ' . $fileName); |
||
0 ignored issues
–
show
|
|||
48 | } |
||
49 | // Read in entire file |
||
50 | $lines = file($fileName); |
||
51 | $count = 0; |
||
52 | |||
53 | // Loop through each line |
||
54 | foreach ($lines as $line) { |
||
55 | // Skip it if it's a comment |
||
56 | if ('--' === substr((string) $line, 0, 2) || '' === $line) { |
||
57 | continue; |
||
58 | } |
||
59 | |||
60 | // Add this line to the current segment |
||
61 | $templine .= $line; |
||
62 | // If it has a semicolon at the end, it's the end of the query |
||
63 | if (';' === substr(trim($line), -1, 1)) { |
||
64 | ++$count; |
||
65 | FlushNowImplementor::do_flush('running SQL ... line: ' . $count); |
||
66 | // Perform the query |
||
67 | DB::query($templine); |
||
68 | // Reset temp variable to empty |
||
69 | $templine = ''; |
||
70 | } |
||
71 | } |
||
72 | |||
73 | FlushNowImplementor::do_flush("<hr /><hr /><hr /><hr /><hr /><hr /><hr />END: '.{$fileName}.'<hr /><hr /><hr /><hr /><hr /><hr /><hr />"); |
||
74 | } |
||
75 | FlushNowImplementor::do_flush('<hr /><hr /><hr /><hr /><hr /><hr /><hr />COMPLETED<hr /><hr /><hr /><hr /><hr /><hr /><hr />'); |
||
76 | } |
||
77 | } |
||
78 |
In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.