]> git.mxchange.org Git - friendica.git/blob - src/Console/DatabaseStructure.php
Merge pull request #9248 from annando/fatal
[friendica.git] / src / Console / DatabaseStructure.php
1 <?php
2 /**
3  * @copyright Copyright (C) 2020, Friendica
4  *
5  * @license GNU AGPL version 3 or any later version
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU Affero General Public License as
9  * published by the Free Software Foundation, either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Affero General Public License for more details.
16  *
17  * You should have received a copy of the GNU Affero General Public License
18  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
19  *
20  */
21
22 namespace Friendica\Console;
23
24 use Friendica\Core\Config\Cache;
25 use Friendica\Core\Update;
26 use Friendica\Database\Database;
27 use Friendica\Database\DBStructure;
28 use RuntimeException;
29
30 /**
31  * Performs database updates from the command line
32  */
33 class DatabaseStructure extends \Asika\SimpleConsole\Console
34 {
35         protected $helpOptions = ['h', 'help', '?'];
36
37         /**
38          * @var Database
39          */
40         private $dba;
41         /**
42          * @var Cache
43          */
44         private $configCache;
45
46         protected function getHelp()
47         {
48                 $help = <<<HELP
49 console dbstructure - Performs database updates
50 Usage
51         bin/console dbstructure <command> [-h|--help|-?] |-f|--force] [-v]
52
53 Commands
54         dryrun   Show database update schema queries without running them
55         update   Update database schema
56         dumpsql  Dump database schema
57         toinnodb Convert all tables from MyISAM or InnoDB in the Antelope file format to InnoDB in the Barracuda file format
58         version  Set the database to a given number
59
60 Options
61     -h|--help|-?       Show help information
62     -v                 Show more debug information.
63     -f|--force         Force the update command (Even if the database structure matches)
64     -o|--override      Override running or stalling updates
65 HELP;
66                 return $help;
67         }
68
69         public function __construct(Database $dba, Cache $configCache, $argv = null)
70         {
71                 parent::__construct($argv);
72
73                 $this->dba = $dba;
74                 $this->configCache = $configCache;
75         }
76
77         protected function doExecute()
78         {
79                 if ($this->getOption('v')) {
80                         $this->out('Class: ' . __CLASS__);
81                         $this->out('Arguments: ' . var_export($this->args, true));
82                         $this->out('Options: ' . var_export($this->options, true));
83                 }
84
85                 if (count($this->args) == 0) {
86                         $this->out($this->getHelp());
87                         return 0;
88                 }
89
90                 if ((count($this->args) > 1) && ($this->getArgument(0) != 'version')) {
91                         throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
92                 } elseif ((count($this->args) != 2) && ($this->getArgument(0) == 'version')) {
93                         throw new \Asika\SimpleConsole\CommandArgsException('This command needs two arguments');
94                 }
95
96                 if (!$this->dba->isConnected()) {
97                         throw new RuntimeException('Unable to connect to database');
98                 }
99
100                 $basePath = $this->configCache->get('system', 'basepath');
101
102                 switch ($this->getArgument(0)) {
103                         case "dryrun":
104                                 $output = DBStructure::update($basePath, true, false);
105                                 break;
106                         case "update":
107                                 $force    = $this->getOption(['f', 'force'], false);
108                                 $override = $this->getOption(['o', 'override'], false);
109                                 $output = Update::run($basePath, $force, $override,true, false);
110                                 break;
111                         case "dumpsql":
112                                 ob_start();
113                                 DBStructure::printStructure($basePath);
114                                 $output = ob_get_clean();
115                                 break;
116                         case "toinnodb":
117                                 ob_start();
118                                 DBStructure::convertToInnoDB();
119                                 $output = ob_get_clean();
120                                 break;
121                         case "version":
122                                 ob_start();
123                                 DBStructure::setDatabaseVersion($this->getArgument(1));
124                                 $output = ob_get_clean();
125                                 break;
126                                         
127                         default:
128                                 $output = 'Unknown command: ' . $this->getArgument(0);
129                 }
130
131                 $this->out($output);
132
133                 return 0;
134         }
135 }