]> git.mxchange.org Git - friendica.git/blobdiff - src/Console/DatabaseStructure.php
API: Accept "redirect_uris" as both array and string
[friendica.git] / src / Console / DatabaseStructure.php
index 62c8136406c9510d8982d43e4ed594ce81d0ea21..c78d8ace85cf86082a8f1ea9795b0edf422b4331 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2023, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
 
 namespace Friendica\Console;
 
-use Friendica\Core\Config\Cache;
+use Friendica\Core\Config\ValueObject\Cache;
 use Friendica\Core\Update;
 use Friendica\Database\Database;
 use Friendica\Database\DBStructure;
+use Friendica\Database\Definition\DbaDefinition;
+use Friendica\Database\Definition\ViewDefinition;
+use Friendica\Util\BasePath;
+use Friendica\Util\Writer\DbaDefinitionSqlWriter;
+use Friendica\Util\Writer\DocWriter;
+use Friendica\Util\Writer\ViewDefinitionSqlWriter;
 use RuntimeException;
 
 /**
@@ -34,46 +40,61 @@ class DatabaseStructure extends \Asika\SimpleConsole\Console
 {
        protected $helpOptions = ['h', 'help', '?'];
 
-       /**
-        * @var Database
-        */
+       /** @var Database */
        private $dba;
-       /**
-        * @var Cache
-        */
+
+       /** @var Cache */
        private $configCache;
 
+       /** @var DbaDefinition */
+       private $dbaDefinition;
+
+       /** @var ViewDefinition */
+       private $viewDefinition;
+
+       /** @var string */
+       private $basePath;
+
        protected function getHelp()
        {
                $help = <<<HELP
 console dbstructure - Performs database updates
 Usage
-       bin/console dbstructure <command> [-h|--help|-?] |-f|--force] [-v]
+       bin/console dbstructure <command> [options]
 
 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
+    drop     Show tables that aren't in use by Friendica anymore and can be dropped
+       -e|--execute    Execute the removal
 
-Options
+    update   Update database schema
+       -f|--force      Force the update command (Even if the database structure matches)
+       -o|--override   Override running or stalling updates
+
+    dryrun   Show database update schema queries without running them
+    dumpsql  Dump database schema
+    toinnodb Convert all tables from MyISAM or InnoDB in the Antelope file format to InnoDB in the Barracuda file format
+    initial  Set needed initial values in the tables
+    version  Set the database to a given number
+
+General Options
     -h|--help|-?       Show help information
     -v                 Show more debug information.
-    -f|--force         Force the update command (Even if the database structure matches)
-    -o|--override      Override running or stalling updates
 HELP;
                return $help;
        }
 
-       public function __construct(Database $dba, Cache $configCache, $argv = null)
+       public function __construct(Database $dba, DbaDefinition $dbaDefinition, ViewDefinition $viewDefinition, BasePath $basePath, Cache $configCache, $argv = null)
        {
                parent::__construct($argv);
 
                $this->dba = $dba;
+               $this->dbaDefinition = $dbaDefinition;
+               $this->viewDefinition = $viewDefinition;
                $this->configCache = $configCache;
+               $this->basePath = $basePath->getPath();
        }
 
-       protected function doExecute()
+       protected function doExecute(): int
        {
                if ($this->getOption('v')) {
                        $this->out('Class: ' . __CLASS__);
@@ -86,8 +107,10 @@ HELP;
                        return 0;
                }
 
-               if (count($this->args) > 1) {
+               if ((count($this->args) > 1) && ($this->getArgument(0) != 'version')) {
                        throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
+               } elseif ((count($this->args) != 2) && ($this->getArgument(0) == 'version')) {
+                       throw new \Asika\SimpleConsole\CommandArgsException('This command needs two arguments');
                }
 
                if (!$this->dba->isConnected()) {
@@ -98,28 +121,44 @@ HELP;
 
                switch ($this->getArgument(0)) {
                        case "dryrun":
-                               $output = DBStructure::update($basePath, true, false);
+                               $output = DBStructure::dryRun();
                                break;
                        case "update":
                                $force    = $this->getOption(['f', 'force'], false);
                                $override = $this->getOption(['o', 'override'], false);
                                $output = Update::run($basePath, $force, $override,true, false);
                                break;
-                       case "dumpsql":
+                       case "drop":
+                               $execute = $this->getOption(['e', 'execute'], false);
                                ob_start();
-                               DBStructure::printStructure($basePath);
+                               DBStructure::dropTables($execute);
                                $output = ob_get_clean();
                                break;
+                       case "dumpsql":
+                               DocWriter::writeDbDefinition($this->dbaDefinition, $this->basePath);
+                               $output = DbaDefinitionSqlWriter::create($this->dbaDefinition);
+                               $output .= ViewDefinitionSqlWriter::create($this->viewDefinition);
+                               break;
                        case "toinnodb":
                                ob_start();
                                DBStructure::convertToInnoDB();
                                $output = ob_get_clean();
                                break;
+                       case "version":
+                               ob_start();
+                               DBStructure::setDatabaseVersion($this->getArgument(1));
+                               $output = ob_get_clean();
+                               break;
+                       case "initial":
+                               ob_start();
+                               DBStructure::checkInitialValues(true);
+                               $output = ob_get_clean();
+                               break;
                        default:
                                $output = 'Unknown command: ' . $this->getArgument(0);
                }
 
-               $this->out($output);
+               $this->out(trim($output));
 
                return 0;
        }