Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
43.43% covered (warning)
43.43%
43 / 99
55.56% covered (warning)
55.56%
5 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
DatabaseController
43.43% covered (warning)
43.43%
43 / 99
55.56% covered (warning)
55.56%
5 / 9
243.23
0.00% covered (danger)
0.00%
0 / 1
 install
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
 config
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 test
52.00% covered (warning)
52.00%
13 / 25
0.00% covered (danger)
0.00%
0 / 1
15.08
 createSeed
47.06% covered (warning)
47.06%
8 / 17
0.00% covered (danger)
0.00%
0 / 1
14.27
 seed
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 export
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
20
 import
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
30
 reset
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 clear
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2/**
3 * Pop PHP Framework (http://www.popphp.org/)
4 *
5 * @link       https://github.com/popphp/pop-bootstrap
6 * @author     Nick Sagona, III <nick@nolainteractive.com>
7 * @copyright  Copyright (c) 2012-2024 NOLA Interactive, LLC. (http://www.nolainteractive.com)
8 * @license    http://www.popphp.org/license     New BSD License
9 */
10
11/**
12 * @namespace
13 */
14namespace Pop\Kettle\Controller;
15
16use Pop\Console\Color;
17use Pop\Kettle\Model;
18use Pop\Db\Sql\Seeder;
19
20/**
21 * Console database controller class
22 *
23 * @category   Pop\Kettle
24 * @package    Pop\Kettle
25 * @author     Nick Sagona, III <nick@nolainteractive.com>
26 * @copyright  Copyright (c) 2012-2024 NOLA Interactive, LLC. (http://www.nolainteractive.com)
27 * @license    http://www.popphp.org/license     New BSD License
28 * @version    2.3.2
29 */
30class DatabaseController extends AbstractController
31{
32
33    /**
34     * Install command
35     *
36     * @param  ?string $database
37     * @return void
38     */
39    public function install(?string $database = 'default'): void
40    {
41        if ($database === null) {
42            $database = 'default';
43        }
44
45        $location = getcwd();
46        $dbModel  = new Model\Database();
47        $dbModel->configure($this->console, $location, $database)
48            ->seed($this->console, $location, $database);
49    }
50
51    /**
52     * Config command
53     *
54     * @param  ?string $database
55     * @return void
56     */
57    public function config(?string $database = 'default'): void
58    {
59        if ($database === null) {
60            $database = 'default';
61        }
62
63        $dbModel = new Model\Database();
64        $dbModel->configure($this->console, getcwd(), $database);
65    }
66
67    /**
68     * Test command
69     *
70     * @param  ?string $database
71     * @return void
72     */
73    public function test(?string $database = 'default'): void
74    {
75        $location = getcwd();
76        $dbModel  = new Model\Database();
77
78        if ($database === null) {
79            $databases = ['default'];
80        } else if ($database == 'all') {
81            $databases = array_filter(scandir($location . '/database/migrations'), function($value) {
82                return (($value != '.') && ($value != '..'));
83            });
84        } else {
85            $databases = [$database];
86        }
87
88        if (!file_exists($location . '/app/config/database.php')) {
89            $this->console->write($this->console->colorize(
90                'The database configuration was not found.', Color::BOLD_RED
91            ));
92        } else {
93            foreach ($databases as $db) {
94                $dbConfig = include $location . '/app/config/database.php';
95                if (!isset($dbConfig[$db])) {
96                    $this->console->write($this->console->colorize(
97                        "The database configuration was not found for '" . $db . "'.", Color::BOLD_RED
98                    ));
99                } else {
100                    $result = $dbModel->test($dbConfig[$db]);
101                    if ($result !== true) {
102                        $this->console->write($this->console->colorize($result, Color::BOLD_RED));
103                    } else {
104                        $this->console->write($this->console->colorize(
105                            "Database configuration test for '" . $db . "' passed.", Color::BOLD_GREEN
106                        ));
107                    }
108                }
109            }
110        }
111    }
112
113    /**
114     * Create seed command
115     *
116     * @param  string  $seed
117     * @param  ?string $database
118     * @return void
119     */
120    public function createSeed(string $seed, ?string $database = 'default'): void
121    {
122        $location = getcwd();
123
124        if ($database === null) {
125            $databases = ['default'];
126        } else if ($database == 'all') {
127            $databases = array_filter(scandir($location . '/database/migrations'), function($value) {
128                return (($value != '.') && ($value != '..'));
129            });
130        } else {
131            $databases = [$database];
132        }
133
134        foreach ($databases as $db) {
135            if (!file_exists($location . '/database/seeds/' . $db)) {
136                mkdir($location . '/database/seeds/' . $db);
137            }
138
139            if (str_ends_with(strtolower($seed), '.sql')) {
140                touch($location . '/database/seeds/' . $db .'/' . $seed);
141                file_put_contents($location . '/database/seeds/' . $db .'/' . $seed, "-- Seed data for '" . $seed . "'" . PHP_EOL . PHP_EOL);
142                $this->console->write("Database seed file '" . $seed . "' created for '" . $db . "'.");
143            } else {
144                Seeder::create($seed, $location . '/database/seeds/' . $db);
145                $this->console->write("Database seed class '" . $seed . "' created for '" . $db . "'.");
146            }
147        }
148    }
149
150    /**
151     * Seed command
152     *
153     * @param  ?string $database
154     * @return void
155     */
156    public function seed(?string $database = 'default'): void
157    {
158        if ($database === null) {
159            $database = 'default';
160        }
161
162        $dbModel  = new Model\Database();
163        $dbModel->seed($this->console, getcwd(), $database);
164    }
165
166    /**
167     * Export command
168     *
169     * @param  ?string $database
170     * @return void
171     */
172    public function export(?string $database = 'default'): void
173    {
174        if ($database === null) {
175            $database = 'default';
176        }
177
178        $disabled = explode(',', ini_get('disable_functions'));
179
180        if (in_array('exec', $disabled)) {
181            $this->console->write($this->console->colorize(
182                "The 'exec' function is not enabled.", Color::BOLD_RED
183            ));
184        } else {
185            $output = null;
186            exec('which mysqldump', $output);
187
188            if (empty($output)) {
189                $this->console->write($this->console->colorize(
190                    "The 'mysqldump' program was not found.", Color::BOLD_RED
191                ));
192            } else {
193                $dbModel  = new Model\Database();
194                $dbModel->export($this->console, getcwd(), $database);
195            }
196        }
197    }
198
199    /**
200     * Import command
201     *
202     * @param  string  $importFile
203     * @param  ?string $database
204     * @return void
205     */
206    public function import(string $importFile,  ?string $database = 'default'): void
207    {
208        if ($database === null) {
209            $database = 'default';
210        }
211
212        $location = getcwd();
213        $disabled = explode(',', ini_get('disable_functions'));
214
215        if (in_array('exec', $disabled)) {
216            $this->console->write($this->console->colorize(
217                "The 'exec' function is not enabled.", Color::BOLD_RED
218            ));
219        } else if (!file_exists($location . '/' . $importFile)) {
220            $this->console->write($this->console->colorize(
221                'The database import file was not found.', Color::BOLD_RED
222            ));
223        } else {
224            $output = null;
225            exec('which mysql', $output);
226
227            if (empty($output)) {
228                $this->console->write($this->console->colorize(
229                    "The 'mysql' program was not found.", Color::BOLD_RED
230                ));
231            } else {
232                $dbModel  = new Model\Database();
233                $dbModel->import($this->console, getcwd(), $importFile, $database);
234            }
235        }
236    }
237
238    /**
239     * Reset command
240     *
241     * @param  ?string $database
242     * @return void
243     */
244    public function reset(?string $database = 'default'): void
245    {
246        if ($database === null) {
247            $database = 'default';
248        }
249
250        $dbModel  = new Model\Database();
251        $dbModel->reset($this->console, getcwd(), $database);
252    }
253
254    /**
255     * Clear command
256     *
257     * @param  ?string $database
258     * @return void
259     */
260    public function clear(?string $database = 'default'): void
261    {
262        if ($database === null) {
263            $database = 'default';
264        }
265
266        $dbModel  = new Model\Database();
267        $dbModel->clear($this->console, getcwd(), $database);
268    }
269
270}