]> source.dussan.org Git - nextcloud-server.git/commitdiff
Create primary keys on all tables and add a command to create the afterwards
authorJoas Schilling <coding@schilljs.com>
Tue, 10 Nov 2020 08:34:57 +0000 (09:34 +0100)
committerJoas Schilling <coding@schilljs.com>
Thu, 12 Nov 2020 11:57:52 +0000 (12:57 +0100)
Signed-off-by: Joas Schilling <coding@schilljs.com>
16 files changed:
apps/federatedfilesharing/lib/Migration/Version1010Date20200630191755.php
apps/settings/lib/Controller/CheckSetupController.php
apps/settings/tests/Controller/CheckSetupControllerTest.php
core/Application.php
core/Command/Db/AddMissingPrimaryKeys.php [new file with mode: 0644]
core/Migrations/Version13000Date20170718121200.php
core/Migrations/Version16000Date20190207141427.php
core/Migrations/Version17000Date20190514105811.php
core/Migrations/Version18000Date20191204114856.php
core/js/setupchecks.js
core/js/tests/specs/setupchecksSpec.js
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/private/DB/MissingPrimaryKeyInformation.php [new file with mode: 0644]
lib/public/IDBConnection.php
version.php

index 53348d8f86d632ee1d72c109fa45d80d15894085..bf0d0f8eecdfea17e51c10589a5afa5a7d44ff5c 100644 (file)
@@ -52,7 +52,8 @@ class Version1010Date20200630191755 extends SimpleMigrationStep {
                                'notnull' => true,
                                'length' => 4,
                        ]);
-                       $table->addUniqueIndex(['share_id'], 'share_id_index');
+                       $table->setPrimaryKey(['share_id'], 'federated_res_pk');
+//                     $table->addUniqueIndex(['share_id'], 'share_id_index');
                }
                return $schema;
        }
index 0c3d17d31eb71a4ceaba85831c1342951007b2ec..db8df5eb3e5fe9c7248a21ffb3c91ad1f51aa624 100644 (file)
@@ -49,6 +49,7 @@ use OC\AppFramework\Http;
 use OC\DB\Connection;
 use OC\DB\MissingColumnInformation;
 use OC\DB\MissingIndexInformation;
+use OC\DB\MissingPrimaryKeyInformation;
 use OC\DB\SchemaWrapper;
 use OC\IntegrityCheck\Checker;
 use OC\Lock\NoopLockingProvider;
@@ -451,6 +452,15 @@ Raw output
                return $indexInfo->getListOfMissingIndexes();
        }
 
