2010-04-08 00:47:42 -03:00
< ? php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
* LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* This software consists of voluntary contributions made by many individuals
2012-05-26 14:37:00 +02:00
* and is licensed under the MIT license . For more information , see
2010-04-08 00:47:42 -03:00
* < http :// www . doctrine - project . org >.
*/
namespace Doctrine\ORM\Tools\Console\Command\SchemaTool ;
2017-11-23 11:18:08 +01:00
use Doctrine\ORM\Tools\SchemaTool ;
2012-12-14 12:49:05 +00:00
use Symfony\Component\Console\Input\InputInterface ;
2017-11-23 11:18:08 +01:00
use Symfony\Component\Console\Input\InputOption ;
2012-12-14 12:49:05 +00:00
use Symfony\Component\Console\Output\OutputInterface ;
2017-11-23 11:18:21 +01:00
use Symfony\Component\Console\Style\SymfonyStyle ;
2010-04-08 00:47:42 -03:00
/**
2011-06-03 07:58:49 -05:00
* Command to generate the SQL needed to update the database schema to match
* the current mapping information .
2010-04-08 00:47:42 -03:00
*
* @ link www . doctrine - project . org
* @ since 2.0
* @ author Benjamin Eberlei < kontakt @ beberlei . de >
* @ author Guilherme Blanco < guilhermeblanco @ hotmail . com >
* @ author Jonathan Wage < jonwage @ gmail . com >
* @ author Roman Borschel < roman @ code - factory . org >
2011-06-03 07:58:49 -05:00
* @ author Ryan Weaver < ryan @ thatsquality . com >
2010-04-08 00:47:42 -03:00
*/
2010-04-10 11:09:22 +02:00
class UpdateCommand extends AbstractCommand
2010-04-08 00:47:42 -03:00
{
2012-12-14 12:49:05 +00:00
/**
* @ var string
*/
2011-06-03 15:09:18 -05:00
protected $name = 'orm:schema-tool:update' ;
2010-04-08 00:47:42 -03:00
/**
2012-12-14 12:49:05 +00:00
* { @ inheritdoc }
2010-04-08 00:47:42 -03:00
*/
protected function configure ()
{
2017-11-23 11:18:08 +01:00
$this -> setName ( $this -> name )
-> setDescription ( 'Executes (or dumps) the SQL needed to update the database schema to match the current mapping metadata' )
-> addOption ( 'complete' , null , InputOption :: VALUE_NONE , 'If defined, all assets of the database which are not relevant to the current metadata will be dropped.' )
-> addOption ( 'dump-sql' , null , InputOption :: VALUE_NONE , 'Dumps the generated SQL statements to the screen (does not execute them).' )
-> addOption ( 'force' , 'f' , InputOption :: VALUE_NONE , 'Causes the generated SQL statements to be physically executed against your database.' )
-> setHelp ( <<< EOT
2012-07-17 00:55:09 +02:00
The < info >% command . name %</ info > command generates the SQL needed to
2011-06-03 07:58:49 -05:00
synchronize the database schema with the current mapping metadata of the
default entity manager .
For example , if you add metadata for a new column to an entity , this command
would generate and output the SQL needed to add the new column to the database :
2012-07-17 00:55:09 +02:00
< info >% command . name % -- dump - sql </ info >
2011-06-03 07:58:49 -05:00
Alternatively , you can execute the generated queries :
2012-07-17 00:55:09 +02:00
< info >% command . name % -- force </ info >
2011-06-03 07:58:49 -05:00
2012-11-17 16:17:09 +01:00
If both options are specified , the queries are output and then executed :
< info >% command . name % -- dump - sql -- force </ info >
2011-06-03 07:58:49 -05:00
Finally , be aware that if the < info >-- complete </ info > option is passed , this
task will drop all database assets ( e . g . tables , etc ) that are * not * described
by the current metadata . In other words , without this option , this task leaves
untouched any " extra " tables that exist in the database , but which aren ' t
described by any metadata .
2013-05-09 16:24:19 +02:00
< comment > Hint :</ comment > If you have a database with tables that should not be managed
by the ORM , you can use a DBAL functionality to filter the tables and sequences down
on a global level :
\ $config -> setFilterSchemaAssetsExpression ( \ $regexp );
2010-04-08 00:47:42 -03:00
EOT
2017-11-23 11:18:08 +01:00
);
2010-04-08 00:47:42 -03:00
}
2012-12-14 12:49:05 +00:00
/**
* { @ inheritdoc }
*/
2017-11-23 11:18:21 +01:00
protected function executeSchemaCommand ( InputInterface $input , OutputInterface $output , SchemaTool $schemaTool , array $metadatas , SymfonyStyle $ui )
2010-04-08 00:47:42 -03:00
{
// Defining if update is complete or not (--complete not defined means $saveMode = true)
2012-10-22 01:58:31 +02:00
$saveMode = ! $input -> getOption ( 'complete' );
2010-04-08 00:47:42 -03:00
2011-06-03 07:58:49 -05:00
$sqls = $schemaTool -> getUpdateSchemaSql ( $metadatas , $saveMode );
2012-10-22 01:58:31 +02:00
2017-11-23 11:18:21 +01:00
if ( empty ( $sqls )) {
$ui -> success ( 'Nothing to update - your database is already in sync with the current entity metadata.' );
2010-09-25 12:12:19 +02:00
2013-02-03 01:31:56 +00:00
return 0 ;
2011-06-03 07:58:49 -05:00
}
2012-10-22 01:58:31 +02:00
$dumpSql = true === $input -> getOption ( 'dump-sql' );
$force = true === $input -> getOption ( 'force' );
2011-06-03 15:09:18 -05:00
if ( $dumpSql ) {
2017-11-23 11:18:21 +01:00
$ui -> text ( 'The following SQL statements will be executed:' );
$ui -> newLine ();
foreach ( $sqls as $sql ) {
$ui -> text ( sprintf ( ' %s;' , $sql ));
}
2012-10-22 01:58:31 +02:00
}
if ( $force ) {
2014-12-19 22:27:26 +01:00
if ( $dumpSql ) {
2017-11-23 11:18:21 +01:00
$ui -> newLine ();
2014-12-19 22:27:26 +01:00
}
2017-11-23 11:18:21 +01:00
$ui -> text ( 'Updating database schema...' );
$ui -> newLine ();
2011-06-03 07:58:49 -05:00
$schemaTool -> updateSchema ( $metadatas , $saveMode );
2015-02-24 18:13:13 +00:00
$pluralization = ( 1 === count ( $sqls )) ? 'query was' : 'queries were' ;
2017-11-23 11:18:21 +01:00
$ui -> text ( sprintf ( ' <info>%s</info> %s executed' , count ( $sqls ), $pluralization ));
$ui -> success ( 'Database schema updated successfully!' );
2012-11-17 16:17:09 +01:00
}
2010-08-31 23:42:27 +02:00
2012-11-17 16:17:09 +01:00
if ( $dumpSql || $force ) {
2012-10-22 01:58:31 +02:00
return 0 ;
2010-04-08 00:47:42 -03:00
}
2013-06-12 00:31:25 -04:00
2017-11-23 11:18:21 +01:00
$ui -> caution (
[
'This operation should not be executed in a production environment!' ,
'' ,
'Use the incremental update to detect changes during development and use' ,
'the SQL DDL provided to manually update your database in production.' ,
]
);
$ui -> text (
[
sprintf ( 'The Schema-Tool would execute <info>"%s"</info> queries to update the database.' , count ( $sqls )),
'' ,
'Please run the operation by passing one - or both - of the following options:' ,
'' ,
sprintf ( ' <info>%s --force</info> to execute the command' , $this -> getName ()),
sprintf ( ' <info>%s --dump-sql</info> to dump the SQL statements to the screen' , $this -> getName ()),
]
);
2012-10-22 01:58:31 +02:00
return 1 ;
2010-04-08 00:47:42 -03:00
}
2010-08-23 08:21:41 +02:00
}