diff --git a/src/Console/DatabaseStructure.php b/src/Console/DatabaseStructure.php index 5a92587fc..b998c420b 100644 --- a/src/Console/DatabaseStructure.php +++ b/src/Console/DatabaseStructure.php @@ -48,11 +48,12 @@ class DatabaseStructure extends \Asika\SimpleConsole\Console $help = << [-h|--help|-?] |-f|--force] [-v] + bin/console dbstructure [-h|--help|-?] [-e|--execute] |-f|--force] [-o|--override] [-v] Commands dryrun Show database update schema queries without running them update Update database schema + drop Drop tables that aren't in use anymore 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 @@ -61,8 +62,9 @@ Commands Options -h|--help|-? Show help information -v Show more debug information. + -e|--execute Execute the dropping. -f|--force Force the update command (Even if the database structure matches) - -o|--override Override running or stalling updates + -o|--override Override running or stalling updates HELP; return $help; } @@ -109,6 +111,12 @@ HELP; $override = $this->getOption(['o', 'override'], false); $output = Update::run($basePath, $force, $override,true, false); break; + case "drop": + $execute = $this->getOption(['e', 'execute'], false); + ob_start(); + DBStructure::dropTables($execute); + $output = ob_get_clean(); + break; case "dumpsql": ob_start(); DBStructure::printStructure($basePath); @@ -133,7 +141,7 @@ HELP; $output = 'Unknown command: ' . $this->getArgument(0); } - $this->out($output); + $this->out(trim($output)); return 0; } diff --git a/src/Database/DBStructure.php b/src/Database/DBStructure.php index aa6a0cf29..9b69f7b11 100644 --- a/src/Database/DBStructure.php +++ b/src/Database/DBStructure.php @@ -64,6 +64,46 @@ class DBStructure echo DI::l10n()->t('The database version had been set to %s.', $version); } + /** + * Drop unused tables + * + * @param boolean $execute + * @return void + */ + public static function dropTables(bool $execute) + { + $old_tables = ['fserver', 'gcign', 'gcontact', 'gcontact-relation', 'gfollower' ,'glink', 'item-delivery-data', + 'item_id', 'poll', 'poll_result', 'queue', 'retriever_rule', 'sign', 'spam', 'term']; + + $tables = DBA::selectToArray(['INFORMATION_SCHEMA' => 'TABLES'], ['TABLE_NAME'], + ['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_TYPE' => 'BASE TABLE']); + + if (empty($tables)) { + echo DI::l10n()->t('No unused tables found.'); + return; + } + + if (!$execute) { + echo DI::l10n()->t('These tables are not used for friendica and will be deleted when you execute "dbstructure drop -e":') . "\n\n"; + } + + foreach ($tables as $table) { + if (in_array($table['TABLE_NAME'], $old_tables)) { + if ($execute) { + $sql = 'DROP TABLE ' . DBA::quoteIdentifier($table['TABLE_NAME']) . ';'; + echo $sql . "\n"; + + $result = DBA::e($sql); + if (!DBA::isResult($result)) { + self::printUpdateError($sql); + } + } else { + echo $table['TABLE_NAME'] . "\n"; + } + } + } + } + /** * Converts all tables from MyISAM/InnoDB Antelope to InnoDB Barracuda */ diff --git a/src/Database/View.php b/src/Database/View.php index fd0a8ce1a..845706320 100644 --- a/src/Database/View.php +++ b/src/Database/View.php @@ -158,7 +158,7 @@ class View } /** - * Check if the given table/view is a view + * Check if the given table/view is a table * * @param string $table * @return boolean "true" if it's a table