2020-03-11 07:29:52 -04:00
< ? php
declare ( strict_types = 1 );
/**
2024-05-24 13:43:47 -04:00
* SPDX - FileCopyrightText : 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX - License - Identifier : AGPL - 3.0 - or - later
2020-03-11 07:29:52 -04:00
*/
namespace OC\Core\Command\Db ;
2021-01-03 09:28:31 -05:00
use OC\DB\Connection ;
2020-03-11 07:29:52 -04:00
use OC\DB\SchemaWrapper ;
2023-07-19 16:36:59 -04:00
use OCP\DB\Events\AddMissingColumnsEvent ;
use OCP\EventDispatcher\IEventDispatcher ;
2020-03-11 07:29:52 -04:00
use Symfony\Component\Console\Command\Command ;
use Symfony\Component\Console\Input\InputInterface ;
2022-02-21 12:32:17 -05:00
use Symfony\Component\Console\Input\InputOption ;
2020-03-11 07:29:52 -04:00
use Symfony\Component\Console\Output\OutputInterface ;
/**
* 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 {
2023-06-12 10:37:03 -04:00
public function __construct (
private Connection $connection ,
2023-07-19 16:36:59 -04:00
private IEventDispatcher $dispatcher ,
2023-06-12 10:37:03 -04:00
) {
2020-03-11 07:29:52 -04:00
parent :: __construct ();
}
protected function configure () {
$this
-> setName ( 'db:add-missing-columns' )
2022-02-21 12:32:17 -05:00
-> setDescription ( 'Add missing optional columns to the database tables' )
2025-04-27 08:38:18 -04:00
-> addOption ( 'dry-run' , null , InputOption :: VALUE_NONE , 'Output the SQL queries instead of running them.' );
2020-03-11 07:29:52 -04:00
}
2020-06-26 08:54:51 -04:00
protected function execute ( InputInterface $input , OutputInterface $output ) : int {
2023-07-19 16:36:59 -04:00
$dryRun = $input -> getOption ( 'dry-run' );
2020-03-11 07:29:52 -04:00
// Dispatch event so apps can also update columns if needed
2023-07-19 16:36:59 -04:00
$event = new AddMissingColumnsEvent ();
$this -> dispatcher -> dispatchTyped ( $event );
$missingColumns = $event -> getMissingColumns ();
2023-07-19 17:14:43 -04:00
$updated = false ;
2023-07-19 16:36:59 -04:00
if ( ! empty ( $missingColumns )) {
$schema = new SchemaWrapper ( $this -> connection );
foreach ( $missingColumns as $missingColumn ) {
if ( $schema -> hasTable ( $missingColumn [ 'tableName' ])) {
$table = $schema -> getTable ( $missingColumn [ 'tableName' ]);
if ( ! $table -> hasColumn ( $missingColumn [ 'columnName' ])) {
$output -> writeln ( '<info>Adding additional ' . $missingColumn [ 'columnName' ] . ' column to the ' . $missingColumn [ 'tableName' ] . ' table, this can take some time...</info>' );
$table -> addColumn ( $missingColumn [ 'columnName' ], $missingColumn [ 'typeName' ], $missingColumn [ 'options' ]);
$sqlQueries = $this -> connection -> migrateToSchema ( $schema -> getWrappedSchema (), $dryRun );
if ( $dryRun && $sqlQueries !== null ) {
$output -> writeln ( $sqlQueries );
}
$updated = true ;
$output -> writeln ( '<info>' . $missingColumn [ 'tableName' ] . ' table updated successfully.</info>' );
}
}
}
}
if ( ! $updated ) {
$output -> writeln ( '<info>Done.</info>' );
}
2020-06-26 08:54:51 -04:00
return 0 ;
2020-03-11 07:29:52 -04:00
}
}