diff --git lib/Doctrine/DBAL/Platforms/AbstractPlatform.php lib/Doctrine/DBAL/Platforms/AbstractPlatform.php index 742832f..15ad868 100644 --- lib/Doctrine/DBAL/Platforms/AbstractPlatform.php +++ lib/Doctrine/DBAL/Platforms/AbstractPlatform.php @@ -583,6 +583,7 @@ abstract class AbstractPlatform $columnData['precision'] = $column->getPrecision(); $columnData['scale'] = $column->getScale(); $columnData['default'] = $column->getDefault(); + $columnData['columnDefinition'] = $column->getColumnDefinition(); // TODO: Fixed? Unsigned? if(in_array($column->getName(), $options['primary'])) { @@ -924,7 +925,11 @@ abstract class AbstractPlatform $check = (isset($field['check']) && $field['check']) ? ' ' . $field['check'] : ''; - $typeDecl = $field['type']->getSqlDeclaration($field, $this); + if (isset($field['columnDefinition'])) { + $typeDecl = $this->getCustomTypeDeclarationSql($field); + } else { + $typeDecl = $field['type']->getSqlDeclaration($field, $this); + } return $name . ' ' . $typeDecl . $charset . $default . $notnull . $unique . $check . $collation; } @@ -1064,6 +1069,19 @@ abstract class AbstractPlatform } /** + * getCustomTypeDeclarationSql + * Obtail SQL code portion needed to create a custom column, + * e.g. when a field has the "columnDefinition" keyword. + * Only "AUTOINCREMENT" and "PRIMARY KEY" are added if appropriate. + * + * @return string + */ + public function getCustomTypeDeclarationSql(array $columnDef) + { + return $columnDef['columnDefinition']; + } + + /** * getIndexFieldDeclarationList * Obtain DBMS specific SQL code portion needed to set an index * declaration to be used in statements like CREATE TABLE. diff --git lib/Doctrine/DBAL/Platforms/MySqlPlatform.php lib/Doctrine/DBAL/Platforms/MySqlPlatform.php index d95ecac..71032f9 100644 --- lib/Doctrine/DBAL/Platforms/MySqlPlatform.php +++ lib/Doctrine/DBAL/Platforms/MySqlPlatform.php @@ -683,6 +683,17 @@ class MySqlPlatform extends AbstractPlatform return $unsigned . $autoinc; } + /** @override */ + public function getCustomTypeDeclarationSql(array $columnDef) + { + $autoinc = ''; + if ( ! empty($columnDef['autoincrement'])) { + $autoinc = ' AUTO_INCREMENT'; + } + + return $columnDef['columnDefinition'] . $autoinc; + } + /** * Obtain DBMS specific SQL code portion needed to set an index * declaration to be used in statements like CREATE TABLE. diff --git lib/Doctrine/DBAL/Platforms/SqlitePlatform.php lib/Doctrine/DBAL/Platforms/SqlitePlatform.php index a5c35fb..e5cb89f 100644 --- lib/Doctrine/DBAL/Platforms/SqlitePlatform.php +++ lib/Doctrine/DBAL/Platforms/SqlitePlatform.php @@ -284,6 +284,17 @@ class SqlitePlatform extends AbstractPlatform return 'INTEGER' . $pk . $autoinc; } + /** + * @override + */ + public function getCustomTypeDeclarationSql(array $columnDef) + { + $autoinc = ! empty($columnDef['autoincrement']) ? ' AUTOINCREMENT' : ''; + $pk = ! empty($columnDef['primary']) && ! empty($autoinc) ? ' PRIMARY KEY' : ''; + + return $columnDef['columnDefinition'] . $pk . $autoinc; + } + /** * create a new table * diff --git lib/Doctrine/DBAL/Schema/Column.php lib/Doctrine/DBAL/Schema/Column.php index 23d44e9..3b44688 100644 --- lib/Doctrine/DBAL/Schema/Column.php +++ lib/Doctrine/DBAL/Schema/Column.php @@ -81,6 +81,11 @@ class Column extends AbstractAsset protected $_platformOptions = array(); /** + * @var string + */ + protected $_columnDefinition = null; + + /** * Create a new Column * * @param string $columnName @@ -226,6 +231,17 @@ class Column extends AbstractAsset return $this; } + /** + * + * @param string + * @return Column + */ + public function setColumnDefinition($value) + { + $this->_columnDefinition = $value; + return $this; + } + public function getType() { return $this->_type; @@ -281,6 +297,11 @@ class Column extends AbstractAsset return $this->_platformOptions[$name]; } + public function getColumnDefinition() + { + return $this->_columnDefinition; + } + /** * @param Visitor $visitor */ @@ -304,6 +325,7 @@ class Column extends AbstractAsset 'scale' => $this->_scale, 'fixed' => $this->_fixed, 'unsigned' => $this->_unsigned, + 'columnDefinition' => $this->_columnDefinition, ), $this->_platformOptions); } } \ No newline at end of file diff --git lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php index 74bf53b..163bc08 100644 --- lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php +++ lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php @@ -196,6 +196,10 @@ class AnnotationDriver implements Driver $mapping['columnName'] = $columnAnnot->name; } + if (isset($columnAnnot->columnDefinition)) { + $mapping['columnDefinition'] = $columnAnnot->columnDefinition; + } + if ($idAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\Id')) { $mapping['id'] = true; } diff --git lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php index e6a2f32..3d0ae89 100644 --- lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php +++ lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php @@ -63,6 +63,7 @@ final class Column extends Annotation { public $default; //TODO: remove? public $name; public $options = array(); + public $columnDefinition; } final class OneToOne extends Annotation { public $targetEntity; diff --git lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php index ba64abf..3c2e9f9 100644 --- lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php +++ lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php @@ -154,6 +154,10 @@ class XmlDriver extends AbstractFileDriver $metadata->setVersionMapping($mapping); } + if (isset($fieldMapping['columnDefinition'])) { + $mapping['columnDefinition'] = (string)$fieldMapping['columnDefinition']; + } + $metadata->mapField($mapping); } } diff --git lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php index 822bf7b..2e8f949 100644 --- lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php +++ lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php @@ -195,6 +195,9 @@ class YamlDriver extends AbstractFileDriver if (isset($fieldMapping['version']) && $fieldMapping['version']) { $metadata->setVersionMapping($mapping); } + if (isset($fieldMapping['columnDefinition'])) { + $mapping['columnDefinition'] = $fieldMapping['columnDefinition']; + } $metadata->mapField($mapping); } diff --git lib/Doctrine/ORM/Tools/SchemaTool.php lib/Doctrine/ORM/Tools/SchemaTool.php index 6889659..d8e1087 100644 --- lib/Doctrine/ORM/Tools/SchemaTool.php +++ lib/Doctrine/ORM/Tools/SchemaTool.php @@ -305,6 +305,10 @@ class SchemaTool if (isset($mapping['default'])) { $options['default'] = $mapping['default']; } + + if (isset($mapping['columnDefinition'])) { + $options['columnDefinition'] = $mapping['columnDefinition']; + } if ($table->hasColumn($columnName)) { // required in some inheritence scenarios diff --git tests/Doctrine/Tests/DBAL/Platforms/AbstractPlatformTestCase.php tests/Doctrine/Tests/DBAL/Platforms/AbstractPlatformTestCase.php index 3d2fe59..75de9d9 100644 --- tests/Doctrine/Tests/DBAL/Platforms/AbstractPlatformTestCase.php +++ tests/Doctrine/Tests/DBAL/Platforms/AbstractPlatformTestCase.php @@ -112,4 +112,22 @@ abstract class AbstractPlatformTestCase extends \Doctrine\Tests\DbalTestCase $this->assertEquals($expectedSql, $sql); } + + public function testGeneratesCustomTypeDeclaration() + { + $this->assertEquals( + 'Foo', + $this->_platform->getCustomTypeDeclarationSql(array('columnDefinition' => 'Foo') + )); + $this->assertEquals( + 'Foo', + $this->_platform->getCustomTypeDeclarationSql( + array('columnDefinition' => 'Foo', 'autoincrement' => true) + )); + $this->assertEquals( + 'Foo', + $this->_platform->getCustomTypeDeclarationSql( + array('columnDefinition' => 'Foo', 'autoincrement' => true, 'primary' => true) + )); + } } diff --git tests/Doctrine/Tests/DBAL/Platforms/MySqlPlatformTest.php tests/Doctrine/Tests/DBAL/Platforms/MySqlPlatformTest.php index a36a479..e436fb5 100644 --- tests/Doctrine/Tests/DBAL/Platforms/MySqlPlatformTest.php +++ tests/Doctrine/Tests/DBAL/Platforms/MySqlPlatformTest.php @@ -109,6 +109,24 @@ class MySqlPlatformTest extends AbstractPlatformTestCase 'Long string declaration is not correct' ); } + + public function testGeneratesCustomTypeDeclaration() + { + $this->assertEquals( + 'Foo', + $this->_platform->getCustomTypeDeclarationSql(array('columnDefinition' => 'Foo') + )); + $this->assertEquals( + 'Foo AUTO_INCREMENT', + $this->_platform->getCustomTypeDeclarationSql( + array('columnDefinition' => 'Foo', 'autoincrement' => true) + )); + $this->assertEquals( + 'Foo AUTO_INCREMENT', + $this->_platform->getCustomTypeDeclarationSql( + array('columnDefinition' => 'Foo', 'autoincrement' => true, 'primary' => true) + )); + } public function testPrefersIdentityColumns() { diff --git tests/Doctrine/Tests/DBAL/Platforms/OraclePlatformTest.php tests/Doctrine/Tests/DBAL/Platforms/OraclePlatformTest.php index f059750..61a0f71 100644 --- tests/Doctrine/Tests/DBAL/Platforms/OraclePlatformTest.php +++ tests/Doctrine/Tests/DBAL/Platforms/OraclePlatformTest.php @@ -134,6 +134,24 @@ class OraclePlatformTest extends AbstractPlatformTestCase ); } + public function testGeneratesCustomTypeDeclaration() + { + $this->assertEquals( + 'Foo', + $this->_platform->getCustomTypeDeclarationSql(array('columnDefinition' => 'Foo') + )); + $this->assertEquals( + 'Foo', + $this->_platform->getCustomTypeDeclarationSql( + array('columnDefinition' => 'Foo', 'autoincrement' => true) + )); + $this->assertEquals( + 'Foo', + $this->_platform->getCustomTypeDeclarationSql( + array('columnDefinition' => 'Foo', 'autoincrement' => true, 'primary' => true) + )); + } + public function testPrefersIdentityColumns() { $this->assertFalse($this->_platform->prefersIdentityColumns()); diff --git tests/Doctrine/Tests/DBAL/Platforms/SqlitePlatformTest.php tests/Doctrine/Tests/DBAL/Platforms/SqlitePlatformTest.php index 04f52ea..dc423d9 100644 --- tests/Doctrine/Tests/DBAL/Platforms/SqlitePlatformTest.php +++ tests/Doctrine/Tests/DBAL/Platforms/SqlitePlatformTest.php @@ -74,6 +74,24 @@ class SqlitePlatformTest extends AbstractPlatformTestCase 'Long string declaration is not correct' ); } + + public function testGeneratesCustomTypeDeclaration() + { + $this->assertEquals( + 'Foo', + $this->_platform->getCustomTypeDeclarationSql(array('columnDefinition' => 'Foo') + )); + $this->assertEquals( + 'Foo AUTOINCREMENT', + $this->_platform->getCustomTypeDeclarationSql( + array('columnDefinition' => 'Foo', 'autoincrement' => true) + )); + $this->assertEquals( + 'Foo PRIMARY KEY AUTOINCREMENT', + $this->_platform->getCustomTypeDeclarationSql( + array('columnDefinition' => 'Foo', 'autoincrement' => true, 'primary' => true) + )); + } public function getGenerateIndexSql() { diff --git tests/Doctrine/Tests/DBAL/Schema/ColumnTest.php tests/Doctrine/Tests/DBAL/Schema/ColumnTest.php index 931dace..354e034 100644 --- tests/Doctrine/Tests/DBAL/Schema/ColumnTest.php +++ tests/Doctrine/Tests/DBAL/Schema/ColumnTest.php @@ -44,6 +44,7 @@ class ColumnTest extends \PHPUnit_Framework_TestCase 'scale' => 2, 'fixed' => true, 'unsigned' => true, + 'columnDefinition' => 'Foo', 'foo' => 'bar', ); @@ -63,6 +64,7 @@ class ColumnTest extends \PHPUnit_Framework_TestCase 'notnull' => false, 'fixed' => true, 'default' => 'baz', + 'columnDefinition' => 'Foo', 'platformOptions' => array('foo' => 'bar'), );