summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2020-03-11 12:29:52 +0100
committerJoas Schilling <coding@schilljs.com>2020-03-31 10:51:15 +0200
commit720dc4e93d83d738861c614745f514cc347ef1f9 (patch)
tree841e5f1c095df5c24f82f134afac9ddad721a044 /core
parent0faed106d7b0b4868ebcd897469d106d76081800 (diff)
downloadnextcloud-server-720dc4e93d83d738861c614745f514cc347ef1f9.tar.gz
nextcloud-server-720dc4e93d83d738861c614745f514cc347ef1f9.zip
Add optional column oc_comments.reference_id
Signed-off-by: Joas Schilling <coding@schilljs.com>
Diffstat (limited to 'core')
-rw-r--r--core/Application.php18
-rw-r--r--core/Command/Db/AddMissingColumns.php105
-rw-r--r--core/Command/Db/AddMissingIndices.php2
-rw-r--r--core/Migrations/Version13000Date20170718121200.php4
-rw-r--r--core/js/setupchecks.js15
-rw-r--r--core/js/tests/specs/setupchecksSpec.js15
-rw-r--r--core/register_command.php1
7 files changed, 159 insertions, 1 deletions
diff --git a/core/Application.php b/core/Application.php
index c2da7f8d194..e4fc33b5402 100644
--- a/core/Application.php
+++ b/core/Application.php
@@ -39,6 +39,7 @@ use OC\Authentication\Listeners\RemoteWipeNotificationsListener;
use OC\Authentication\Listeners\UserDeletedStoreCleanupListener;
use OC\Authentication\Notifications\Notifier as AuthenticationNotifier;
use OC\Core\Notification\RemoveLinkSharesNotifier;
+use OC\DB\MissingColumnInformation;
use OC\DB\MissingIndexInformation;
use OC\DB\SchemaWrapper;
use OCP\AppFramework\App;
@@ -167,6 +168,23 @@ class Application extends App {
}
);
+ $eventDispatcher->addListener(IDBConnection::CHECK_MISSING_COLUMNS_EVENT,
+ function (GenericEvent $event) use ($container) {
+ /** @var MissingColumnInformation $subject */
+ $subject = $event->getSubject();
+
+ $schema = new SchemaWrapper($container->query(IDBConnection::class));
+
+ if ($schema->hasTable('comments')) {
+ $table = $schema->getTable('comments');
+
+ if (!$table->hasColumn('reference_id')) {
+ $subject->addHintForMissingColumn($table->getName(), 'reference_id');
+ }
+ }
+ }
+ );
+
$eventDispatcher->addServiceListener(RemoteWipeStarted::class, RemoteWipeActivityListener::class);
$eventDispatcher->addServiceListener(RemoteWipeStarted::class, RemoteWipeNotificationsListener::class);
$eventDispatcher->addServiceListener(RemoteWipeStarted::class, RemoteWipeEmailListener::class);
diff --git a/core/Command/Db/AddMissingColumns.php b/core/Command/Db/AddMissingColumns.php
new file mode 100644
index 00000000000..4672770c6af
--- /dev/null
+++ b/core/Command/Db/AddMissingColumns.php
@@ -0,0 +1,105 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2020 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 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 AddMissingColumns
+ *
+ * if you added a new lazy column to the database, this is the right place to add
+ * your update routine for existing instances
+ *
+ * @package OC\Core\Command\Db
+ */
+class AddMissingColumns 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-columns')
+ ->setDescription('Add missing optional columns to the database tables');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $this->addCoreColumns($output);
+
+ // Dispatch event so apps can also update columns if needed
+ $event = new GenericEvent($output);
+ $this->dispatcher->dispatch(IDBConnection::ADD_MISSING_COLUMNS_EVENT, $event);
+ }
+
+ /**
+ * add missing indices to the share table
+ *
+ * @param OutputInterface $output
+ * @throws \Doctrine\DBAL\Schema\SchemaException
+ */
+ private function addCoreColumns(OutputInterface $output) {
+
+ $output->writeln('<info>Check columns of the comments table.</info>');
+
+ $schema = new SchemaWrapper($this->connection);
+ $updated = false;
+
+ if ($schema->hasTable('comments')) {
+ $table = $schema->getTable('comments');
+ if (!$table->hasColumn('reference_id')) {
+ $output->writeln('<info>Adding additional reference_id column to the comments table, this can take some time...</info>');
+ $table->addColumn('reference_id', 'string', [
+ 'notnull' => false,
+ 'length' => 64,
+ ]);
+ $this->connection->migrateToSchema($schema->getWrappedSchema());
+ $updated = true;
+ $output->writeln('<info>Comments table updated successfully.</info>');
+ }
+ }
+
+ if (!$updated) {
+ $output->writeln('<info>Done.</info>');
+ }
+ }
+}
diff --git a/core/Command/Db/AddMissingIndices.php b/core/Command/Db/AddMissingIndices.php
index 0152df21737..c4006a2d7fa 100644
--- a/core/Command/Db/AddMissingIndices.php
+++ b/core/Command/Db/AddMissingIndices.php
@@ -43,7 +43,7 @@ use Symfony\Component\EventDispatcher\GenericEvent;
* Class AddMissingIndices
*
* if you added any new indices to the database, this is the right place to add
- * it your update routine for existing instances
+ * your update routine for existing instances
*
* @package OC\Core\Command\Db
*/
diff --git a/core/Migrations/Version13000Date20170718121200.php b/core/Migrations/Version13000Date20170718121200.php
index e9f376a7e42..757697e7e90 100644
--- a/core/Migrations/Version13000Date20170718121200.php
+++ b/core/Migrations/Version13000Date20170718121200.php
@@ -769,6 +769,10 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
'length' => 64,
'default' => '',
]);
+ $table->addColumn('reference_id', 'string', [
+ 'notnull' => false,
+ 'length' => 64,
+ ]);
$table->setPrimaryKey(['id']);
$table->addIndex(['parent_id'], 'comments_parent_id_index');
$table->addIndex(['topmost_parent_id'], 'comments_topmost_parent_id_idx');
diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js
index 12d1104a632..2e94c82486c 100644
--- a/core/js/setupchecks.js
+++ b/core/js/setupchecks.js
@@ -357,6 +357,21 @@
type: OC.SetupChecks.MESSAGE_TYPE_INFO
})
}
+ if (data.missingColumns.length > 0) {
+ var listOfMissingColumns = "";
+ data.missingColumns.forEach(function(element){
+ listOfMissingColumns += "<li>";
+ listOfMissingColumns += t('core', 'Missing optional column "{columnName}" in table "{tableName}".', element);
+ listOfMissingColumns += "</li>";
+ });
+ messages.push({
+ msg: t(
+ 'core',
+ 'The database is missing some optional columns. Due to the fact that adding columns on big tables could take some time they were not added automatically when they can be optional. By running "occ db:add-missing-columns" those missing columns could be added manually while the instance keeps running. Once the columns are added some features might improve responsiveness or usability.'
+ ) + "<ul>" + listOfMissingColumns + "</ul>",
+ type: OC.SetupChecks.MESSAGE_TYPE_INFO
+ })
+ }
if (data.recommendedPHPModules.length > 0) {
var listOfRecommendedPHPModules = "";
data.recommendedPHPModules.forEach(function(element){
diff --git a/core/js/tests/specs/setupchecksSpec.js b/core/js/tests/specs/setupchecksSpec.js
index 5e93cbf7bdf..891b5fc84c8 100644
--- a/core/js/tests/specs/setupchecksSpec.js
+++ b/core/js/tests/specs/setupchecksSpec.js
@@ -240,6 +240,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -293,6 +294,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -347,6 +349,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -399,6 +402,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -449,6 +453,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -499,6 +504,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -551,6 +557,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -601,6 +608,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: false,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -651,6 +659,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -722,6 +731,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -773,6 +783,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -824,6 +835,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -875,6 +887,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: false,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -925,6 +938,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
@@ -1026,6 +1040,7 @@ describe('OC.SetupChecks tests', function() {
isSettimelimitAvailable: true,
hasFreeTypeSupport: true,
missingIndexes: [],
+ missingColumns: [],
cronErrors: [],
cronInfo: {
diffInSeconds: 0
diff --git a/core/register_command.php b/core/register_command.php
index efa3146c492..e355d1429c1 100644
--- a/core/register_command.php
+++ b/core/register_command.php
@@ -99,6 +99,7 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
$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\AddMissingIndices(\OC::$server->getDatabaseConnection(), \OC::$server->getEventDispatcher()));
+ $application->add(new OC\Core\Command\Db\AddMissingColumns(\OC::$server->getDatabaseConnection(), \OC::$server->getEventDispatcher()));
$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(), \OC::$server->getAppManager()));