+       protected function hasMissingPrimaryKeys(): array {
+               $info = new MissingPrimaryKeyInformation();
+               // Dispatch event so apps can also hint for pending index updates if needed
+               $event = new GenericEvent($info);
+               $this->dispatcher->dispatch(IDBConnection::CHECK_MISSING_PRIMARY_KEYS_EVENT, $event);
+
+               return $info->getListOfMissingPrimaryKeys();
+       }
+
        protected function hasMissingColumns(): array {
                $indexInfo = new MissingColumnInformation();
                // Dispatch event so apps can also hint for pending index updates if needed
@@ -719,6 +729,7 @@ Raw output
                                'phpOpcacheDocumentation' => $this->urlGenerator->linkToDocs('admin-php-opcache'),
                                'isSettimelimitAvailable' => $this->isSettimelimitAvailable(),
                                'hasFreeTypeSupport' => $this->hasFreeTypeSupport(),
+                               'missingPrimaryKeys' => $this->hasMissingPrimaryKeys(),
                                'missingIndexes' => $this->hasMissingIndexes(),
                                'missingColumns' => $this->hasMissingColumns(),
                                'isSqliteUsed' => $this->isSqliteUsed(),
index 819c8edcca91876f09e12d10f775aa142b6dd232..36552a894bad961a2db773157bbeafec21246bd6 100644 (file)
@@ -165,6 +165,7 @@ class CheckSetupControllerTest extends TestCase {
                                'isOpcacheProperlySetup',
                                'hasFreeTypeSupport',
                                'hasMissingIndexes',
+                               'hasMissingPrimaryKeys',
                                'isSqliteUsed',
                                'isPHPMailerUsed',
                                'hasOpcacheLoaded',
@@ -444,6 +445,9 @@ class CheckSetupControllerTest extends TestCase {
                $this->checkSetupController
                        ->method('hasMissingIndexes')
                        ->willReturn([]);
+               $this->checkSetupController
+                       ->method('hasMissingPrimaryKeys')
+                       ->willReturn([]);
                $this->checkSetupController
                        ->method('isSqliteUsed')
                        ->willReturn(false);
@@ -587,6 +591,7 @@ class CheckSetupControllerTest extends TestCase {
                                'isSqliteUsed' => false,
                                'databaseConversionDocumentation' => 'http://docs.example.org/server/go.php?to=admin-db-conversion',
                                'missingIndexes' => [],
+                               'missingPrimaryKeys' => [],
                                'missingColumns' => [],
                                'isPHPMailerUsed' => false,
                                'mailSettingsDocumentation' => 'https://server/index.php/settings/admin',
index 9f0fa4092a2a8e732c75998b4940592f9b518245..f105dfd25d11bd64657b3e39007e8a2d7b5fe997 100644 (file)
@@ -42,6 +42,7 @@ use OC\Authentication\Notifications\Notifier as AuthenticationNotifier;
 use OC\Core\Notification\RemoveLinkSharesNotifier;
 use OC\DB\MissingColumnInformation;
 use OC\DB\MissingIndexInformation;
+use OC\DB\MissingPrimaryKeyInformation;
 use OC\DB\SchemaWrapper;
 use OCP\AppFramework\App;
 use OCP\EventDispatcher\IEventDispatcher;
@@ -177,6 +178,63 @@ class Application extends App {
                        }
                );
 
+               $oldEventDispatcher->addListener(IDBConnection::CHECK_MISSING_PRIMARY_KEYS_EVENT,
+                       function (GenericEvent $event) use ($container) {
+                               /** @var MissingPrimaryKeyInformation $subject */
+                               $subject = $event->getSubject();
+
+                               $schema = new SchemaWrapper($container->query(IDBConnection::class));
+
+                               if ($schema->hasTable('federated_reshares')) {
+                                       $table = $schema->getTable('federated_reshares');
+
+                                       if (!$table->hasPrimaryKey()) {
+                                               $subject->addHintForMissingSubject($table->getName());
+                                       }
+                               }
+
+                               if ($schema->hasTable('systemtag_object_mapping')) {
+                                       $table = $schema->getTable('systemtag_object_mapping');
+
+                                       if (!$table->hasPrimaryKey()) {
+                                               $subject->addHintForMissingSubject($table->getName());
+                                       }
+                               }
+
+                               if ($schema->hasTable('comments_read_markers')) {
+                                       $table = $schema->getTable('comments_read_markers');
+
+                                       if (!$table->hasPrimaryKey()) {
+                                               $subject->addHintForMissingSubject($table->getName());
+                                       }
+                               }
+
+                               if ($schema->hasTable('collres_resources')) {
+                                       $table = $schema->getTable('collres_resources');
+
+                                       if (!$table->hasPrimaryKey()) {
+                                               $subject->addHintForMissingSubject($table->getName());
+                                       }
+                               }
+
+                               if ($schema->hasTable('collres_accesscache')) {
+                                       $table = $schema->getTable('collres_accesscache');
+
+                                       if (!$table->hasPrimaryKey()) {
+                                               $subject->addHintForMissingSubject($table->getName());
+                                       }
+                               }
+
+                               if ($schema->hasTable('filecache_extended')) {
+                                       $table = $schema->getTable('filecache_extended');
+
+                                       if (!$table->hasPrimaryKey()) {
+                                               $subject->addHintForMissingSubject($table->getName());
+                                       }
+                               }
+                       }
+               );
+
                $oldEventDispatcher->addListener(IDBConnection::CHECK_MISSING_COLUMNS_EVENT,
                        function (GenericEvent $event) use ($container) {
                                /** @var MissingColumnInformation $subject */
diff --git a/core/Command/Db/AddMissingPrimaryKeys.php b/core/Command/Db/AddMissingPrimaryKeys.php
new file mode 100644 (file)
index 0000000..a51249b
--- /dev/null
@@ -0,0 +1,181 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2017 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @author Bjoern Schiessle <bjoern@schiessle.org>
+ * @author Joas Schilling <coding@schilljs.com>
+ * @author Mario Danic <mario@lovelyhq.com>
+ * @author Morris Jobke <hey@morrisjobke.de>
+ * @author Robin Appelman <robin@icewind.nl>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ * @author Thomas Citharel <nextcloud@tcit.fr>
+ *
+ * @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 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\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\EventDispatcher\GenericEvent;
+
+/**
+ * Class AddMissingPrimaryKeys
+ *
+ * if you added primary keys to the database, this is the right place to add
+ * your update routine for existing instances
+ *
+ * @package OC\Core\Command\Db
+ */
+class AddMissingPrimaryKeys extends Command {
+
+       /** @var IDBConnection */
+       private $connection;
+
+       /** @var EventDispatcherInterface */
+       private $dispatcher;
+
+       public function __construct(IDBConnection $connection, EventDispatcherInterface $dispatcher) {
+               parent::__construct();
+
+               $this->connection = $connection;
+               $this->dispatcher = $dispatcher;
+       }
+
+       protected function configure() {
+               $this
+                       ->setName('db:add-missing-primary-keys')
+                       ->setDescription('Add missing primary keys to the database tables');
+       }
+
+       protected function execute(InputInterface $input, OutputInterface $output): int {
+               $this->addCorePrimaryKeys($output);
+
+               // Dispatch event so apps can also update indexes if needed
+               $event = new GenericEvent($output);
+               $this->dispatcher->dispatch(IDBConnection::ADD_MISSING_PRIMARY_KEYS_EVENT, $event);
+               return 0;
+       }
+
+       /**
+        * add missing indices to the share table
+        *
+        * @param OutputInterface $output
+        * @throws \Doctrine\DBAL\Schema\SchemaException
+        */
+       private function addCorePrimaryKeys(OutputInterface $output) {
+               $output->writeln('<info>Check primary keys.</info>');
+
+               $schema = new SchemaWrapper($this->connection);
+               $updated = false;
+
+               if ($schema->hasTable('federated_reshares')) {
+                       $table = $schema->getTable('federated_reshares');
+                       if (!$table->hasPrimaryKey()) {
+                               $output->writeln('<info>Adding primary key to the federated_reshares table, this can take some time...</info>');
+                               $table->setPrimaryKey(['share_id'], 'federated_res_pk');
+                               if ($table->hasIndex('share_id_index')) {
+                                       $table->dropIndex('share_id_index');
+                               }
+                               $this->connection->migrateToSchema($schema->getWrappedSchema());
+                               $updated = true;
+                               $output->writeln('<info>federated_reshares table updated successfully.</info>');
+                       }
+               }
+
+               if ($schema->hasTable('systemtag_object_mapping')) {
+                       $table = $schema->getTable('systemtag_object_mapping');
+                       if (!$table->hasPrimaryKey()) {
+                               $output->writeln('<info>Adding primary key to the systemtag_object_mapping table, this can take some time...</info>');
+                               $table->setPrimaryKey(['objecttype', 'objectid', 'systemtagid'], 'som_pk');
+                               if ($table->hasIndex('mapping')) {
+                                       $table->dropIndex('mapping');
+                               }
+                               $this->connection->migrateToSchema($schema->getWrappedSchema());
+                               $updated = true;
+                               $output->writeln('<info>systemtag_object_mapping table updated successfully.</info>');
+                       }
+               }
+
+               if ($schema->hasTable('comments_read_markers')) {
+                       $table = $schema->getTable('comments_read_markers');
+                       if (!$table->hasPrimaryKey()) {
+                               $output->writeln('<info>Adding primary key to the comments_read_markers table, this can take some time...</info>');
+                               $table->setPrimaryKey(['user_id', 'object_type', 'object_id'], 'crm_pk');
+                               if ($table->hasIndex('comments_marker_index')) {
+                                       $table->dropIndex('comments_marker_index');
+                               }
+                               $this->connection->migrateToSchema($schema->getWrappedSchema());
+                               $updated = true;
+                               $output->writeln('<info>comments_read_markers table updated successfully.</info>');
+                       }
+               }
+
+               if ($schema->hasTable('collres_resources')) {
+                       $table = $schema->getTable('collres_resources');
+                       if (!$table->hasPrimaryKey()) {
+                               $output->writeln('<info>Adding primary key to the collres_resources table, this can take some time...</info>');
+                               $table->setPrimaryKey(['collection_id', 'resource_type', 'resource_id'], 'crr_pk');
+                               if ($table->hasIndex('collres_unique_res')) {
+                                       $table->dropIndex('collres_unique_res');
+                               }
+                               $this->connection->migrateToSchema($schema->getWrappedSchema());
+                               $updated = true;
+                               $output->writeln('<info>collres_resources table updated successfully.</info>');
+                       }
+               }
+
+               if ($schema->hasTable('collres_accesscache')) {
+                       $table = $schema->getTable('collres_accesscache');
+                       if (!$table->hasPrimaryKey()) {
+                               $output->writeln('<info>Adding primary key to the collres_accesscache table, this can take some time...</info>');
+                               $table->setPrimaryKey(['user_id', 'collection_id', 'resource_type', 'resource_id'], 'cra_pk');
+                               if ($table->hasIndex('collres_unique_user')) {
+                                       $table->dropIndex('collres_unique_user');
+                               }
+                               $this->connection->migrateToSchema($schema->getWrappedSchema());
+                               $updated = true;
+                               $output->writeln('<info>collres_accesscache table updated successfully.</info>');
+                       }
+               }
+
+               if ($schema->hasTable('filecache_extended')) {
+                       $table = $schema->getTable('filecache_extended');
+                       if (!$table->hasPrimaryKey()) {
+                               $output->writeln('<info>Adding primary key to the filecache_extended table, this can take some time...</info>');
+                               $table->setPrimaryKey(['fileid'], 'fce_pk');
+                               if ($table->hasIndex('fce_fileid_idx')) {
+                                       $table->dropIndex('fce_fileid_idx');
+                               }
+                               $this->connection->migrateToSchema($schema->getWrappedSchema());
+                               $updated = true;
+                               $output->writeln('<info>filecache_extended table updated successfully.</info>');
+                       }
+               }
+
+               if (!$updated) {
+                       $output->writeln('<info>Done.</info>');
+               }
+       }
+}
index ae4b34ec9fb59e89a011cfe608a033462319cb30..6b252d8b830884e3a80a6ddcce518d3764db8091 100644 (file)
@@ -672,7 +672,8 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
                                'default' => 0,
                                'unsigned' => true,
                        ]);
-                       $table->addUniqueIndex(['objecttype', 'objectid', 'systemtagid'], 'mapping');
+                       $table->setPrimaryKey(['objecttype', 'objectid', 'systemtagid'], 'som_pk');
+//                     $table->addUniqueIndex(['objecttype', 'objectid', 'systemtagid'], 'mapping');
                }
 
                if (!$schema->hasTable('systemtag_group')) {
@@ -807,7 +808,8 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
                                'default' => '',
                        ]);
                        $table->addIndex(['object_type', 'object_id'], 'comments_marker_object_index');
-                       $table->addUniqueIndex(['user_id', 'object_type', 'object_id'], 'comments_marker_index');
+                       $table->setPrimaryKey(['user_id', 'object_type', 'object_id'], 'crm_pk');
+//                     $table->addUniqueIndex(['user_id', 'object_type', 'object_id'], 'comments_marker_index');
                }
 
 //             if (!$schema->hasTable('credentials')) {
