diff --git a/lib/Cake/Model/CakeSchema.php b/lib/Cake/Model/CakeSchema.php index 3d11b3641..f2cb4e73d 100644 --- a/lib/Cake/Model/CakeSchema.php +++ b/lib/Cake/Model/CakeSchema.php @@ -420,6 +420,7 @@ class CakeSchema extends CakeObject { $type = $value; $value = array('type' => $type); } + $value['type'] = addslashes($value['type']); $col = "\t\t'{$field}' => array('type' => '" . $value['type'] . "', "; unset($value['type']); $col .= implode(', ', $this->_values($value)); @@ -624,17 +625,19 @@ class CakeSchema extends CakeObject { if ($Obj->primaryKey === $name && !$hasPrimaryAlready && !isset($value['key'])) { $value['key'] = 'primary'; } - if (!isset($db->columns[$value['type']])) { - trigger_error(__d('cake_dev', 'Schema generation error: invalid column type %s for %s.%s does not exist in DBO', $value['type'], $Obj->name, $name), E_USER_NOTICE); - continue; - } else { - $defaultCol = $db->columns[$value['type']]; - if (isset($defaultCol['limit']) && $defaultCol['limit'] == $value['length']) { - unset($value['length']); - } elseif (isset($defaultCol['length']) && $defaultCol['length'] == $value['length']) { - unset($value['length']); + if (substr($value['type'], 0, 4) !== 'enum') { + if (!isset($db->columns[$value['type']])) { + trigger_error(__d('cake_dev', 'Schema generation error: invalid column type %s for %s.%s does not exist in DBO', $value['type'], $Obj->name, $name), E_USER_NOTICE); + continue; + } else { + $defaultCol = $db->columns[$value['type']]; + if (isset($defaultCol['limit']) && $defaultCol['limit'] == $value['length']) { + unset($value['length']); + } elseif (isset($defaultCol['length']) && $defaultCol['length'] == $value['length']) { + unset($value['length']); + } + unset($value['limit']); } - unset($value['limit']); } if (isset($value['default']) && ($value['default'] === '' || ($value['default'] === false && $value['type'] !== 'boolean'))) { diff --git a/lib/Cake/Model/Datasource/Database/Mysql.php b/lib/Cake/Model/Datasource/Database/Mysql.php index e2b164492..682c742f1 100644 --- a/lib/Cake/Model/Datasource/Database/Mysql.php +++ b/lib/Cake/Model/Datasource/Database/Mysql.php @@ -120,6 +120,7 @@ class Mysql extends DboSource { 'primary_key' => array('name' => 'NOT NULL AUTO_INCREMENT'), 'string' => array('name' => 'varchar', 'limit' => '255'), 'text' => array('name' => 'text'), + 'enum' => array('name' => 'enum'), 'biginteger' => array('name' => 'bigint', 'limit' => '20'), 'integer' => array('name' => 'int', 'limit' => '11', 'formatter' => 'intval'), 'smallinteger' => array('name' => 'smallint', 'limit' => '6', 'formatter' => 'intval'), diff --git a/lib/Cake/Model/Datasource/DboSource.php b/lib/Cake/Model/Datasource/DboSource.php index aed75f382..ebfab0a97 100644 --- a/lib/Cake/Model/Datasource/DboSource.php +++ b/lib/Cake/Model/Datasource/DboSource.php @@ -3282,18 +3282,7 @@ class DboSource extends DataSource { return (int)$length; } if (in_array($type, array('enum', 'set'))) { - $values = array_map(function ($value) { - return trim(trim($value), '\'"'); - }, explode(',', $length)); - - $maxLength = 0; - foreach ($values as $key => $enumValue) { - $tmpLength = strlen($enumValue); - if ($tmpLength > $maxLength) { - $maxLength = $tmpLength; - } - } - return $maxLength; + return null; } return (int)$length; } @@ -3511,25 +3500,28 @@ class DboSource extends DataSource { return null; } - if (!isset($this->columns[$type])) { + if (!isset($this->columns[$type]) && substr($type, 0, 4) !== 'enum') { trigger_error(__d('cake_dev', 'Column type %s does not exist', $type), E_USER_WARNING); return null; } - $real = $this->columns[$type]; - $out = $this->name($name) . ' ' . $real['name']; - - if (isset($column['length'])) { - $length = $column['length']; - } elseif (isset($column['limit'])) { - $length = $column['limit']; - } elseif (isset($real['length'])) { - $length = $real['length']; - } elseif (isset($real['limit'])) { - $length = $real['limit']; - } - if (isset($length)) { - $out .= '(' . $length . ')'; + if (substr($type, 0, 4) === 'enum') { + $out = $this->name($name) . ' ' . $type; + } else { + $real = $this->columns[$type]; + $out = $this->name($name) . ' ' . $real['name']; + if (isset($column['length'])) { + $length = $column['length']; + } elseif (isset($column['limit'])) { + $length = $column['limit']; + } elseif (isset($real['length'])) { + $length = $real['length']; + } elseif (isset($real['limit'])) { + $length = $real['limit']; + } + if (isset($length)) { + $out .= '(' . $length . ')'; + } } if (($column['type'] === 'integer' || $column['type'] === 'float') && isset($column['default']) && $column['default'] === '') { diff --git a/lib/Cake/Test/Case/Model/CakeSchemaTest.php b/lib/Cake/Test/Case/Model/CakeSchemaTest.php index c7c8deab1..bdcaf2440 100644 --- a/lib/Cake/Test/Case/Model/CakeSchemaTest.php +++ b/lib/Cake/Test/Case/Model/CakeSchemaTest.php @@ -64,6 +64,13 @@ class MyAppSchema extends CakeSchema { 'published' => array('type' => 'string', 'null' => true, 'default' => 'Y', 'length' => 1), 'created' => array('type' => 'datetime', 'null' => true, 'default' => null), 'updated' => array('type' => 'datetime', 'null' => true, 'default' => null), + 'status' => array( + 'type' => 'enum(\'active\',\'deleted\')', + 'null' => false, + 'default' => 'active', + 'collate' => 'utf8_unicode_ci', + 'charset' => 'utf8', + ), 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => true)), ); @@ -809,6 +816,14 @@ class CakeSchemaTest extends CakeTestCase { 'posts' => array( 'add' => array( 'summary' => array('type' => 'text', 'null' => true, 'after' => 'body'), + 'status' => array( + 'type' => 'enum(\'active\',\'deleted\')', + 'null' => false, + 'default' => 'active', + 'collate' => 'utf8_unicode_ci', + 'charset' => 'utf8', + 'after' => 'updated', + ), ), 'drop' => array( 'tableParameters' => array(), diff --git a/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php b/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php index fe7f3e0db..cc2cce668 100644 --- a/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php +++ b/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php @@ -3080,14 +3080,6 @@ SQL; $expected = '5,2'; $this->assertSame($expected, $result); - $result = $this->Dbo->length("enum('test','me','now')"); - $expected = 4; - $this->assertSame($expected, $result); - - $result = $this->Dbo->length("set('a','b','cd')"); - $expected = 2; - $this->assertSame($expected, $result); - $result = $this->Dbo->length(false); $this->assertNull($result); @@ -3100,6 +3092,26 @@ SQL; $this->assertSame($expected, $result); } +/** + * Tests the length of enum column. + * + * @return void + */ + public function testLengthEnum() { + $result = $this->Dbo->length("enum('test','me','now')"); + $this->assertNull($result); + } + +/** + * Tests the length of set column. + * + * @return void + */ + public function testLengthSet() { + $result = $this->Dbo->length("set('a','b','cd')"); + $this->assertNull($result); + } + /** * testBuildIndex method * diff --git a/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php b/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php index 2d206d5bf..c8df92dc3 100644 --- a/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php +++ b/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php @@ -2177,12 +2177,19 @@ class DboSourceTest extends CakeTestCase { $result = $this->db->length('decimal(20,3)'); $this->assertEquals('20,3', $result); + } +/** + * Test length parsing of enum column. + * + * @return void + */ + public function testLengthEnum() { $result = $this->db->length('enum("one", "longer")'); - $this->assertEquals(6, $result); + $this->assertNull($result); $result = $this->db->length("enum('One Value','ANOTHER ... VALUE ...')"); - $this->assertEquals(21, $result); + $this->assertNull($result); } /**