Вход Регистрация
Файл: vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/DrizzlePlatform.php
Строк: 655
<?php

namespace DoctrineDBALPlatforms;

use 
DoctrineDBALSchemaIdentifier;
use 
DoctrineDBALSchemaIndex;
use 
DoctrineDBALSchemaTable;
use 
DoctrineDBALSchemaTableDiff;
use 
DoctrineDBALTypesBinaryType;
use 
InvalidArgumentException;

use function 
array_merge;
use function 
array_unique;
use function 
array_values;
use function 
count;
use function 
func_get_args;
use function 
implode;
use function 
is_array;
use function 
is_bool;
use function 
is_numeric;
use function 
is_string;
use function 
sprintf;
use function 
trim;

/**
 * Drizzle platform
 *
 * @deprecated
 */
class DrizzlePlatform extends AbstractPlatform
{
    
/**
     * {@inheritDoc}
     */
    
public function getName()
    {
        return 
'drizzle';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getIdentifierQuoteCharacter()
    {
        return 
'`';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getConcatExpression()
    {
        return 
'CONCAT(' implode(', 'func_get_args()) . ')';
    }

    
/**
     * {@inheritdoc}
     */
    
protected function getDateArithmeticIntervalExpression($date$operator$interval$unit)
    {
        
$function $operator === '+' 'DATE_ADD' 'DATE_SUB';

        return 
$function '(' $date ', INTERVAL ' $interval ' ' $unit ')';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getDateDiffExpression($date1$date2)
    {
        return 
'DATEDIFF(' $date1 ', ' $date2 ')';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getBooleanTypeDeclarationSQL(array $column)
    {
        return 
'BOOLEAN';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getIntegerTypeDeclarationSQL(array $column)
    {
        return 
'INT' $this->_getCommonIntegerTypeDeclarationSQL($column);
    }

    
/**
     * {@inheritDoc}
     */
    
protected function _getCommonIntegerTypeDeclarationSQL(array $column)
    {
        
$autoinc '';
        if (! empty(
$column['autoincrement'])) {
            
$autoinc ' AUTO_INCREMENT';
        }

        return 
$autoinc;
    }

    
/**
     * {@inheritDoc}
     */
    
public function getBigIntTypeDeclarationSQL(array $column)
    {
        return 
'BIGINT' $this->_getCommonIntegerTypeDeclarationSQL($column);
    }

    
/**
     * {@inheritDoc}
     */
    
public function getSmallIntTypeDeclarationSQL(array $column)
    {
        return 
'INT' $this->_getCommonIntegerTypeDeclarationSQL($column);
    }

    
/**
     * {@inheritDoc}
     */
    
protected function getVarcharTypeDeclarationSQLSnippet($length$fixed)
    {
        return 
$length 'VARCHAR(' $length ')' 'VARCHAR(255)';
    }

    
/**
     * {@inheritdoc}
     */
    
protected function getBinaryTypeDeclarationSQLSnippet($length$fixed)
    {
        return 
'VARBINARY(' . ($length ?: 255) . ')';
    }

    
/**
     * {@inheritDoc}
     */
    
protected function initializeDoctrineTypeMappings()
    {
        
$this->doctrineTypeMapping = [
            
'boolean'       => 'boolean',
            
'varchar'       => 'string',
            
'varbinary'     => 'binary',
            
'integer'       => 'integer',
            
'blob'          => 'blob',
            
'decimal'       => 'decimal',
            
'datetime'      => 'datetime',
            
'date'          => 'date',
            
'time'          => 'time',
            
'text'          => 'text',
            
'timestamp'     => 'datetime',
            
'double'        => 'float',
            
'bigint'        => 'bigint',
        ];
    }

    
/**
     * {@inheritDoc}
     */
    
public function getClobTypeDeclarationSQL(array $column)
    {
        return 
'TEXT';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getBlobTypeDeclarationSQL(array $column)
    {
        return 
'BLOB';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getCreateDatabaseSQL($name)
    {
        return 
'CREATE DATABASE ' $name;
    }

    
/**
     * {@inheritDoc}
     */
    
public function getDropDatabaseSQL($name)
    {
        return 
'DROP DATABASE ' $name;
    }

    
/**
     * {@inheritDoc}
     */
    
protected function _getCreateTableSQL($name, array $columns, array $options = [])
    {
        
$queryFields $this->getColumnDeclarationListSQL($columns);

        if (isset(
$options['uniqueConstraints']) && ! empty($options['uniqueConstraints'])) {
            foreach (
$options['uniqueConstraints'] as $index => $definition) {
                
$queryFields .= ', ' $this->getUniqueConstraintDeclarationSQL($index$definition);
            }
        }

        
// add all indexes
        
if (isset($options['indexes']) && ! empty($options['indexes'])) {
            foreach (
$options['indexes'] as $index => $definition) {
                
$queryFields .= ', ' $this->getIndexDeclarationSQL($index$definition);
            }
        }

        
// attach all primary keys
        
if (isset($options['primary']) && ! empty($options['primary'])) {
            
$keyColumns   array_unique(array_values($options['primary']));
            
$queryFields .= ', PRIMARY KEY(' implode(', '$keyColumns) . ')';
        }

        
$query 'CREATE ';

        if (! empty(
$options['temporary'])) {
            
$query .= 'TEMPORARY ';
        }

        
$query .= 'TABLE ' $name ' (' $queryFields ') ';
        
$query .= $this->buildTableOptions($options);
        
$query .= $this->buildPartitionOptions($options);

        
$sql = [$query];

        if (isset(
$options['foreignKeys'])) {
            foreach ((array) 
$options['foreignKeys'] as $definition) {
                
$sql[] = $this->getCreateForeignKeySQL($definition$name);
            }
        }

        return 
$sql;
    }

    
/**
     * Build SQL for table options
     *
     * @param mixed[] $options
     *
     * @return string
     */
    
private function buildTableOptions(array $options)
    {
        if (isset(
$options['table_options'])) {
            return 
$options['table_options'];
        }

        
$tableOptions = [];

        
// Collate
        
if (! isset($options['collate'])) {
            
$options['collate'] = 'utf8_unicode_ci';
        }

        
$tableOptions[] = sprintf('COLLATE %s'$options['collate']);

        
// Engine
        
if (! isset($options['engine'])) {
            
$options['engine'] = 'InnoDB';
        }

        
$tableOptions[] = sprintf('ENGINE = %s'$options['engine']);

        
// Auto increment
        
if (isset($options['auto_increment'])) {
            
$tableOptions[] = sprintf('AUTO_INCREMENT = %s'$options['auto_increment']);
        }

        
// Comment
        
if (isset($options['comment'])) {
            
$comment trim($options['comment'], " '");

            
$tableOptions[] = sprintf('COMMENT = %s '$this->quoteStringLiteral($comment));
        }

        
// Row format
        
if (isset($options['row_format'])) {
            
$tableOptions[] = sprintf('ROW_FORMAT = %s'$options['row_format']);
        }

        return 
implode(' '$tableOptions);
    }

    
/**
     * Build SQL for partition options.
     *
     * @param mixed[] $options
     *
     * @return string
     */
    
private function buildPartitionOptions(array $options)
    {
        return isset(
$options['partition_options'])
            ? 
' ' $options['partition_options']
            : 
'';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getListDatabasesSQL()
    {
        return 
"SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE CATALOG_NAME='LOCAL'";
    }

    
/**
     * {@inheritDoc}
     */
    
protected function getReservedKeywordsClass()
    {
        return 
KeywordsDrizzleKeywords::class;
    }

    
/**
     * {@inheritDoc}
     */
    
public function getListTablesSQL()
    {
        return 
"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE' AND TABLE_SCHEMA=DATABASE()";
    }

    
/**
     * {@inheritDoc}
     */
    
public function getListTableColumnsSQL($table$database null)
    {
        if (
$database) {
            
$databaseSQL $this->quoteStringLiteral($database);
        } else {
            
$databaseSQL 'DATABASE()';
        }

        return 
'SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT, IS_NULLABLE, IS_AUTO_INCREMENT,' .
               
' CHARACTER_MAXIMUM_LENGTH, COLUMN_DEFAULT, NUMERIC_PRECISION, NUMERIC_SCALE, COLLATION_NAME' .
               
' FROM DATA_DICTIONARY.COLUMNS' .
               
' WHERE TABLE_SCHEMA=' $databaseSQL ' AND TABLE_NAME = ' $this->quoteStringLiteral($table);
    }

    
/**
     * @param string      $table
     * @param string|null $database
     *
     * @return string
     */
    
public function getListTableForeignKeysSQL($table$database null)
    {
        if (
$database) {
            
$databaseSQL $this->quoteStringLiteral($database);
        } else {
            
$databaseSQL 'DATABASE()';
        }

        return 
'SELECT CONSTRAINT_NAME, CONSTRAINT_COLUMNS, REFERENCED_TABLE_NAME, REFERENCED_TABLE_COLUMNS,'
            
' UPDATE_RULE, DELETE_RULE'
            
' FROM DATA_DICTIONARY.FOREIGN_KEYS'
            
' WHERE CONSTRAINT_SCHEMA=' $databaseSQL
            
' AND CONSTRAINT_TABLE=' $this->quoteStringLiteral($table);
    }

    
/**
     * {@inheritDoc}
     */
    
public function getListTableIndexesSQL($table$database null)
    {
        if (
$database) {
            
$databaseSQL $this->quoteStringLiteral($database);
        } else {
            
$databaseSQL 'DATABASE()';
        }

        return 
"SELECT INDEX_NAME AS 'key_name',"
            
" COLUMN_NAME AS 'column_name',"
            
" IS_USED_IN_PRIMARY AS 'primary',"
            
" IS_UNIQUE=0 AS 'non_unique'"
            
' FROM DATA_DICTIONARY.INDEX_PARTS'
            
' WHERE TABLE_SCHEMA=' $databaseSQL ' AND TABLE_NAME=' $this->quoteStringLiteral($table);
    }

    
/**
     * {@inheritDoc}
     */
    
public function prefersIdentityColumns()
    {
        return 
true;
    }

    
/**
     * {@inheritDoc}
     */
    
public function supportsIdentityColumns()
    {
        return 
true;
    }

    
/**
     * {@inheritDoc}
     */
    
public function supportsInlineColumnComments()
    {
        return 
true;
    }

    
/**
     * {@inheritDoc}
     */
    
public function supportsViews()
    {
        return 
false;
    }

    
/**
     * {@inheritdoc}
     */
    
public function supportsColumnCollation()
    {
        return 
true;
    }

    
/**
     * {@inheritDoc}
     */
    
public function getDropIndexSQL($index$table null)
    {
        if (
$index instanceof Index) {
            
$indexName $index->getQuotedName($this);
        } elseif (
is_string($index)) {
            
$indexName $index;
        } else {
            throw new 
InvalidArgumentException(
                
__METHOD__ '() expects $index parameter to be string or ' Index::class . '.'
            
);
        }

        if (
$table instanceof Table) {
            
$table $table->getQuotedName($this);
        } elseif (! 
is_string($table)) {
            throw new 
InvalidArgumentException(
                
__METHOD__ '() expects $table parameter to be string or ' Table::class . '.'
            
);
        }

        if (
$index instanceof Index && $index->isPrimary()) {
            
// drizzle primary keys are always named "PRIMARY",
            // so we cannot use them in statements because of them being keyword.
            
return $this->getDropPrimaryKeySQL($table);
        }

        return 
'DROP INDEX ' $indexName ' ON ' $table;
    }

    
/**
     * @param string $table
     *
     * @return string
     */
    
protected function getDropPrimaryKeySQL($table)
    {
        return 
'ALTER TABLE ' $table ' DROP PRIMARY KEY';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getDateTimeTypeDeclarationSQL(array $column)
    {
        if (isset(
$column['version']) && $column['version'] === true) {
            return 
'TIMESTAMP';
        }

        return 
'DATETIME';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getTimeTypeDeclarationSQL(array $column)
    {
        return 
'TIME';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getDateTypeDeclarationSQL(array $column)
    {
        return 
'DATE';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getAlterTableSQL(TableDiff $diff)
    {
        
$columnSql  = [];
        
$queryParts = [];

        
$newName $diff->getNewName();

        if (
$newName !== false) {
            
$queryParts[] = 'RENAME TO ' $newName->getQuotedName($this);
        }

        foreach (
$diff->addedColumns as $column) {
            if (
$this->onSchemaAlterTableAddColumn($column$diff$columnSql)) {
                continue;
            }

            
$columnArray array_merge($column->toArray(), [
                
'comment' => $this->getColumnComment($column),
            ]);

            
$queryParts[] = 'ADD ' $this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray);
        }

        foreach (
$diff->removedColumns as $column) {
            if (
$this->onSchemaAlterTableRemoveColumn($column$diff$columnSql)) {
                continue;
            }

            
$queryParts[] =  'DROP ' $column->getQuotedName($this);
        }

        foreach (
$diff->changedColumns as $columnDiff) {
            if (
$this->onSchemaAlterTableChangeColumn($columnDiff$diff$columnSql)) {
                continue;
            }

            
$column      $columnDiff->column;
            
$columnArray $column->toArray();

            
// Do not generate column alteration clause if type is binary and only fixed property has changed.
            // Drizzle only supports binary type columns with variable length.
            // Avoids unnecessary table alteration statements.
            
if (
                
$columnArray['type'] instanceof BinaryType &&
                
$columnDiff->hasChanged('fixed') &&
                
count($columnDiff->changedProperties) === 1
            
) {
                continue;
            }

            
$columnArray['comment'] = $this->getColumnComment($column);
            
$queryParts[]           =  'CHANGE ' . ($columnDiff->getOldColumnName()->getQuotedName($this)) . ' '
                    
$this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray);
        }

        foreach (
$diff->renamedColumns as $oldColumnName => $column) {
            if (
$this->onSchemaAlterTableRenameColumn($oldColumnName$column$diff$columnSql)) {
                continue;
            }

            
$oldColumnName = new Identifier($oldColumnName);

            
$columnArray            $column->toArray();
            
$columnArray['comment'] = $this->getColumnComment($column);
            
$queryParts[]           =  'CHANGE ' $oldColumnName->getQuotedName($this) . ' '
                    
$this->getColumnDeclarationSQL($column->getQuotedName($this), $columnArray);
        }

        
$sql      = [];
        
$tableSql = [];

        if (! 
$this->onSchemaAlterTable($diff$tableSql)) {
            if (
count($queryParts) > 0) {
                
$sql[] = 'ALTER TABLE ' $diff->getName($this)->getQuotedName($this)
                    . 
' ' implode(', '$queryParts);
            }

            
$sql array_merge(
                
$this->getPreAlterTableIndexForeignKeySQL($diff),
                
$sql,
                
$this->getPostAlterTableIndexForeignKeySQL($diff)
            );
        }

        return 
array_merge($sql$tableSql$columnSql);
    }

    
/**
     * {@inheritDoc}
     */
    
public function getDropTemporaryTableSQL($table)
    {
        if (
$table instanceof Table) {
            
$table $table->getQuotedName($this);
        } elseif (! 
is_string($table)) {
            throw new 
InvalidArgumentException(
                
__METHOD__ '() expects $table parameter to be string or ' Table::class . '.'
            
);
        }

        return 
'DROP TEMPORARY TABLE ' $table;
    }

    
/**
     * {@inheritDoc}
     */
    
public function convertBooleans($item)
    {
        if (
is_array($item)) {
            foreach (
$item as $key => $value) {
                if (! 
is_bool($value) && ! is_numeric($value)) {
                    continue;
                }

                
$item[$key] = $value 'true' 'false';
            }
        } elseif (
is_bool($item) || is_numeric($item)) {
            
$item $item 'true' 'false';
        }

        return 
$item;
    }

    
/**
     * {@inheritDoc}
     */
    
public function getLocateExpression($str$substr$startPos false)
    {
        if (
$startPos === false) {
            return 
'LOCATE(' $substr ', ' $str ')';
        }

        return 
'LOCATE(' $substr ', ' $str ', ' $startPos ')';
    }

    
/**
     * {@inheritDoc}
     *
     * @deprecated Use application-generated UUIDs instead
     */
    
public function getGuidExpression()
    {
        return 
'UUID()';
    }

    
/**
     * {@inheritDoc}
     */
    
public function getRegexpExpression()
    {
        return 
'RLIKE';
    }
}
Онлайн: 2
Реклама