index 63c6c871eae4884d03b049a05119cd985c717218..77a41dc3c4f9028be6ad9dc1cf4051b5c5a85da9 100644 (file)
@@ -77,7 +77,8 @@ class Version16000Date20190207141427 extends SimpleMigrationStep {
                                'length' => 64,
                        ]);
 
-                       $table->addUniqueIndex(['collection_id', 'resource_type', 'resource_id'], 'collres_unique_res');
+                       $table->setPrimaryKey(['collection_id', 'resource_type', 'resource_id'], 'crr_pk');
+//                     $table->addUniqueIndex(['collection_id', 'resource_type', 'resource_id'], 'collres_unique_res');
                }
 
                if (!$schema->hasTable('collres_accesscache')) {
@@ -106,7 +107,8 @@ class Version16000Date20190207141427 extends SimpleMigrationStep {
                                'default' => 0,
                        ]);
 
-                       $table->addUniqueIndex(['user_id', 'collection_id', 'resource_type', 'resource_id'], 'collres_unique_user');
+                       $table->setPrimaryKey(['user_id', 'collection_id', 'resource_type', 'resource_id'], 'cra_pk');
+//                     $table->addUniqueIndex(['user_id', 'collection_id', 'resource_type', 'resource_id'], 'collres_unique_user');
                        $table->addIndex(['user_id', 'resource_type', 'resource_id'], 'collres_user_res');
                        $table->addIndex(['user_id', 'collection_id'], 'collres_user_coll');
                }
