vendor/doctrine-dbal/lib/Doctrine/DBAL/Schema/SchemaDiff.php
changeset 0 7f95f8617b0b
equal deleted inserted replaced
-1:000000000000 0:7f95f8617b0b
       
     1 <?php
       
     2 /*
       
     3  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
     4  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
     5  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
     6  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
     7  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
     8  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
     9  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
    10  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
    11  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    12  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
    13  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    14  *
       
    15  * This software consists of voluntary contributions made by many individuals
       
    16  * and is licensed under the LGPL. For more information, see
       
    17  * <http://www.doctrine-project.org>.
       
    18  */
       
    19 
       
    20 namespace Doctrine\DBAL\Schema;
       
    21 
       
    22 use \Doctrine\DBAL\Platforms\AbstractPlatform;
       
    23 
       
    24 /**
       
    25  * Schema Diff
       
    26  *
       
    27  * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
       
    28  * @link    www.doctrine-project.org
       
    29  * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
       
    30  * @license http://ez.no/licenses/new_bsd New BSD License
       
    31  * @since   2.0
       
    32  * @version $Revision$
       
    33  * @author  Benjamin Eberlei <kontakt@beberlei.de>
       
    34  */
       
    35 class SchemaDiff
       
    36 {
       
    37     /**
       
    38      * All added tables
       
    39      *
       
    40      * @var array(string=>ezcDbSchemaTable)
       
    41      */
       
    42     public $newTables = array();
       
    43 
       
    44     /**
       
    45      * All changed tables
       
    46      *
       
    47      * @var array(string=>ezcDbSchemaTableDiff)
       
    48      */
       
    49     public $changedTables = array();
       
    50 
       
    51     /**
       
    52      * All removed tables
       
    53      *
       
    54      * @var array(string=>Table)
       
    55      */
       
    56     public $removedTables = array();
       
    57 
       
    58     /**
       
    59      * @var array
       
    60      */
       
    61     public $newSequences = array();
       
    62 
       
    63     /**
       
    64      * @var array
       
    65      */
       
    66     public $changedSequences = array();
       
    67 
       
    68     /**
       
    69      * @var array
       
    70      */
       
    71     public $removedSequences = array();
       
    72 
       
    73     /**
       
    74      * @var array
       
    75      */
       
    76     public $orphanedForeignKeys = array();
       
    77 
       
    78     /**
       
    79      * Constructs an SchemaDiff object.
       
    80      *
       
    81      * @param array(string=>Table)      $newTables
       
    82      * @param array(string=>TableDiff)  $changedTables
       
    83      * @param array(string=>bool)       $removedTables
       
    84      */
       
    85     public function __construct($newTables = array(), $changedTables = array(), $removedTables = array())
       
    86     {
       
    87         $this->newTables = $newTables;
       
    88         $this->changedTables = $changedTables;
       
    89         $this->removedTables = $removedTables;
       
    90     }
       
    91 
       
    92     /**
       
    93      * The to save sql mode ensures that the following things don't happen:
       
    94      *
       
    95      * 1. Tables are deleted
       
    96      * 2. Sequences are deleted
       
    97      * 3. Foreign Keys which reference tables that would otherwise be deleted.
       
    98      *
       
    99      * This way it is ensured that assets are deleted which might not be relevant to the metadata schema at all.
       
   100      *
       
   101      * @param AbstractPlatform $platform
       
   102      * @return array
       
   103      */
       
   104     public function toSaveSql(AbstractPlatform $platform)
       
   105     {
       
   106         return $this->_toSql($platform, true);
       
   107     }
       
   108 
       
   109     /**
       
   110      * @param AbstractPlatform $platform
       
   111      * @return array
       
   112      */
       
   113     public function toSql(AbstractPlatform $platform)
       
   114     {
       
   115         return $this->_toSql($platform, false);
       
   116     }
       
   117 
       
   118     /**
       
   119      * @param AbstractPlatform $platform
       
   120      * @param bool $saveMode
       
   121      * @return array
       
   122      */
       
   123     protected function _toSql(AbstractPlatform $platform, $saveMode = false)
       
   124     {
       
   125         $sql = array();
       
   126 
       
   127         if ($platform->supportsForeignKeyConstraints() && $saveMode == false) {
       
   128             foreach ($this->orphanedForeignKeys AS $orphanedForeignKey) {
       
   129                 $sql[] = $platform->getDropForeignKeySQL($orphanedForeignKey, $orphanedForeignKey->getLocalTableName());
       
   130             }
       
   131         }
       
   132 
       
   133         if ($platform->supportsSequences() == true) {
       
   134             foreach ($this->changedSequences AS $sequence) {
       
   135                 $sql[] = $platform->getAlterSequenceSQL($sequence);
       
   136             }
       
   137 
       
   138             if ($saveMode === false) {
       
   139                 foreach ($this->removedSequences AS $sequence) {
       
   140                     $sql[] = $platform->getDropSequenceSQL($sequence);
       
   141                 }
       
   142             }
       
   143 
       
   144             foreach ($this->newSequences AS $sequence) {
       
   145                 $sql[] = $platform->getCreateSequenceSQL($sequence);
       
   146             }
       
   147         }
       
   148 
       
   149         $foreignKeySql = array();
       
   150         foreach ($this->newTables AS $table) {
       
   151             $sql = array_merge(
       
   152                 $sql,
       
   153                 $platform->getCreateTableSQL($table, AbstractPlatform::CREATE_INDEXES)
       
   154             );
       
   155 
       
   156             if ($platform->supportsForeignKeyConstraints()) {
       
   157                 foreach ($table->getForeignKeys() AS $foreignKey) {
       
   158                     $foreignKeySql[] = $platform->getCreateForeignKeySQL($foreignKey, $table);
       
   159                 }
       
   160             }
       
   161         }
       
   162         $sql = array_merge($sql, $foreignKeySql);
       
   163 
       
   164         if ($saveMode === false) {
       
   165             foreach ($this->removedTables AS $table) {
       
   166                 $sql[] = $platform->getDropTableSQL($table);
       
   167             }
       
   168         }
       
   169 
       
   170         foreach ($this->changedTables AS $tableDiff) {
       
   171             $sql = array_merge($sql, $platform->getAlterTableSQL($tableDiff));
       
   172         }
       
   173 
       
   174         return $sql;
       
   175     }
       
   176 }