aboutsummaryrefslogtreecommitdiffstats
path: root/apps/settings/lib/SetupChecks/DatabasePendingBigIntConversions.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/settings/lib/SetupChecks/DatabasePendingBigIntConversions.php')
-rw-r--r--apps/settings/lib/SetupChecks/DatabasePendingBigIntConversions.php82
1 files changed, 82 insertions, 0 deletions
diff --git a/apps/settings/lib/SetupChecks/DatabasePendingBigIntConversions.php b/apps/settings/lib/SetupChecks/DatabasePendingBigIntConversions.php
new file mode 100644
index 00000000000..bb9794c1e03
--- /dev/null
+++ b/apps/settings/lib/SetupChecks/DatabasePendingBigIntConversions.php
@@ -0,0 +1,82 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\Settings\SetupChecks;
+
+use Doctrine\DBAL\Types\BigIntType;
+use OC\Core\Command\Db\ConvertFilecacheBigInt;
+use OC\DB\Connection;
+use OC\DB\SchemaWrapper;
+use OCP\EventDispatcher\IEventDispatcher;
+use OCP\IDBConnection;
+use OCP\IL10N;
+use OCP\IURLGenerator;
+use OCP\SetupCheck\ISetupCheck;
+use OCP\SetupCheck\SetupResult;
+
+class DatabasePendingBigIntConversions implements ISetupCheck {
+ public function __construct(
+ private IL10N $l10n,
+ private IURLGenerator $urlGenerator,
+ private Connection $db,
+ private IEventDispatcher $dispatcher,
+ private IDBConnection $connection,
+ ) {
+ }
+
+ public function getCategory(): string {
+ return 'database';
+ }
+
+ public function getName(): string {
+ return $this->l10n->t('Database pending bigint migrations');
+ }
+
+ protected function getBigIntConversionPendingColumns(): array {
+ $tables = ConvertFilecacheBigInt::getColumnsByTable();
+
+ $schema = new SchemaWrapper($this->db);
+ $isSqlite = $this->connection->getDatabaseProvider() === IDBConnection::PLATFORM_SQLITE;
+ $pendingColumns = [];
+
+ foreach ($tables as $tableName => $columns) {
+ if (!$schema->hasTable($tableName)) {
+ continue;
+ }
+
+ $table = $schema->getTable($tableName);
+ foreach ($columns as $columnName) {
+ $column = $table->getColumn($columnName);
+ $isAutoIncrement = $column->getAutoincrement();
+ $isAutoIncrementOnSqlite = $isSqlite && $isAutoIncrement;
+ if (!($column->getType() instanceof BigIntType) && !$isAutoIncrementOnSqlite) {
+ $pendingColumns[] = $tableName . '.' . $columnName;
+ }
+ }
+ }
+
+ return $pendingColumns;
+ }
+
+ public function run(): SetupResult {
+ $pendingColumns = $this->getBigIntConversionPendingColumns();
+ if (empty($pendingColumns)) {
+ return SetupResult::success('None');
+ } else {
+ $list = '';
+ foreach ($pendingColumns as $pendingColumn) {
+ $list .= "\n$pendingColumn";
+ }
+ $list .= "\n";
+ return SetupResult::info(
+ $this->l10n->t('Some columns in the database are missing a conversion to big int. Due to the fact that changing column types on big tables could take some time they were not changed automatically. By running "occ db:convert-filecache-bigint" those pending changes could be applied manually. This operation needs to be made while the instance is offline.') . $list,
+ $this->urlGenerator->linkToDocs('admin-bigint-conversion')
+ );
+ }
+ }
+}