index 910d82160709b23031d1a81ab69519501d82ec21..bd6ab1bc8a5bd7154da60ff9a3ca6aa2301d4048 100644 (file)
@@ -67,7 +67,8 @@ class Version17000Date20190514105811 extends SimpleMigrationStep {
                                'length' => 20,
                                'default' => 0,
                        ]);
-                       $table->addUniqueIndex(['fileid'], 'fce_fileid_idx');
+                       $table->setPrimaryKey(['fileid'], 'fce_pk');
+//                     $table->addUniqueIndex(['fileid'], 'fce_fileid_idx');
                        $table->addIndex(['creation_time'], 'fce_ctime_idx');
                        $table->addIndex(['upload_time'], 'fce_utime_idx');
                }
index e9bf1221dbf7f5e17d5c7d8a77d0f02b1c29d139..0e5f3cbe2723f5815b7e44aecaabee236d9c6411 100644 (file)
@@ -58,7 +58,6 @@ class Version18000Date20191204114856 extends SimpleMigrationStep {
                        'length' => 4000,
                ]);
 
-
                return $schema;
        }
 }
index 4773a201535a9e094a0e6ed1b667f230d8fa2c6e..1541729eb8c6b4438596824dba064c95512eabf2 100644 (file)
                                                        type: OC.SetupChecks.MESSAGE_TYPE_INFO
                                                })
                                        }
