diff --git a/core/Command/Db/ConvertFilecacheBigInt.php b/core/Command/Db/ConvertFilecacheBigInt.php new file mode 100644 index 0000000000..75d3a48a5c --- /dev/null +++ b/core/Command/Db/ConvertFilecacheBigInt.php @@ -0,0 +1,107 @@ + + * + * @author Joas Schilling + * + * @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 . + * + */ + +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 [ + 'activity' => ['activity_id', 'object_id'], + 'activity_mq' => ['mail_id'], + '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) { + if (!$schema->hasTable($tableName)) { + continue; + } + + $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('All tables already up to date!'); + return 0; + } + + $output->writeln('This can take up to hours, depending on the number of files in your instance!'); + + 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; + } +} diff --git a/core/Migrations/Version13000Date20170718121200.php b/core/Migrations/Version13000Date20170718121200.php index d8d66696a1..0ab777f6de 100644 --- a/core/Migrations/Version13000Date20170718121200.php +++ b/core/Migrations/Version13000Date20170718121200.php @@ -24,6 +24,7 @@ namespace OC\Core\Migrations; use Doctrine\DBAL\Schema\Schema; +use Doctrine\DBAL\Types\Type; use OCP\Migration\SimpleMigrationStep; use OCP\Migration\IOutput; @@ -66,10 +67,10 @@ class Version13000Date20170718121200 extends SimpleMigrationStep { 'notnull' => false, 'length' => 64, ]); - $table->addColumn('numeric_id', 'integer', [ + $table->addColumn('numeric_id', Type::BIGINT, [ 'autoincrement' => true, 'notnull' => true, - 'length' => 4, + 'length' => 20, ]); $table->addColumn('available', 'integer', [ 'notnull' => true, @@ -116,10 +117,10 @@ class Version13000Date20170718121200 extends SimpleMigrationStep { if (!$schema->hasTable('mimetypes')) { $table = $schema->createTable('mimetypes'); - $table->addColumn('id', 'integer', [ + $table->addColumn('id', Type::BIGINT, [ 'autoincrement' => true, 'notnull' => true, - 'length' => 4, + 'length' => 20, ]); $table->addColumn('mimetype', 'string', [ 'notnull' => true, @@ -132,14 +133,14 @@ class Version13000Date20170718121200 extends SimpleMigrationStep { if (!$schema->hasTable('filecache')) { $table = $schema->createTable('filecache'); - $table->addColumn('fileid', 'integer', [ + $table->addColumn('fileid', Type::BIGINT, [ 'autoincrement' => true, 'notnull' => true, - 'length' => 4, + 'length' => 20, ]); - $table->addColumn('storage', 'integer', [ + $table->addColumn('storage', Type::BIGINT, [ 'notnull' => true, - 'length' => 4, + 'length' => 20, 'default' => 0, ]); $table->addColumn('path', 'string', [ @@ -151,23 +152,23 @@ class Version13000Date20170718121200 extends SimpleMigrationStep { 'length' => 32, 'default' => '', ]); - $table->addColumn('parent', 'integer', [ + $table->addColumn('parent', Type::BIGINT, [ 'notnull' => true, - 'length' => 4, + 'length' => 20, 'default' => 0, ]); $table->addColumn('name', 'string', [ 'notnull' => false, 'length' => 250, ]); - $table->addColumn('mimetype', 'integer', [ + $table->addColumn('mimetype', Type::BIGINT, [ 'notnull' => true, - 'length' => 4, + 'length' => 20, 'default' => 0, ]); - $table->addColumn('mimepart', 'integer', [ + $table->addColumn('mimepart', Type::BIGINT, [ 'notnull' => true, - 'length' => 4, + 'length' => 20, 'default' => 0, ]); $table->addColumn('size', 'bigint', [ diff --git a/core/Migrations/Version13000Date20170926101637.php b/core/Migrations/Version13000Date20170926101637.php index 3eea8a8a3b..ded34cedd3 100644 --- a/core/Migrations/Version13000Date20170926101637.php +++ b/core/Migrations/Version13000Date20170926101637.php @@ -22,15 +22,15 @@ class Version13000Date20170926101637 extends BigIntMigration { 'authtoken' => ['id'], 'bruteforce_attempts' => ['id'], 'comments' => ['id', 'parent_id', 'topmost_parent_id'], - 'filecache' => ['fileid', 'storage', 'parent', 'mimetype', 'mimepart'], + // Disabled for now 'filecache' => ['fileid', 'storage', 'parent', 'mimetype', 'mimepart'], 'file_locks' => ['id'], 'jobs' => ['id'], - 'mimetypes' => ['id'], + // Disabled for now 'mimetypes' => ['id'], 'mounts' => ['id'], 'personal_settings' => ['id'], 'properties' => ['id'], 'share' => ['id', 'parent', 'file_source'], - 'storages' => ['numeric_id'], + // Disabled for now 'storages' => ['numeric_id'], 'systemtag' => ['id'], 'systemtag_group' => ['systemtagid'], 'systemtag_object_mapping' => ['systemtagid'], diff --git a/core/register_command.php b/core/register_command.php index 02bdbedc6e..3cba056599 100644 --- a/core/register_command.php +++ b/core/register_command.php @@ -85,6 +85,7 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) { $application->add(new OC\Core\Command\Db\ConvertType(\OC::$server->getConfig(), new \OC\DB\ConnectionFactory(\OC::$server->getSystemConfig()))); $application->add(new OC\Core\Command\Db\ConvertMysqlToMB4(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection(), \OC::$server->getURLGenerator(), \OC::$server->getLogger())); + $application->add(new OC\Core\Command\Db\ConvertFilecacheBigInt(\OC::$server->getDatabaseConnection())); $application->add(new OC\Core\Command\Db\Migrations\StatusCommand(\OC::$server->getDatabaseConnection())); $application->add(new OC\Core\Command\Db\Migrations\MigrateCommand(\OC::$server->getDatabaseConnection())); $application->add(new OC\Core\Command\Db\Migrations\GenerateCommand(\OC::$server->getDatabaseConnection())); diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 489b9b3dc1..07f815f85c 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -440,6 +440,7 @@ return array( 'OC\\Core\\Command\\Config\\System\\DeleteConfig' => $baseDir . '/core/Command/Config/System/DeleteConfig.php', 'OC\\Core\\Command\\Config\\System\\GetConfig' => $baseDir . '/core/Command/Config/System/GetConfig.php', 'OC\\Core\\Command\\Config\\System\\SetConfig' => $baseDir . '/core/Command/Config/System/SetConfig.php', + 'OC\\Core\\Command\\Db\\ConvertFilecacheBigInt' => $baseDir . '/core/Command/Db/ConvertFilecacheBigInt.php', 'OC\\Core\\Command\\Db\\ConvertMysqlToMB4' => $baseDir . '/core/Command/Db/ConvertMysqlToMB4.php', 'OC\\Core\\Command\\Db\\ConvertType' => $baseDir . '/core/Command/Db/ConvertType.php', 'OC\\Core\\Command\\Db\\Migrations\\ExecuteCommand' => $baseDir . '/core/Command/Db/Migrations/ExecuteCommand.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 1297f4606f..0d327b7267 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -470,6 +470,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Core\\Command\\Config\\System\\DeleteConfig' => __DIR__ . '/../../..' . '/core/Command/Config/System/DeleteConfig.php', 'OC\\Core\\Command\\Config\\System\\GetConfig' => __DIR__ . '/../../..' . '/core/Command/Config/System/GetConfig.php', 'OC\\Core\\Command\\Config\\System\\SetConfig' => __DIR__ . '/../../..' . '/core/Command/Config/System/SetConfig.php', + 'OC\\Core\\Command\\Db\\ConvertFilecacheBigInt' => __DIR__ . '/../../..' . '/core/Command/Db/ConvertFilecacheBigInt.php', 'OC\\Core\\Command\\Db\\ConvertMysqlToMB4' => __DIR__ . '/../../..' . '/core/Command/Db/ConvertMysqlToMB4.php', 'OC\\Core\\Command\\Db\\ConvertType' => __DIR__ . '/../../..' . '/core/Command/Db/ConvertType.php', 'OC\\Core\\Command\\Db\\Migrations\\ExecuteCommand' => __DIR__ . '/../../..' . '/core/Command/Db/Migrations/ExecuteCommand.php',