Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/MySqlSchemaManager.php
Строк: 272
<?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
 * and is licensed under the MIT license. For more information, see
 * <http://www.doctrine-project.org>.
 */

namespace DoctrineDBALSchema;

use 
DoctrineDBALPlatformsMySqlPlatform;
use 
DoctrineDBALTypesType;

/**
 * Schema manager for the MySql RDBMS.
 *
 * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
 * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
 * @author Roman Borschel <roman@code-factory.org>
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 * @since  2.0
 */
class MySqlSchemaManager extends AbstractSchemaManager
{
    
/**
     * {@inheritdoc}
     */
    
protected function _getPortableViewDefinition($view)
    {
        return new 
View($view['TABLE_NAME'], $view['VIEW_DEFINITION']);
    }

    
/**
     * {@inheritdoc}
     */
    
protected function _getPortableTableDefinition($table)
    {
        return 
array_shift($table);
    }

    
/**
     * {@inheritdoc}
     */
    
protected function _getPortableUserDefinition($user)
    {
        return array(
            
'user' => $user['User'],
            
'password' => $user['Password'],
        );
    }

    
/**
     * {@inheritdoc}
     */
    
protected function _getPortableTableIndexesList($tableIndexes$tableName=null)
    {
        foreach (
$tableIndexes as $k => $v) {
            
$v array_change_key_case($vCASE_LOWER);
            if (
$v['key_name'] == 'PRIMARY') {
                
$v['primary'] = true;
            } else {
                
$v['primary'] = false;
            }
            if (
strpos($v['index_type'], 'FULLTEXT') !== false) {
                
$v['flags'] = array('FULLTEXT');
            } elseif (
strpos($v['index_type'], 'SPATIAL') !== false) {
                
$v['flags'] = array('SPATIAL');
            }
            
$tableIndexes[$k] = $v;
        }

        return 
parent::_getPortableTableIndexesList($tableIndexes$tableName);
    }

    
/**
     * {@inheritdoc}
     */
    
protected function _getPortableSequenceDefinition($sequence)
    {
        return 
end($sequence);
    }

    
/**
     * {@inheritdoc}
     */
    
protected function _getPortableDatabaseDefinition($database)
    {
        return 
$database['Database'];
    }

    
/**
     * {@inheritdoc}
     */
    
protected function _getPortableTableColumnDefinition($tableColumn)
    {
        
$tableColumn array_change_key_case($tableColumnCASE_LOWER);

        
$dbType strtolower($tableColumn['type']);
        
$dbType strtok($dbType'(), ');
        if (isset(
$tableColumn['length'])) {
            
$length $tableColumn['length'];
        } else {
            
$length strtok('(), ');
        }

        
$fixed null;

        if ( ! isset(
$tableColumn['name'])) {
            
$tableColumn['name'] = '';
        }

        
$scale null;
        
$precision null;

        
$type $this->_platform->getDoctrineTypeMapping($dbType);

        
// In cases where not connected to a database DESCRIBE $table does not return 'Comment'
        
if (isset($tableColumn['comment'])) {
            
$type $this->extractDoctrineTypeFromComment($tableColumn['comment'], $type);
            
$tableColumn['comment'] = $this->removeDoctrineTypeFromComment($tableColumn['comment'], $type);
        }

        switch (
$dbType) {
            case 
'char':
            case 
'binary':
                
$fixed true;
                break;
            case 
'float':
            case 
'double':
            case 
'real':
            case 
'numeric':
            case 
'decimal':
                if (
preg_match('([A-Za-z]+(([0-9]+),([0-9]+)))'$tableColumn['type'], $match)) {
                    
$precision $match[1];
                    
$scale $match[2];
                    
$length null;
                }
                break;
            case 
'tinytext':
                
$length MySqlPlatform::LENGTH_LIMIT_TINYTEXT;
                break;
            case 
'text':
                
$length MySqlPlatform::LENGTH_LIMIT_TEXT;
                break;
            case 
'mediumtext':
                
$length MySqlPlatform::LENGTH_LIMIT_MEDIUMTEXT;
                break;
            case 
'tinyblob':
                
$length MySqlPlatform::LENGTH_LIMIT_TINYBLOB;
                break;
            case 
'blob':
                
$length MySqlPlatform::LENGTH_LIMIT_BLOB;
                break;
            case 
'mediumblob':
                
$length MySqlPlatform::LENGTH_LIMIT_MEDIUMBLOB;
                break;
            case 
'tinyint':
            case 
'smallint':
            case 
'mediumint':
            case 
'int':
            case 
'integer':
            case 
'bigint':
            case 
'year':
                
$length null;
                break;
        }

        
$length = ((int) $length == 0) ? null : (int) $length;

        
$options = array(
            
'length'        => $length,
            
'unsigned'      => (bool) (strpos($tableColumn['type'], 'unsigned') !== false),
            
'fixed'         => (bool) $fixed,
            
'default'       => isset($tableColumn['default']) ? $tableColumn['default'] : null,
            
'notnull'       => (bool) ($tableColumn['null'] != 'YES'),
            
'scale'         => null,
            
'precision'     => null,
            
'autoincrement' => (bool) (strpos($tableColumn['extra'], 'auto_increment') !== false),
            
'comment'       => isset($tableColumn['comment']) && $tableColumn['comment'] !== ''
                
$tableColumn['comment']
                : 
null,
        );

        if (
$scale !== null && $precision !== null) {
            
$options['scale'] = $scale;
            
$options['precision'] = $precision;
        }

        
$column = new Column($tableColumn['field'], Type::getType($type), $options);

        if (isset(
$tableColumn['collation'])) {
            
$column->setPlatformOption('collation'$tableColumn['collation']);
        }

        return 
$column;
    }

    
/**
     * {@inheritdoc}
     */
    
protected function _getPortableTableForeignKeysList($tableForeignKeys)
    {
        
$list = array();
        foreach (
$tableForeignKeys as $value) {
            
$value array_change_key_case($valueCASE_LOWER);
            if (!isset(
$list[$value['constraint_name']])) {
                if (!isset(
$value['delete_rule']) || $value['delete_rule'] == "RESTRICT") {
                    
$value['delete_rule'] = null;
                }
                if (!isset(
$value['update_rule']) || $value['update_rule'] == "RESTRICT") {
                    
$value['update_rule'] = null;
                }

                
$list[$value['constraint_name']] = array(
                    
'name' => $value['constraint_name'],
                    
'local' => array(),
                    
'foreign' => array(),
                    
'foreignTable' => $value['referenced_table_name'],
                    
'onDelete' => $value['delete_rule'],
                    
'onUpdate' => $value['update_rule'],
                );
            }
            
$list[$value['constraint_name']]['local'][] = $value['column_name'];
            
$list[$value['constraint_name']]['foreign'][] = $value['referenced_column_name'];
        }

        
$result = array();
        foreach (
$list as $constraint) {
            
$result[] = new ForeignKeyConstraint(
                
array_values($constraint['local']), $constraint['foreignTable'],
                
array_values($constraint['foreign']), $constraint['name'],
                array(
                    
'onDelete' => $constraint['onDelete'],
                    
'onUpdate' => $constraint['onUpdate'],
                )
            );
        }

        return 
$result;
    }
}
Онлайн: 1
Реклама