]> git.mxchange.org Git - friendica.git/commitdiff
Add DBStructure Console
authorHypolite Petovan <mrpetovan@gmail.com>
Mon, 19 Mar 2018 03:10:56 +0000 (23:10 -0400)
committerHypolite Petovan <mrpetovan@gmail.com>
Mon, 19 Mar 2018 03:10:56 +0000 (23:10 -0400)
- Refactor subConsole instantiation

src/Core/Console.php
src/Core/Console/DatabaseStructure.php [new file with mode: 0644]

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