diff --git a/cake/libs/model/datasources/dbo/dbo_mssql.php b/cake/libs/model/datasources/dbo/dbo_mssql.php index 766b70be1..4e5fb73ce 100644 --- a/cake/libs/model/datasources/dbo/dbo_mssql.php +++ b/cake/libs/model/datasources/dbo/dbo_mssql.php @@ -211,9 +211,10 @@ class DboMssql extends DboSource { return $cache; } - $fields = false; - $cols = $this->fetchAll("SELECT COLUMN_NAME as Field, DATA_TYPE as Type, COL_LENGTH('" . $this->fullTableName($model, false) . "', COLUMN_NAME) as Length, IS_NULLABLE As [Null], COLUMN_DEFAULT as [Default], COLUMNPROPERTY(OBJECT_ID('" . $this->fullTableName($model, false) . "'), COLUMN_NAME, 'IsIdentity') as [Key], NUMERIC_SCALE as Size FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" . $this->fullTableName($model, false) . "'", false); + $table = $this->fullTableName($model, false); + $cols = $this->fetchAll("SELECT COLUMN_NAME as Field, DATA_TYPE as Type, COL_LENGTH('" . $table . "', COLUMN_NAME) as Length, IS_NULLABLE As [Null], COLUMN_DEFAULT as [Default], COLUMNPROPERTY(OBJECT_ID('" . $table . "'), COLUMN_NAME, 'IsIdentity') as [Key], NUMERIC_SCALE as Size FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" . $table . "'", false); + $fields = false; foreach ($cols as $column) { $field = $column[0]['Field']; $fields[$field] = array( @@ -659,23 +660,11 @@ class DboMssql extends DboSource { * Generate a database-native column schema string * * @param array $column An array structured like the following: array('name'=>'value', 'type'=>'value'[, options]), - * where options can be 'default', 'length', or 'key'. + * where options can be 'default', 'length', or 'key'. * @return string */ function buildColumn($column) { - $result = preg_replace('/(int|integer)\([0-9]+\)/i', '$1', parent::buildColumn($column)); - $null = ( - (isset($column['null']) && $column['null'] == true) || - (array_key_exists('default', $column) && $column['default'] === null) || - (array_keys($column) == array('type', 'name')) - ); - $primaryKey = (isset($column['key']) && $column['key'] == 'primary'); - $stringKey = ($primaryKey && $column['type'] != 'integer'); - - if ($null && !$primaryKey) { - $result .= " NULL"; - } - return $result; + return preg_replace('/(int|integer)\([0-9]+\)/i', '$1', parent::buildColumn($column)); } /** * Format indexes for create table @@ -723,7 +712,6 @@ class DboMssql extends DboSource { return $field; } } - return null; } } diff --git a/cake/tests/cases/libs/cake_test_fixture.test.php b/cake/tests/cases/libs/cake_test_fixture.test.php index 03a712a56..d5844bc6c 100644 --- a/cake/tests/cases/libs/cake_test_fixture.test.php +++ b/cake/tests/cases/libs/cake_test_fixture.test.php @@ -60,9 +60,9 @@ class CakeTestFixtureTestFixture extends CakeTestFixture { * @var array */ var $records = array( - array('name' => 'Gandalf'), - array('name' => 'Captain Picard'), - array('name' => 'Chewbacca') + array('name' => 'Gandalf', 'created' => '2009-04-28 19:20:00'), + array('name' => 'Captain Picard', 'created' => '2009-04-28 19:20:00'), + array('name' => 'Chewbacca', 'created' => '2009-04-28 19:20:00') ); } /** diff --git a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php index 1cd3268fa..bd6060b8a 100644 --- a/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php +++ b/cake/tests/cases/libs/model/datasources/dbo/dbo_mssql.test.php @@ -43,6 +43,13 @@ class DboMssqlTestDb extends DboMssql { * @access public */ var $simulated = array(); +/** + * simalate property + * + * @var array + * @access public + */ + var $simulate = true; /** * fetchAllResultsStack * @@ -58,8 +65,12 @@ class DboMssqlTestDb extends DboMssql { * @return void */ function _execute($sql) { - $this->simulated[] = $sql; - return null; + if ($this->simulate) { + $this->simulated[] = $sql; + return null; + } else { + return parent::_execute($sql); + } } /** * fetchAll method @@ -203,6 +214,20 @@ class DboMssqlTest extends CakeTestCase { * @access public */ var $db = null; +/** + * autoFixtures property + * + * @var bool false + * @access public + */ + var $autoFixtures = false; +/** + * fixtures property + * + * @var array + * @access public + */ + var $fixtures = array('core.category'); /** * Skip if cannot connect to mssql * @@ -212,6 +237,26 @@ class DboMssqlTest extends CakeTestCase { $this->_initDb(); $this->skipUnless($this->db->config['driver'] == 'mssql', '%s SQL Server connection not available'); } +/** + * Make sure all fixtures tables are being created + * + * @access public + */ + function start() { + $this->db->simulate = false; + parent::start(); + $this->db->simulate = true; + } +/** + * Make sure all fixtures tables are being dropped + * + * @access public + */ + function end() { + $this->db->simulate = false; + parent::end(); + $this->db->simulate = true; + } /** * Sets up a Dbo class instance for testing * @@ -330,6 +375,59 @@ class DboMssqlTest extends CakeTestCase { ); $this->assertEqual($result, $expected); } +/** + * testBuildColumn + * + * @return unknown_type + * @access public + */ + function testBuildColumn() { + $column = array('name' => 'id', 'type' => 'integer', 'null' => '', 'default' => '', 'length' => '8', 'key' => 'primary'); + $result = $this->db->buildColumn($column); + $expected = '[id] int IDENTITY (1, 1) NOT NULL'; + $this->assertEqual($result, $expected); + + $column = array('name' => 'client_id', 'type' => 'integer', 'null' => '', 'default' => '0', 'length' => '11'); + $result = $this->db->buildColumn($column); + $expected = '[client_id] int DEFAULT 0 NOT NULL'; + $this->assertEqual($result, $expected); + + // 'name' => 'type' format + $column = array('name' => 'client_id', 'type' => 'integer'); + $result = $this->db->buildColumn($column); + $expected = '[client_id] int'; + $this->assertEqual($result, $expected); + + $column = array('name' => 'client_id', 'type' => 'integer', 'null' => true); + $result = $this->db->buildColumn($column); + $expected = '[client_id] int DEFAULT NULL'; + $this->assertEqual($result, $expected); + + $column = array('name' => 'name', 'type' => 'string', 'null' => '', 'default' => '', 'length' => '255'); + $result = $this->db->buildColumn($column); + $expected = '[name] varchar(255) DEFAULT \'\' NOT NULL'; + $this->assertEqual($result, $expected); + + $column = array('name' => 'name', 'type' => 'string', 'null' => false, 'length' => '255'); + $result = $this->db->buildColumn($column); + $expected = '[name] varchar(255) NOT NULL'; + $this->assertEqual($result, $expected); + + $column = array('name' => 'name', 'type' => 'string', 'null' => false, 'default' => null, 'length' => '255'); + $result = $this->db->buildColumn($column); + $expected = '[name] varchar(255) NOT NULL'; + $this->assertEqual($result, $expected); + + $column = array('name' => 'name', 'type' => 'string', 'null' => true, 'default' => null, 'length' => '255'); + $result = $this->db->buildColumn($column); + $expected = '[name] varchar(255) DEFAULT NULL'; + $this->assertEqual($result, $expected); + + $column = array('name' => 'name', 'type' => 'string', 'null' => true, 'default' => '', 'length' => '255'); + $result = $this->db->buildColumn($column); + $expected = '[name] varchar(255) DEFAULT \'\''; + $this->assertEqual($result, $expected); + } /** * testUpdateAllSyntax method * @@ -353,6 +451,7 @@ class DboMssqlTest extends CakeTestCase { * @access public */ function testGetPrimaryKey() { + // When param is a model $result = $this->db->getPrimaryKey($this->model); $this->assertEqual($result, 'id'); @@ -361,6 +460,12 @@ class DboMssqlTest extends CakeTestCase { $this->model->setSchema($schema); $result = $this->db->getPrimaryKey($this->model); $this->assertNull($result); + + // When param is a table name + $this->db->simulate = false; + $this->loadFixtures('Category'); + $result = $this->db->getPrimaryKey('categories'); + $this->assertEqual($result, 'id'); } /** * testInsertMulti 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 5cd392f26..943571579 100644 --- a/cake/tests/cases/libs/model/datasources/dbo_source.test.php +++ b/cake/tests/cases/libs/model/datasources/dbo_source.test.php @@ -1211,6 +1211,8 @@ class DboSourceTest extends CakeTestCase { $this->testDb =& new DboTest($this->__config); $this->testDb->cacheSources = false; + $this->testDb->startQuote = '`'; + $this->testDb->endQuote = '`'; Configure::write('debug', 1); $this->debug = Configure::read('debug'); $this->Model =& new TestModel(); @@ -1235,6 +1237,7 @@ class DboSourceTest extends CakeTestCase { function testFieldDoubleEscaping() { $config = array_merge($this->__config, array('driver' => 'test')); $test =& ConnectionManager::create('quoteTest', $config); + $test->simulated = array(); $this->Model =& new Article2(array('alias' => 'Article', 'ds' => 'quoteTest')); $this->Model->setDataSource('quoteTest');