Signed-off-by: Joas Schilling <coding@schilljs.com>pull/6825/head
parent
697d4c8847
commit
e2ec6b33ea
@ -0,0 +1,101 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2017 Joas Schilling <coding@schilljs.com> |
||||
* |
||||
* @author Joas Schilling <coding@schilljs.com> |
||||
* |
||||
* @license GNU AGPL version 3 or any later version |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License as |
||||
* published by the Free Software Foundation, either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OC\Core\Command\Db; |
||||
|
||||
use Doctrine\DBAL\Types\Type; |
||||
use OC\DB\SchemaWrapper; |
||||
use OCP\IDBConnection; |
||||
use Symfony\Component\Console\Command\Command; |
||||
use Symfony\Component\Console\Input\InputInterface; |
||||
use Symfony\Component\Console\Output\OutputInterface; |
||||
use Symfony\Component\Console\Question\ConfirmationQuestion; |
||||
|
||||
class ConvertFilecacheBigInt extends Command { |
||||
|
||||
/** @var IDBConnection */ |
||||
private $connection; |
||||
|
||||
/** |
||||
* @param IDBConnection $connection |
||||
*/ |
||||
public function __construct(IDBConnection $connection) { |
||||
$this->connection = $connection; |
||||
parent::__construct(); |
||||
} |
||||
|
||||
protected function configure() { |
||||
$this |
||||
->setName('db:convert-filecache-bigint') |
||||
->setDescription('Convert the ID columns of the filecache to BigInt'); |
||||
} |
||||
|
||||
protected function getColumnsByTable() { |
||||
return [ |
||||
'filecache' => ['fileid', 'storage', 'parent', 'mimetype', 'mimepart'], |
||||
'mimetypes' => ['id'], |
||||
'storages' => ['numeric_id'], |
||||
]; |
||||
} |
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output) { |
||||
|
||||
$schema = new SchemaWrapper($this->connection); |
||||
$updates = []; |
||||
|
||||
$tables = $this->getColumnsByTable(); |
||||
foreach ($tables as $tableName => $columns) { |
||||
$table = $schema->getTable($tableName); |
||||
|
||||
foreach ($columns as $columnName) { |
||||
$column = $table->getColumn($columnName); |
||||
if ($column->getType()->getName() !== Type::BIGINT) { |
||||
$column->setType(Type::getType(Type::BIGINT)); |
||||
$column->setOptions(['length' => 20]); |
||||
|
||||
$updates[] = $tableName . '.' . $columnName; |
||||
} |
||||
} |
||||
} |
||||
|
||||
if (empty($updates)) { |
||||
$output->writeln('<info>All tables already up to date!</info>'); |
||||
return 0; |
||||
} |
||||
|
||||
$output->writeln('<comment>This can take up to hours, depending on the number of files in your instance!</comment>'); |
||||
|
||||
if ($input->isInteractive()) { |
||||
$helper = $this->getHelper('question'); |
||||
$question = new ConfirmationQuestion('Continue with the conversion (y/n)? [n] ', false); |
||||
|
||||
if (!$helper->ask($input, $output, $question)) { |
||||
return 1; |
||||
} |
||||
} |
||||
|
||||
$this->connection->migrateToSchema($schema->getWrappedSchema()); |
||||
|
||||
return 0; |
||||
} |
||||
} |
||||
Loading…
Reference in new issue