Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Database/Schema/Parser/Axmls.php
Строк: 244
<?php
namespace ConcreteCoreDatabaseSchemaParser;

class 
Axmls extends XmlParser
{

    
/**
     * Transforms the XML from Adodb XML into
     * Doctrine DBAL Schema
     */
    
public function parse(ConcreteCoreDatabaseConnectionConnection $db)
    {
        
$x $this->rawXML;
        
$schema = new DoctrineDBALSchemaSchema();
        foreach (
$x->table as $t) {

            if (
$this->ignoreExistingTables && $db->tableExists($t['name'])) {
                continue;
            }
            
$table $schema->createTable((string)$t['name']);
            foreach (
$t->field as $f) {
                
$options $this->_getColumnOptions($db$f);
                
$version = (isset($options['version']) && $options['version']) ? true false;
                unset(
$options['version']);
                
$field $table->addColumn((string)$f['name'], $this->_getColumnType($f), $options);
                if (
$version) {
                    
$field->setPlatformOption('version'true);
                }
            }
            
$this->_setPrimaryKeys($db$t$table);
            
$this->_setIndexes($db$t$table);
            
$this->_setTableOpts($db$t$table);
        }
        return 
$schema;
    }

    protected function 
_setTableOpts(
        
ConcreteCoreDatabaseConnectionConnection $db,
        
SimpleXMLElement $table,
        
$schemaTable
    
) {
        if (
$table->opt) {
            
$opt $table->opt->__toString();
            if (
$opt == 'ENGINE=MYISAM') {
                
$schemaTable->addOption('engine''MYISAM');
            }
        }
    }

    protected function 
_setPrimaryKeys(
        
ConcreteCoreDatabaseConnectionConnection $db,
        
SimpleXMLElement $table,
        
$schemaTable
    
) {
        
$primaryKeys = array();
        foreach (
$table->field as $column) {
            if (
$column->autoincrement || $column->AUTOINCREMENT || $column->key || $column->KEY) {
                
$primaryKeys[] = (string)$column['name'];
            }
        }
        if (
count($primaryKeys) > 0) {
            
$schemaTable->setPrimaryKey($primaryKeys);
        }
    }

    protected function 
_setIndexes(
        
ConcreteCoreDatabaseConnectionConnection $db,
        
SimpleXMLElement $table,
        
$schemaTable
    
) {
        foreach (
$table->index as $index) {
            
$name = (string)$index['name'];
            
$fields = array();
            
$flags = array();
            foreach (
$index->col as $col) {
                
$fields[] = $col->__toString();
            }
            if (
$index->fulltext || $index->FULLTEXT) {
                
$flags[] = 'FULLTEXT';
            }
            if (
$index->UNIQUE || $index->unique) {
                
$schemaTable->addUniqueIndex($fields$name);
            } else {
                
$schemaTable->addIndex($fields$name$flags);
            }
        }
    }

    protected function 
_getColumnOptions(ConcreteCoreDatabaseConnectionConnection $dbSimpleXMLElement $column)
    {
        
$type strtoupper((string)$column['type']);
        
$size = (string)$column['size'];
        
$options = array();
        if (
$size) {
            if (
in_array($type, array('N''F'))) {
                
$precision explode('.'$size);
                
$options['precision'] = $precision[0];
                
$options['scale'] = $precision[1];
            } else {
                
$options['length'] = $size;
            }
        }
        switch (
$type) {
            case 
'X':
                
$options['length'] = 65535// this means 'X' will result in a 'TEXT' column
                
break;
            case 
'X2':
                
// no length limitation -> this means 'X2' will result in a 'LONGTEXT' column
                
break;
        }
        if (
$column->unsigned || $column->UNSIGNED) {
            
$options['unsigned'] = true;
        }
        if (
$column->default) {
            if (isset(
$column->default['value'])) {
                
$options['default'] = (string)$column->default['value'];
            }
            if (isset(
$column->default['VALUE'])) {
                
$options['default'] = (string)$column->default['VALUE'];
            }
        }
        if (
$column->DEFAULT) {
            if (isset(
$column->DEFAULT['value'])) {
                
$options['default'] = (string)$column->DEFAULT['value'];
            }
            if (isset(
$column->DEFAULT['VALUE'])) {
                
$options['default'] = (string)$column->DEFAULT['VALUE'];
            }
        }
        if (
$column->notnull || $column->NOTNULL) {
            
$options['notnull'] = true;
        } else {
            
$options['notnull'] = false;
        }
        if (
$column->autoincrement || $column->AUTOINCREMENT) {
            
$options['autoincrement'] = true;
        }
        if (
$type == 'T' && isset($column->deftimestamp) || isset($column->DEFTIMESTAMP)) {
            
$platform $db->getDatabasePlatform();
            
$options['default'] = $platform->getCurrentTimestampSQL();
            
$options['version'] = true;
        }
        return 
$options;
    }

    protected function 
_getColumnType(SimpleXMLElement $column)
    {
        
$type strtoupper((string)$column['type']);
        
$size = (string)$column['size'];
        if (
$type == 'L') {
            return 
'boolean';
        }
        if (
$type == 'I1') {
            if (
$size != '' && $size 1) {
                return 
'smallint';
            } else {
                return 
'boolean';
            }
        }
        if (
$type == 'I2') {
            return 
'smallint';
        }
        if (
$type == 'I4') {
            return 
'integer';
        }
        if (
$type == 'I') {
            if (
$size === '1') {
                return 
'boolean';
            }
            if (
$size != '' && $size 5) {
                return 
'smallint';
            }
            return 
'integer';
        }
        if (
$type == 'I8') {
            return 
'bigint';
        }
        if (
$type == 'C') {
            return 
'string';
        }
        if (
$type == 'F') {
            return 
'float';
        }
        if (
$type == 'X') {
            return 
'text';
        }
        if (
$type == 'XL') {
            return 
'text';
        }
        if (
$type == 'C2') {
            return 
'string';
        }
        if (
$type == 'X2') {
            return 
'text';
        }
        if (
$type == 'T') {
            return 
'datetime';
        }
        if (
$type == 'TS') {
            return 
'datetime';
        }
        if (
$type == 'D') {
            return 
'date';
        }
        if (
$type == 'N') {
            return 
'decimal';
        }
        if (
$type == 'B') {
            return 
'blob';
        }

        
// This is not strict AXMLS but it will be useful for those who want to use
        // certain Doctrine type features that AXMLS doesn't support
        
if ($type == 'TIME') {
            return 
'time';
        }
    }

}
Онлайн: 3
Реклама