Rajout de doctrine/orm
[zf2.biz/galerie.git] / vendor / doctrine / dbal / lib / Doctrine / DBAL / Schema / SchemaDiff.php
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 MIT license. 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  * 
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 }