From 2a8858e928b9c447921a2860d8f4f904dc55126d Mon Sep 17 00:00:00 2001 From: mark_story Date: Thu, 29 Oct 2009 01:36:15 -0400 Subject: [PATCH 1/5] Adding tests to DboSqlite::buildColumn Adding collate field parameter to DboSqlite. Removing duplicated code from DboSource, adding parent call instead. --- .../libs/model/datasources/dbo/dbo_sqlite.php | 37 ++++-------- .../model/datasources/dbo/dbo_sqlite.test.php | 60 +++++++++++++++++++ 2 files changed, 71 insertions(+), 26 deletions(-) diff --git a/cake/libs/model/datasources/dbo/dbo_sqlite.php b/cake/libs/model/datasources/dbo/dbo_sqlite.php index aa6311be3..d106dac34 100644 --- a/cake/libs/model/datasources/dbo/dbo_sqlite.php +++ b/cake/libs/model/datasources/dbo/dbo_sqlite.php @@ -107,6 +107,16 @@ class DboSqlite extends DboSource { 'boolean' => array('name' => 'boolean') ); +/** + * List of engine specific additional field parameters used on table creating + * + * @var array + * @access public + */ + var $fieldParameters = array( + 'collate' => array('value' => 'COLLATE', 'quote' => false, 'join' => ' ', 'column' => 'Collate', 'position' => 'afterDefault'), + ); + /** * Connects to the database using config['database'] as a filename. * @@ -481,32 +491,7 @@ class DboSqlite extends DboSource { if (isset($column['key']) && $column['key'] == 'primary' && $type == 'integer') { return $this->name($name) . ' ' . $this->columns['primary_key']['name']; } - if (isset($real['limit']) || isset($real['length']) || isset($column['limit']) || isset($column['length'])) { - if (isset($column['length'])) { - $length = $column['length']; - } elseif (isset($column['limit'])) { - $length = $column['limit']; - } elseif (isset($real['length'])) { - $length = $real['length']; - } else { - $length = $real['limit']; - } - $out .= '(' . $length . ')'; - } - if (isset($column['key']) && $column['key'] == 'primary' && $type == 'integer') { - $out .= ' ' . $this->columns['primary_key']['name']; - } elseif (isset($column['key']) && $column['key'] == 'primary') { - $out .= ' NOT NULL'; - } elseif (isset($column['default']) && isset($column['null']) && $column['null'] == false) { - $out .= ' DEFAULT ' . $this->value($column['default'], $type) . ' NOT NULL'; - } elseif (isset($column['default'])) { - $out .= ' DEFAULT ' . $this->value($column['default'], $type); - } elseif (isset($column['null']) && $column['null'] == true) { - $out .= ' DEFAULT NULL'; - } elseif (isset($column['null']) && $column['null'] == false) { - $out .= ' NOT NULL'; - } - return $out; + return parent::buildColumn($column); } /** diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php index 75acb73e6..34648b420 100644 --- a/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php +++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php @@ -222,6 +222,66 @@ class DboSqliteTest extends CakeTestCase { Configure::write('Cache.disable', true); } +/** + * test building columns with SQLite + * + * @return void + **/ + function testBuildColumn() { + $data = array( + 'name' => 'int_field', + 'type' => 'integer', + 'null' => false, + ); + $result = $this->db->buildColumn($data); + $expected = '"int_field" integer(11) NOT NULL'; + $this->assertEqual($result, $expected); + + $data = array( + 'name' => 'name', + 'type' => 'string', + 'length' => 20, + 'null' => false, + ); + $result = $this->db->buildColumn($data); + $expected = '"name" varchar(20) NOT NULL'; + $this->assertEqual($result, $expected); + + $data = array( + 'name' => 'testName', + 'type' => 'string', + 'length' => 20, + 'default' => null, + 'null' => true, + 'collate' => 'NOCASE' + ); + $result = $this->db->buildColumn($data); + $expected = '"testName" varchar(20) DEFAULT NULL COLLATE NOCASE'; + $this->assertEqual($result, $expected); + + $data = array( + 'name' => 'testName', + 'type' => 'string', + 'length' => 20, + 'default' => 'test-value', + 'null' => false, + ); + $result = $this->db->buildColumn($data); + $expected = '"testName" varchar(20) DEFAULT \'test-value\' NOT NULL'; + $this->assertEqual($result, $expected); + + $data = array( + 'name' => 'testName', + 'type' => 'integer', + 'length' => 10, + 'default' => 10, + 'null' => false, + ); + $result = $this->db->buildColumn($data); + $expected = '"testName" integer(10) DEFAULT \'10\' NOT NULL'; + $this->assertEqual($result, $expected); + } + /** * test describe() and normal results. * From f299283dc4915646339718e74ff6b3d84abdad3a Mon Sep 17 00:00:00 2001 From: mark_story Date: Thu, 29 Oct 2009 01:47:25 -0400 Subject: [PATCH 2/5] Refactoring duplicated code into a method. --- cake/libs/model/datasources/dbo_source.php | 32 ++++++++++++---------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/cake/libs/model/datasources/dbo_source.php b/cake/libs/model/datasources/dbo_source.php index 141364da8..d956c4a51 100644 --- a/cake/libs/model/datasources/dbo_source.php +++ b/cake/libs/model/datasources/dbo_source.php @@ -2459,16 +2459,7 @@ class DboSource extends DataSource { if (($column['type'] == 'integer' || $column['type'] == 'float' ) && isset($column['default']) && $column['default'] === '') { $column['default'] = null; } - - foreach ($this->fieldParameters as $paramName => $value) { - if (isset($column[$paramName]) && $value['position'] == 'beforeDefault') { - $val = $column[$paramName]; - if ($value['quote']) { - $val = $this->value($val); - } - $out .= ' ' . $value['value'] . $value['join'] . $val; - } - } + $out = $this->_buildFieldParameters($out, $column, 'beforeDefault'); if (isset($column['key']) && $column['key'] == 'primary' && $type == 'integer') { $out .= ' ' . $this->columns['primary_key']['name']; @@ -2483,18 +2474,29 @@ class DboSource extends DataSource { } elseif (isset($column['null']) && $column['null'] == false) { $out .= ' NOT NULL'; } + $out = $this->_buildFieldParameters($out, $column, 'afterDefault'); + return $out; + } +/** + * Build the field parameters, in a position + * + * @param string $columnString The partially built column string + * @param array $columnData The array of column data. + * @param string $position The position type to use. 'beforeDefault' or 'afterDefault' are common + * @return string a built column with the field parameters added. + **/ + function _buildFieldParameters($columnString, $columnData, $position) { foreach ($this->fieldParameters as $paramName => $value) { - if (isset($column[$paramName]) && $value['position'] == 'afterDefault') { - $val = $column[$paramName]; + if (isset($columnData[$paramName]) && $value['position'] == $position) { + $val = $columnData[$paramName]; if ($value['quote']) { $val = $this->value($val); } - $out .= ' ' . $value['value'] . $value['join'] . $val; + $columnString .= ' ' . $value['value'] . $value['join'] . $val; } } - - return $out; + return $columnString; } /** From a33457155f81899c9aef0ddf1d979f903cf614c5 Mon Sep 17 00:00:00 2001 From: mark_story Date: Thu, 29 Oct 2009 02:03:21 -0400 Subject: [PATCH 3/5] Adding valid option checking to fieldParameters. Test case added. --- cake/libs/model/datasources/dbo_source.php | 3 ++ .../model/datasources/dbo_source.test.php | 32 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/cake/libs/model/datasources/dbo_source.php b/cake/libs/model/datasources/dbo_source.php index d956c4a51..5f2ac8de8 100644 --- a/cake/libs/model/datasources/dbo_source.php +++ b/cake/libs/model/datasources/dbo_source.php @@ -2489,6 +2489,9 @@ class DboSource extends DataSource { function _buildFieldParameters($columnString, $columnData, $position) { foreach ($this->fieldParameters as $paramName => $value) { if (isset($columnData[$paramName]) && $value['position'] == $position) { + if (isset($value['options']) && !in_array($columnData[$paramName], $value['options'])) { + continue; + } $val = $columnData[$paramName]; if ($value['quote']) { $val = $this->value($val); diff --git a/cake/tests/cases/libs/model/datasources/dbo_source.test.php b/cake/tests/cases/libs/model/datasources/dbo_source.test.php index fa98837ae..801bbb7bf 100644 --- a/cake/tests/cases/libs/model/datasources/dbo_source.test.php +++ b/cake/tests/cases/libs/model/datasources/dbo_source.test.php @@ -3612,7 +3612,37 @@ class DboSourceTest extends CakeTestCase { $this->testDb->columns = array('integer' => array('name' => 'int', 'limit' => '11', 'formatter' => 'intval'), ); $result = $this->testDb->buildColumn($data); $expected = '`int_field` int(11) NOT NULL'; - $this->assertTrue($result, $expected); + $this->assertEqual($result, $expected); + + $this->testDb->fieldParameters['param'] = array( + 'value' => 'COLLATE', + 'quote' => false, + 'join' => ' ', + 'column' => 'Collate', + 'position' => 'beforeDefault', + 'options' => array('GOOD', 'OK') + ); + $data = array( + 'name' => 'int_field', + 'type' => 'integer', + 'default' => '', + 'null' => false, + 'param' => 'BAD' + ); + $result = $this->testDb->buildColumn($data); + $expected = '`int_field` int(11) NOT NULL'; + $this->assertEqual($result, $expected); + + $data = array( + 'name' => 'int_field', + 'type' => 'integer', + 'default' => '', + 'null' => false, + 'param' => 'GOOD' + ); + $result = $this->testDb->buildColumn($data); + $expected = '`int_field` int(11) COLLATE GOOD NOT NULL'; + $this->assertEqual($result, $expected); } /** From 23831546b5da31ff21bb1d0c121d0098db7511f2 Mon Sep 17 00:00:00 2001 From: mark_story Date: Thu, 29 Oct 2009 02:03:50 -0400 Subject: [PATCH 4/5] Adding valid options for sqlite collation. Tests added. --- cake/libs/model/datasources/dbo/dbo_sqlite.php | 11 ++++++++++- .../libs/model/datasources/dbo/dbo_sqlite.test.php | 12 ++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/cake/libs/model/datasources/dbo/dbo_sqlite.php b/cake/libs/model/datasources/dbo/dbo_sqlite.php index d106dac34..215542628 100644 --- a/cake/libs/model/datasources/dbo/dbo_sqlite.php +++ b/cake/libs/model/datasources/dbo/dbo_sqlite.php @@ -114,7 +114,16 @@ class DboSqlite extends DboSource { * @access public */ var $fieldParameters = array( - 'collate' => array('value' => 'COLLATE', 'quote' => false, 'join' => ' ', 'column' => 'Collate', 'position' => 'afterDefault'), + 'collate' => array( + 'value' => 'COLLATE', + 'quote' => false, + 'join' => ' ', + 'column' => 'Collate', + 'position' => 'afterDefault', + 'options' => array( + 'BINARY', 'NOCASE', 'RTRIM' + ) + ), ); /** diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php index 34648b420..51ede159b 100644 --- a/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php +++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_sqlite.test.php @@ -280,6 +280,18 @@ class DboSqliteTest extends CakeTestCase { $result = $this->db->buildColumn($data); $expected = '"testName" integer(10) DEFAULT \'10\' NOT NULL'; $this->assertEqual($result, $expected); + + $data = array( + 'name' => 'testName', + 'type' => 'integer', + 'length' => 10, + 'default' => 10, + 'null' => false, + 'collate' => 'BADVALUE' + ); + $result = $this->db->buildColumn($data); + $expected = '"testName" integer(10) DEFAULT \'10\' NOT NULL'; + $this->assertEqual($result, $expected); } /** From aa03756238ec45b47cce5163bf7bb84bf131b623 Mon Sep 17 00:00:00 2001 From: mark_story Date: Thu, 29 Oct 2009 09:26:23 -0400 Subject: [PATCH 5/5] Updating tests to expand coverage of buildcolumn. --- .../cases/libs/model/datasources/dbo_source.test.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cake/tests/cases/libs/model/datasources/dbo_source.test.php b/cake/tests/cases/libs/model/datasources/dbo_source.test.php index 801bbb7bf..c35a8314a 100644 --- a/cake/tests/cases/libs/model/datasources/dbo_source.test.php +++ b/cake/tests/cases/libs/model/datasources/dbo_source.test.php @@ -3591,16 +3591,16 @@ class DboSourceTest extends CakeTestCase { ); $this->testDb->buildColumn($data); - $this->testDb->columns = array('varchar(255)' => 1); $data = array( 'name' => 'testName', - 'type' => 'varchar(255)', + 'type' => 'string', + 'length' => 255, 'default', 'null' => true, 'key' ); $result = $this->testDb->buildColumn($data); - $expected = '`testName` DEFAULT NULL'; + $expected = '`testName` varchar(255) DEFAULT NULL'; $this->assertEqual($result, $expected); $data = array( @@ -3653,11 +3653,11 @@ class DboSourceTest extends CakeTestCase { function testHasAny() { $this->testDb->hasAny($this->Model, array()); $expected = 'SELECT COUNT(`TestModel`.`id`) AS count FROM `test_models` AS `TestModel` WHERE 1 = 1'; - $this->assertEqual($this->testDb->simulated[1], $expected); + $this->assertEqual(end($this->testDb->simulated), $expected); $this->testDb->hasAny($this->Model, array('TestModel.name' => 'harry')); $expected = "SELECT COUNT(`TestModel`.`id`) AS count FROM `test_models` AS `TestModel` WHERE `TestModel`.`name` = 'harry'"; - $this->assertEqual($this->testDb->simulated[2], $expected); + $this->assertEqual(end($this->testDb->simulated), $expected); } /**