]> source.dussan.org Git - nextcloud-server.git/commitdiff
Migrate missing index database check to new API
authorCôme Chilliet <come.chilliet@nextcloud.com>
Tue, 14 Nov 2023 14:51:26 +0000 (15:51 +0100)
committerCôme Chilliet <91878298+come-nc@users.noreply.github.com>
Mon, 27 Nov 2023 14:23:52 +0000 (15:23 +0100)
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
apps/settings/composer/composer/autoload_classmap.php
apps/settings/composer/composer/autoload_static.php
apps/settings/lib/AppInfo/Application.php
apps/settings/lib/Controller/CheckSetupController.php
apps/settings/lib/SetupChecks/DatabaseHasMissingIndices.php [new file with mode: 0644]
apps/settings/tests/Controller/CheckSetupControllerTest.php
core/js/setupchecks.js
core/js/tests/specs/setupchecksSpec.js
lib/private/DB/MissingIndexInformation.php

index c3ce86504438fbecb6e48cde70ffe30df257595e..7c1c1534a747839507ebf89f7a462ee6bed990ca 100644 (file)
@@ -76,6 +76,7 @@ return array(
     'OCA\\Settings\\SetupChecks\\BruteForceThrottler' => $baseDir . '/../lib/SetupChecks/BruteForceThrottler.php',
     'OCA\\Settings\\SetupChecks\\CheckUserCertificates' => $baseDir . '/../lib/SetupChecks/CheckUserCertificates.php',
     'OCA\\Settings\\SetupChecks\\DatabaseHasMissingColumns' => $baseDir . '/../lib/SetupChecks/DatabaseHasMissingColumns.php',
+    'OCA\\Settings\\SetupChecks\\DatabaseHasMissingIndices' => $baseDir . '/../lib/SetupChecks/DatabaseHasMissingIndices.php',
     'OCA\\Settings\\SetupChecks\\DefaultPhoneRegionSet' => $baseDir . '/../lib/SetupChecks/DefaultPhoneRegionSet.php',
     'OCA\\Settings\\SetupChecks\\EmailTestSuccessful' => $baseDir . '/../lib/SetupChecks/EmailTestSuccessful.php',
     'OCA\\Settings\\SetupChecks\\FileLocking' => $baseDir . '/../lib/SetupChecks/FileLocking.php',
index fe123d74d8197f4aba99362ee14369bf24dfd780..010b19f7243b54dcb7c9568da3885c7e75fd767d 100644 (file)
@@ -91,6 +91,7 @@ class ComposerStaticInitSettings
         'OCA\\Settings\\SetupChecks\\BruteForceThrottler' => __DIR__ . '/..' . '/../lib/SetupChecks/BruteForceThrottler.php',
         'OCA\\Settings\\SetupChecks\\CheckUserCertificates' => __DIR__ . '/..' . '/../lib/SetupChecks/CheckUserCertificates.php',
         'OCA\\Settings\\SetupChecks\\DatabaseHasMissingColumns' => __DIR__ . '/..' . '/../lib/SetupChecks/DatabaseHasMissingColumns.php',
+        'OCA\\Settings\\SetupChecks\\DatabaseHasMissingIndices' => __DIR__ . '/..' . '/../lib/SetupChecks/DatabaseHasMissingIndices.php',
         'OCA\\Settings\\SetupChecks\\DefaultPhoneRegionSet' => __DIR__ . '/..' . '/../lib/SetupChecks/DefaultPhoneRegionSet.php',
         'OCA\\Settings\\SetupChecks\\EmailTestSuccessful' => __DIR__ . '/..' . '/../lib/SetupChecks/EmailTestSuccessful.php',
         'OCA\\Settings\\SetupChecks\\FileLocking' => __DIR__ . '/..' . '/../lib/SetupChecks/FileLocking.php',
index d73961968f8bf22ad19c304dc73d6df6fe243b39..65ef8ac74a4c03c7634f3d965999868a630b46e8 100644 (file)
@@ -51,6 +51,7 @@ use OCA\Settings\Search\UserSearch;
 use OCA\Settings\SetupChecks\BruteForceThrottler;
 use OCA\Settings\SetupChecks\CheckUserCertificates;
 use OCA\Settings\SetupChecks\DatabaseHasMissingColumns;
+use OCA\Settings\SetupChecks\DatabaseHasMissingIndices;
 use OCA\Settings\SetupChecks\DefaultPhoneRegionSet;
 use OCA\Settings\SetupChecks\EmailTestSuccessful;
 use OCA\Settings\SetupChecks\FileLocking;
@@ -162,6 +163,7 @@ class Application extends App implements IBootstrap {
                $context->registerSetupCheck(BruteForceThrottler::class);
                $context->registerSetupCheck(CheckUserCertificates::class);
                $context->registerSetupCheck(DatabaseHasMissingColumns::class);
+               $context->registerSetupCheck(DatabaseHasMissingIndices::class);
                $context->registerSetupCheck(DefaultPhoneRegionSet::class);
                $context->registerSetupCheck(EmailTestSuccessful::class);
                $context->registerSetupCheck(FileLocking::class);
index 1fa6a658878aa157071e38be8971c03e63dde2fc..27ee0df49716fbb39dd5a7bd402e37e4bb9ac7d0 100644 (file)
@@ -51,7 +51,6 @@ use GuzzleHttp\Exception\ClientException;
 use OC;
 use OC\AppFramework\Http;
 use OC\DB\Connection;
-use OC\DB\MissingIndexInformation;
 use OC\DB\MissingPrimaryKeyInformation;
 use OC\DB\SchemaWrapper;
 use OC\IntegrityCheck\Checker;
@@ -61,7 +60,6 @@ use OCP\AppFramework\Http\Attribute\IgnoreOpenAPI;
 use OCP\AppFramework\Http\DataDisplayResponse;
 use OCP\AppFramework\Http\DataResponse;
 use OCP\AppFramework\Http\RedirectResponse;
-use OCP\DB\Events\AddMissingIndicesEvent;
 use OCP\DB\Events\AddMissingPrimaryKeyEvent;
 use OCP\DB\Types;
 use OCP\EventDispatcher\IEventDispatcher;
@@ -417,29 +415,6 @@ Raw output
                return $recommendations;
        }
 
-       protected function hasMissingIndexes(): array {
-               $indexInfo = new MissingIndexInformation();
-
-               // Dispatch event so apps can also hint for pending index updates if needed
-               $event = new AddMissingIndicesEvent();
-               $this->dispatcher->dispatchTyped($event);
-               $missingIndices = $event->getMissingIndices();
-
-               if ($missingIndices !== []) {
-                       $schema = new SchemaWrapper(\OCP\Server::get(Connection::class));
-                       foreach ($missingIndices as $missingIndex) {
-                               if ($schema->hasTable($missingIndex['tableName'])) {
-                                       $table = $schema->getTable($missingIndex['tableName']);
-                                       if (!$table->hasIndex($missingIndex['indexName'])) {
-                                               $indexInfo->addHintForMissingSubject($missingIndex['tableName'], $missingIndex['indexName']);
-                                       }
-                               }
-                       }
-               }
-
-               return $indexInfo->getListOfMissingIndexes();
-       }
-
        protected function hasMissingPrimaryKeys(): array {
                $info = new MissingPrimaryKeyInformation();
                // Dispatch event so apps can also hint for pending key updates if needed
@@ -679,7 +654,6 @@ Raw output
                                'OpcacheSetupRecommendations' => $this->getOpcacheSetupRecommendations(),
                                'isSettimelimitAvailable' => $this->isSettimelimitAvailable(),
                                'missingPrimaryKeys' => $this->hasMissingPrimaryKeys(),
-                               'missingIndexes' => $this->hasMissingIndexes(),
                                'isSqliteUsed' => $this->isSqliteUsed(),
                                'databaseConversionDocumentation' => $this->urlGenerator->linkToDocs('admin-db-conversion'),
                                'appDirsWithDifferentOwner' => $this->getAppDirsWithDifferentOwner(),
diff --git a/apps/settings/lib/SetupChecks/DatabaseHasMissingIndices.php b/apps/settings/lib/SetupChecks/DatabaseHasMissingIndices.php
new file mode 100644 (file)
index 0000000..b19c3ab
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2023 Côme Chilliet <come.chilliet@nextcloud.com>
+ *
+ * @author Côme Chilliet <come.chilliet@nextcloud.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 OCA\Settings\SetupChecks;
+
+use OC\DB\Connection;
+use OC\DB\MissingIndexInformation;
+use OC\DB\SchemaWrapper;
+use OCP\DB\Events\AddMissingIndicesEvent;
+use OCP\EventDispatcher\IEventDispatcher;
+use OCP\IL10N;
+use OCP\SetupCheck\ISetupCheck;
+use OCP\SetupCheck\SetupResult;
+
+class DatabaseHasMissingIndices implements ISetupCheck {
+       public function __construct(
+               private IL10N $l10n,
+               private Connection $connection,
+               private IEventDispatcher $dispatcher,
+       ) {
+       }
+
+       public function getCategory(): string {
+               return 'database';
+       }
+
+       public function getName(): string {
+               return $this->l10n->t('Database missing indices');
+       }
+
+       private function getMissingIndices(): array {
+               $indexInfo = new MissingIndexInformation();
+               // Dispatch event so apps can also hint for pending index updates if needed
+               $event = new AddMissingIndicesEvent();
+               $this->dispatcher->dispatchTyped($event);
+               $missingIndices = $event->getMissingIndices();
+
+               if (!empty($missingIndices)) {
+                       $schema = new SchemaWrapper($this->connection);
+                       foreach ($missingIndices as $missingIndex) {
+                               if ($schema->hasTable($missingIndex['tableName'])) {
+                                       $table = $schema->getTable($missingIndex['tableName']);
+                                       if (!$table->hasIndex($missingIndex['indexName'])) {
+                                               $indexInfo->addHintForMissingIndex($missingIndex['tableName'], $missingIndex['indexName']);
+                                       }
+                               }
+                       }
+               }
+
+               return $indexInfo->getListOfMissingIndices();
+       }
+
+       public function run(): SetupResult {
+               $missingIndices = $this->getMissingIndices();
+               if (empty($missingIndices)) {
+                       return SetupResult::success('None');
+               } else {
+                       $list = '';
+                       foreach ($missingIndices as $missingIndex) {
+                               $list .= "\n".$this->l10n->t('Missing optional index "%s" in table "%s".', [$missingIndex['indexName'], $missingIndex['tableName']]);
+                       }
+                       return SetupResult::info(
+                               $this->l10n->t('The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running "occ db:add-missing-indices" those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster.').$list
+                       );
+               }
+       }
+}
index e5db2d52e3c05f59ee13fb647774bc2b08d2fb0f..a493722a3ce18b7afb0b315f495f87c2d4cefa26 100644 (file)
@@ -178,7 +178,6 @@ class CheckSetupControllerTest extends TestCase {
                                'getCurlVersion',
                                'isPhpOutdated',
                                'getOpcacheSetupRecommendations',
-                               'hasMissingIndexes',
                                'hasMissingPrimaryKeys',
                                'isSqliteUsed',
                                'isPHPMailerUsed',
@@ -229,9 +228,6 @@ class CheckSetupControllerTest extends TestCase {
                        ->expects($this->once())
                        ->method('getOpcacheSetupRecommendations')
                        ->willReturn(['recommendation1', 'recommendation2']);
-               $this->checkSetupController
-                       ->method('hasMissingIndexes')
-                       ->willReturn([]);
                $this->checkSetupController
                        ->method('hasMissingPrimaryKeys')
                        ->willReturn([]);
index 5cd2cadaa2d081a0bb9a03d1f00314abfd8a2d08..f926d1534a56cc9c6c113ce80f45d1918bbc11fa 100644 (file)
                                                        type: OC.SetupChecks.MESSAGE_TYPE_WARNING
                                                });
                                        }
-                                       if (data.missingIndexes.length > 0) {
-                                               var listOfMissingIndexes = "";
-                                               data.missingIndexes.forEach(function(element){
-                                                       listOfMissingIndexes += '<li>';
-                                                       listOfMissingIndexes += t('core', 'Missing index "{indexName}" in table "{tableName}".', element);
-                                                       listOfMissingIndexes += '</li>';
-                                               });
-                                               messages.push({
-                                                       msg: t('core', 'The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running "occ db:add-missing-indices" those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster.') + '<ul>' + listOfMissingIndexes + '</ul>',
-                                                       type: OC.SetupChecks.MESSAGE_TYPE_INFO
-                                               })
-                                       }
                                        if (data.missingPrimaryKeys.length > 0) {
                                                var listOfMissingPrimaryKeys = "";
                                                data.missingPrimaryKeys.forEach(function(element){
index 9cba013bb87d74b6543fbbfafa4481269e845013..d48f92d5dc328dc0e461efeef0552e402f4ba383 100644 (file)
@@ -229,7 +229,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -281,7 +280,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -333,7 +331,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -385,7 +382,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -435,7 +431,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -488,7 +483,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: false,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -539,7 +533,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -621,7 +614,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -678,7 +670,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: ['recommendation1', 'recommendation2'],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -728,7 +719,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -782,7 +772,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -833,7 +822,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -881,7 +869,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -932,7 +919,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -983,7 +969,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -1033,7 +1018,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
@@ -1090,7 +1074,6 @@ describe('OC.SetupChecks tests', function() {
                                        hasPassedCodeIntegrityCheck: true,
                                        OpcacheSetupRecommendations: [],
                                        isSettimelimitAvailable: true,
-                                       missingIndexes: [],
                                        missingPrimaryKeys: [],
                                        cronErrors: [],
                                        cronInfo: {
index 74498668349d8ae911c007dde7de340083902162..4fc3a52d3a4372ff94abc197e230850cd3ff5317 100644 (file)
@@ -27,16 +27,16 @@ declare(strict_types=1);
 namespace OC\DB;
 
 class MissingIndexInformation {
-       private $listOfMissingIndexes = [];
+       private array $listOfMissingIndices = [];
 
-       public function addHintForMissingSubject(string $tableName, string $indexName) {
-               $this->listOfMissingIndexes[] = [
+       public function addHintForMissingIndex(string $tableName, string $indexName): void {
+               $this->listOfMissingIndices[] = [
                        'tableName' => $tableName,
                        'indexName' => $indexName
                ];
        }
 
-       public function getListOfMissingIndexes(): array {
-               return $this->listOfMissingIndexes;
+       public function getListOfMissingIndices(): array {
+               return $this->listOfMissingIndices;
        }
 }