From 2f1a1debf44b430d3e86e584580e70625af7c335 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:10:56 -0400 Subject: [PATCH] Add DBStructure Console - Refactor subConsole instantiation --- src/Core/Console.php | 48 +++++------ src/Core/Console/DatabaseStructure.php | 110 +++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 27 deletions(-) create mode 100644 src/Core/Console/DatabaseStructure.php diff --git a/src/Core/Console.php b/src/Core/Console.php index 6201499371..63aca9301c 100644 --- a/src/Core/Console.php +++ b/src/Core/Console.php @@ -13,16 +13,29 @@ class Console extends \Asika\SimpleConsole\Console protected $helpOptions = []; protected $customHelpOptions = ['h', 'help', '?']; + protected $subConsoles = [ + 'config' => __NAMESPACE__ . '\Console\Config', + 'createdoxygen' => __NAMESPACE__ . '\Console\CreateDoxygen', + 'docbloxerrorchecker' => __NAMESPACE__ . '\Console\DocBloxErrorChecker', + 'dbstructure' => __NAMESPACE__ . '\Console\DatabaseStructure', + 'extract' => __NAMESPACE__ . '\Console\Extract', + 'globalcommunityblock' => __NAMESPACE__ . '\Console\GlobalCommunityBlock', + 'globalcommunitysilence' => __NAMESPACE__ . '\Console\GlobalCommunitySilence', + 'maintenance' => __NAMESPACE__ . '\Console\Maintenance', + 'php2po' => __NAMESPACE__ . '\Console\PhpToPo', + 'po2php' => __NAMESPACE__ . '\Console\PoToPhp', + 'typo' => __NAMESPACE__ . '\Console\Typo', + ]; + protected function getHelp() { - - $help = << [] [-v] Commands: config Edit site config createdoxygen Generate Doxygen headers + dbstructure Do database updates docbloxerrorchecker Check the file tree for DocBlox errors extract Generate translation string file for the Friendica project (deprecated) globalcommunityblock Block remote profile from interacting with this node @@ -89,35 +102,16 @@ HELP; $this->out('Command: ' . $command); } + if (!isset($this->subConsoles[$command])) { + throw new \Asika\SimpleConsole\CommandArgsException('Command ' . $command . ' doesn\'t exist'); + } + $subargs = $this->args; array_unshift($subargs, $this->executable); - $subconsole = null; + $className = $this->subConsoles[$command]; - switch ($command) { - case 'config' : $subconsole = new Console\Config($subargs); - break; - case 'createdoxygen' : $subconsole = new Console\CreateDoxygen($subargs); - break; - case 'docbloxerrorchecker' : $subconsole = new Console\DocBloxErrorChecker($subargs); - break; - case 'extract' : $subconsole = new Console\Extract($subargs); - break; - case 'globalcommunityblock': $subconsole = new Console\GlobalCommunityBlock($subargs); - break; - case 'globalcommunitysilence': $subconsole = new Console\GlobalCommunitySilence($subargs); - break; - case 'maintenance': $subconsole = new Console\Maintenance($subargs); - break; - case 'php2po': $subconsole = new Console\PhpToPo($subargs); - break; - case 'po2php': $subconsole = new Console\PoToPhp($subargs); - break; - case 'typo': $subconsole = new Console\Typo($subargs); - break; - default: - throw new \Asika\SimpleConsole\CommandArgsException('Command ' . $command . ' doesn\'t exist'); - } + $subconsole = new $className($subargs); foreach ($this->options as $name => $value) { $subconsole->setOption($name, $value); diff --git a/src/Core/Console/DatabaseStructure.php b/src/Core/Console/DatabaseStructure.php new file mode 100644 index 0000000000..709b9724e8 --- /dev/null +++ b/src/Core/Console/DatabaseStructure.php @@ -0,0 +1,110 @@ + + */ +class DatabaseStructure extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = << [-h|--help|-?] [-v] + +Commands + dryrun Show database update schema queries without running them + update Update database schema + dumpsql Dump database schema + toinnodb Convert all tables from MyISAM to InnoDB + +Options + -h|--help|-? Show help information + -v Show more debug information. +HELP; + return $help; + } + + protected function doExecute() + { + if ($this->getOption('v')) { + $this->out('Class: ' . __CLASS__); + $this->out('Arguments: ' . var_export($this->args, true)); + $this->out('Options: ' . var_export($this->options, true)); + } + + if (count($this->args) == 0) { + $this->out($this->getHelp()); + return 0; + } + + if (count($this->args) > 1) { + throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments'); + } + + require_once '.htconfig.php'; + $result = \dba::connect($db_host, $db_user, $db_pass, $db_data); + unset($db_host, $db_user, $db_pass, $db_data); + + if (!$result) { + throw new \RuntimeException('Unable to connect to database'); + } + + Core\Config::load(); + + switch ($this->getArgument(0)) { + case "dryrun": + $output = DBStructure::update(true, false); + break; + case "update": + $output = DBStructure::update(true, true); + + $build = Core\Config::get('system', 'build'); + if (empty($build)) { + Core\Config::set('system', 'build', DB_UPDATE_VERSION); + $build = DB_UPDATE_VERSION; + } + + $stored = intval($build); + $current = intval(DB_UPDATE_VERSION); + + // run any left update_nnnn functions in update.php + for ($x = $stored; $x < $current; $x ++) { + $r = run_update_function($x); + if (!$r) { + break; + } + } + + Core\Config::set('system', 'build', DB_UPDATE_VERSION); + break; + case "dumpsql": + ob_start(); + DBStructure::printStructure(); + $output = ob_get_clean(); + break; + case "toinnodb": + ob_start(); + DBStructure::convertToInnoDB(); + $output = ob_get_clean(); + break; + } + + $this->out($output); + + return 0; + } + +}