+                                       if (data.missingPrimaryKeys.length > 0) {
+                                               var listOfMissingPrimaryKeys = "";
+                                               data.missingPrimaryKeys.forEach(function(element){
+                                                       listOfMissingPrimaryKeys += "<li>";
+                                                       listOfMissingPrimaryKeys += t('core', 'Missing primary key on table "{tableName}".', element);
+                                                       listOfMissingPrimaryKeys += "</li>";
+                                               });
+                                               messages.push({
+                                                       msg: t(
+                                                               'core',
+                                                               'The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running "occ db:add-missing-primary-keys" those missing primary keys could be added manually while the instance keeps running.'
+                                                       ) + "<ul>" + listOfMissingPrimaryKeys + "</ul>",
+                                                       type: OC.SetupChecks.MESSAGE_TYPE_INFO
+                                               })
+                                       }
                                        if (data.missingColumns.length > 0) {
                                                var listOfMissingColumns = "";
                                                data.missingColumns.forEach(function(element){
index f4c81c6bf78ed6a9945e95e4892d4d48b50a1c80..3b54a3ff66a46f3f0d22933c32b2e9bbc8ee646f 100644 (file)
@@ -240,6 +240,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -294,6 +295,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -349,6 +351,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -402,6 +405,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -453,6 +457,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -504,6 +509,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -557,6 +563,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -608,6 +615,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: false,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -659,6 +667,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -731,6 +740,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -783,6 +793,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -835,6 +846,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -887,6 +899,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: false,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -938,6 +951,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -989,6 +1003,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -1041,6 +1056,7 @@ describe('OC.SetupChecks tests', function() {
                                        isSettimelimitAvailable: true,
                                        hasFreeTypeSupport: true,
                                        missingIndexes: [],
+                                       missingPrimaryKeys: [],
                                        missingColumns: [],
                                        cronErrors: [],
                                        cronInfo: {
index c214e42c61ad524e81ed50895d6c59ddb28ddb13..55994589b36011b66a2337a66a5f70dfb096417d 100644 (file)
@@ -796,6 +796,7 @@ return array(
     'OC\\Core\\Command\\Config\\System\\SetConfig' => $baseDir . '/core/Command/Config/System/SetConfig.php',
     'OC\\Core\\Command\\Db\\AddMissingColumns' => $baseDir . '/core/Command/Db/AddMissingColumns.php',
     'OC\\Core\\Command\\Db\\AddMissingIndices' => $baseDir . '/core/Command/Db/AddMissingIndices.php',
+    'OC\\Core\\Command\\Db\\AddMissingPrimaryKeys' => $baseDir . '/core/Command/Db/AddMissingPrimaryKeys.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',
@@ -939,6 +940,7 @@ return array(
     'OC\\DB\\Migrator' => $baseDir . '/lib/private/DB/Migrator.php',
     'OC\\DB\\MissingColumnInformation' => $baseDir . '/lib/private/DB/MissingColumnInformation.php',
     'OC\\DB\\MissingIndexInformation' => $baseDir . '/lib/private/DB/MissingIndexInformation.php',
+    'OC\\DB\\MissingPrimaryKeyInformation' => $baseDir . '/lib/private/DB/MissingPrimaryKeyInformation.php',
     'OC\\DB\\MySQLMigrator' => $baseDir . '/lib/private/DB/MySQLMigrator.php',
     'OC\\DB\\MySqlTools' => $baseDir . '/lib/private/DB/MySqlTools.php',
     'OC\\DB\\OCSqlitePlatform' => $baseDir . '/lib/private/DB/OCSqlitePlatform.php',
index 328c580e88f8bce4b81332ffd194dfbd525a1b76..8bf9bc42b34f8ab52b968e78c933a0518a5c9f0e 100644 (file)
@@ -825,6 +825,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
         'OC\\Core\\Command\\Config\\System\\SetConfig' => __DIR__ . '/../../..' . '/core/Command/Config/System/SetConfig.php',
         'OC\\Core\\Command\\Db\\AddMissingColumns' => __DIR__ . '/../../..' . '/core/Command/Db/AddMissingColumns.php',
         'OC\\Core\\Command\\Db\\AddMissingIndices' => __DIR__ . '/../../..' . '/core/Command/Db/AddMissingIndices.php',
+        'OC\\Core\\Command\\Db\\AddMissingPrimaryKeys' => __DIR__ . '/../../..' . '/core/Command/Db/AddMissingPrimaryKeys.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',
@@ -968,6 +969,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
         'OC\\DB\\Migrator' => __DIR__ . '/../../..' . '/lib/private/DB/Migrator.php',
         'OC\\DB\\MissingColumnInformation' => __DIR__ . '/../../..' . '/lib/private/DB/MissingColumnInformation.php',
         'OC\\DB\\MissingIndexInformation' => __DIR__ . '/../../..' . '/lib/private/DB/MissingIndexInformation.php',
+        'OC\\DB\\MissingPrimaryKeyInformation' => __DIR__ . '/../../..' . '/lib/private/DB/MissingPrimaryKeyInformation.php',
         'OC\\DB\\MySQLMigrator' => __DIR__ . '/../../..' . '/lib/private/DB/MySQLMigrator.php',
         'OC\\DB\\MySqlTools' => __DIR__ . '/../../..' . '/lib/private/DB/MySqlTools.php',
         'OC\\DB\\OCSqlitePlatform' => __DIR__ . '/../../..' . '/lib/private/DB/OCSqlitePlatform.php',
diff --git a/lib/private/DB/MissingPrimaryKeyInformation.php b/lib/private/DB/MissingPrimaryKeyInformation.php
new file mode 100644 (file)
index 0000000..c6b81dd
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2018 Morris Jobke <hey@morrisjobke.de>
+ *
+ * @author Morris Jobke <hey@morrisjobke.de>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @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\DB;
+
+class MissingPrimaryKeyInformation {
+       private $listOfMissingPrimaryKeys = [];
+
+       public function addHintForMissingSubject(string $tableName) {
+               $this->listOfMissingPrimaryKeys[] = [
+                       'tableName' => $tableName,
+               ];
+       }
+
+       public function getListOfMissingPrimaryKeys(): array {
+               return $this->listOfMissingPrimaryKeys;
+       }
+}
index 4605a051e8a1c315137a0100fb64320d1d8d1fbb..07f22d39fa88c94bf822b27ab0b96780ec0160d5 100644 (file)
@@ -50,6 +50,8 @@ use OCP\DB\QueryBuilder\IQueryBuilder;
 interface IDBConnection {
        public const ADD_MISSING_INDEXES_EVENT = self::class . '::ADD_MISSING_INDEXES';
        public const CHECK_MISSING_INDEXES_EVENT = self::class . '::CHECK_MISSING_INDEXES';
+       public const ADD_MISSING_PRIMARY_KEYS_EVENT = self::class . '::ADD_MISSING_PRIMARY_KEYS';
+       public const CHECK_MISSING_PRIMARY_KEYS_EVENT = self::class . '::CHECK_MISSING_PRIMARY_KEYS';
        public const ADD_MISSING_COLUMNS_EVENT = self::class . '::ADD_MISSING_COLUMNS';
        public const CHECK_MISSING_COLUMNS_EVENT = self::class . '::CHECK_MISSING_COLUMNS';
 
index 60bb166006f2fda9fb5b630197cc6f090945374e..a1e99bbbd752e7bab8a521fa8b64df4ca1ac80ca 100644 (file)
@@ -29,7 +29,7 @@
 // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel
 // when updating major/minor version number.
 
-$OC_Version = [20, 0, 1, 5];
+$OC_Version = [20, 0, 1, 6];
 
 // The human readable string
 $OC_VersionString = '20.0.1';