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.
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>.
20 namespace Doctrine\DBAL\Platforms;
22 use Doctrine\DBAL\DBALException,
23 Doctrine\DBAL\Schema\TableDiff,
24 Doctrine\DBAL\Schema\Index,
25 Doctrine\DBAL\Schema\Table;
30 * @author Kim Hemsø Rasmussen <kimhemsoe@gmail.com>
32 class DrizzlePlatform extends AbstractPlatform
37 public function getName()
45 public function getIdentifierQuoteCharacter()
53 */ public function getConcatExpression()
55 $args = func_get_args();
57 return 'CONCAT(' . join(', ', (array) $args) . ')';
63 public function getDateDiffExpression($date1, $date2)
65 return 'DATEDIFF(' . $date1 . ', ' . $date2 . ')';
71 public function getDateAddDaysExpression($date, $days)
73 return 'DATE_ADD(' . $date . ', INTERVAL ' . $days . ' DAY)';
79 public function getDateSubDaysExpression($date, $days)
81 return 'DATE_SUB(' . $date . ', INTERVAL ' . $days . ' DAY)';
87 public function getDateAddMonthExpression($date, $months)
89 return 'DATE_ADD(' . $date . ', INTERVAL ' . $months . ' MONTH)';
95 public function getDateSubMonthExpression($date, $months)
97 return 'DATE_SUB(' . $date . ', INTERVAL ' . $months . ' MONTH)';
103 public function getBooleanTypeDeclarationSQL(array $field)
111 public function getIntegerTypeDeclarationSQL(array $field)
113 return 'INT' . $this->_getCommonIntegerTypeDeclarationSQL($field);
119 protected function _getCommonIntegerTypeDeclarationSQL(array $columnDef)
122 if ( ! empty($columnDef['autoincrement'])) {
123 $autoinc = ' AUTO_INCREMENT';
131 public function getBigIntTypeDeclarationSQL(array $field)
133 return 'BIGINT' . $this->_getCommonIntegerTypeDeclarationSQL($field);
139 public function getSmallIntTypeDeclarationSQL(array $field)
141 return 'INT' . $this->_getCommonIntegerTypeDeclarationSQL($field);
147 protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed)
149 return $length ? 'VARCHAR(' . $length . ')' : 'VARCHAR(255)';
155 protected function initializeDoctrineTypeMappings()
157 $this->doctrineTypeMapping = array(
158 'boolean' => 'boolean',
159 'varchar' => 'string',
160 'integer' => 'integer',
162 'decimal' => 'decimal',
163 'datetime' => 'datetime',
167 'timestamp' => 'datetime',
169 'bigint' => 'bigint',
176 public function getClobTypeDeclarationSQL(array $field)
184 public function getBlobTypeDeclarationSQL(array $field)
192 public function getCreateDatabaseSQL($name)
194 return 'CREATE DATABASE ' . $name;
200 public function getDropDatabaseSQL($name)
202 return 'DROP DATABASE ' . $name;
205 public function getListDatabasesSQL()
207 return "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE CATALOG_NAME='LOCAL'";
213 protected function getReservedKeywordsClass()
215 return 'Doctrine\DBAL\Platforms\Keywords\DrizzleKeywords';
218 public function getListTablesSQL()
220 return "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE' AND TABLE_SCHEMA=DATABASE()";
223 public function getListTableColumnsSQL($table, $database = null)
226 $database = "'" . $database . "'";
228 $database = 'DATABASE()';
231 return "SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT, IS_NULLABLE, IS_AUTO_INCREMENT, CHARACTER_MAXIMUM_LENGTH, COLUMN_DEFAULT," .
232 " NUMERIC_PRECISION, NUMERIC_SCALE" .
233 " FROM DATA_DICTIONARY.COLUMNS" .
234 " WHERE TABLE_SCHEMA=" . $database . " AND TABLE_NAME = '" . $table . "'";
237 public function getListTableForeignKeysSQL($table, $database = null)
240 $database = "'" . $database . "'";
242 $database = 'DATABASE()';
245 return "SELECT CONSTRAINT_NAME, CONSTRAINT_COLUMNS, REFERENCED_TABLE_NAME, REFERENCED_TABLE_COLUMNS, UPDATE_RULE, DELETE_RULE" .
246 " FROM DATA_DICTIONARY.FOREIGN_KEYS" .
247 " WHERE CONSTRAINT_SCHEMA=" . $database . " AND CONSTRAINT_TABLE='" . $table . "'";
253 public function getListTableIndexesSQL($table, $database = null)
256 $database = "'" . $database . "'";
258 $database = 'DATABASE()';
261 return "SELECT INDEX_NAME AS 'key_name', COLUMN_NAME AS 'column_name', IS_USED_IN_PRIMARY AS 'primary', IS_UNIQUE=0 AS 'non_unique'" .
262 " FROM DATA_DICTIONARY.INDEX_PARTS" .
263 " WHERE TABLE_SCHEMA=" . $database . " AND TABLE_NAME='" . $table . "'";
269 public function prefersIdentityColumns()
277 public function supportsIdentityColumns()
285 public function supportsInlineColumnComments()
293 public function supportsViews()
301 public function getDropIndexSQL($index, $table=null)
303 if ($index instanceof Index) {
304 $indexName = $index->getQuotedName($this);
305 } else if (is_string($index)) {
308 throw new \InvalidArgumentException('DrizzlePlatform::getDropIndexSQL() expects $index parameter to be string or \Doctrine\DBAL\Schema\Index.');
311 if ($table instanceof Table) {
312 $table = $table->getQuotedName($this);
313 } else if(!is_string($table)) {
314 throw new \InvalidArgumentException('DrizzlePlatform::getDropIndexSQL() expects $table parameter to be string or \Doctrine\DBAL\Schema\Table.');
317 if ($index instanceof Index && $index->isPrimary()) {
318 // drizzle primary keys are always named "PRIMARY",
319 // so we cannot use them in statements because of them being keyword.
320 return $this->getDropPrimaryKeySQL($table);
323 return 'DROP INDEX ' . $indexName . ' ON ' . $table;
327 * @param Index $index
328 * @param Table $table
332 protected function getDropPrimaryKeySQL($table)
334 return 'ALTER TABLE ' . $table . ' DROP PRIMARY KEY';
340 public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration)
342 if (isset($fieldDeclaration['version']) && $fieldDeclaration['version'] == true) {
352 public function getTimeTypeDeclarationSQL(array $fieldDeclaration)
360 public function getDateTypeDeclarationSQL(array $fieldDeclaration)
368 public function getAlterTableSQL(TableDiff $diff)
370 $columnSql = array();
371 $queryParts = array();
373 if ($diff->newName !== false) {
374 $queryParts[] = 'RENAME TO ' . $diff->newName;
377 foreach ($diff->addedColumns as $column) {
378 if ($this->onSchemaAlterTableAddColumn($column, $diff, $columnSql)) {
382 $columnArray = $column->toArray();
383 $columnArray['comment'] = $this->getColumnComment($column);
384 $queryParts[] = 'ADD ' . $this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray);
387 foreach ($diff->removedColumns as $column) {
388 if ($this->onSchemaAlterTableRemoveColumn($column, $diff, $columnSql)) {
392 $queryParts[] = 'DROP ' . $column->getQuotedName($this);
395 foreach ($diff->changedColumns as $columnDiff) {
396 if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) {
400 /* @var $columnDiff \Doctrine\DBAL\Schema\ColumnDiff */
401 $column = $columnDiff->column;
402 $columnArray = $column->toArray();
403 $columnArray['comment'] = $this->getColumnComment($column);
404 $queryParts[] = 'CHANGE ' . ($columnDiff->oldColumnName) . ' '
405 . $this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray);
408 foreach ($diff->renamedColumns as $oldColumnName => $column) {
409 if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) {
413 $columnArray = $column->toArray();
414 $columnArray['comment'] = $this->getColumnComment($column);
415 $queryParts[] = 'CHANGE ' . $oldColumnName . ' '
416 . $this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray);
422 if ( ! $this->onSchemaAlterTable($diff, $tableSql)) {
423 if (count($queryParts) > 0) {
424 $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . implode(", ", $queryParts);
427 $this->getPreAlterTableIndexForeignKeySQL($diff),
429 $this->getPostAlterTableIndexForeignKeySQL($diff)
433 return array_merge($sql, $tableSql, $columnSql);
439 public function getDropTemporaryTableSQL($table)
441 if ($table instanceof Table) {
442 $table = $table->getQuotedName($this);
443 } else if(!is_string($table)) {
444 throw new \InvalidArgumentException('getDropTableSQL() expects $table parameter to be string or \Doctrine\DBAL\Schema\Table.');
447 return 'DROP TEMPORARY TABLE ' . $table;
453 public function convertBooleans($item)
455 if (is_array($item)) {
456 foreach ($item as $key => $value) {
457 if (is_bool($value) || is_numeric($item)) {
458 $item[$key] = ($value) ? 'true' : 'false';
461 } else if (is_bool($item) || is_numeric($item)) {
462 $item = ($item) ? 'true' : 'false';
471 public function getLocateExpression($str, $substr, $startPos = false)
473 if ($startPos == false) {
474 return 'LOCATE(' . $substr . ', ' . $str . ')';
477 return 'LOCATE(' . $substr . ', ' . $str . ', '.$startPos.')';
483 public function getGuidExpression()
491 public function getRegexpExpression()