Fix issue where createSchema() would omit primary keys sometimes.

Fix missing primary key SQL when using the primary flag + other indexes.

Fixes 
This commit is contained in:
mark_story 2012-10-22 20:33:43 -04:00
parent 1c0c8604c8
commit a0a61b5980
2 changed files with 47 additions and 1 deletions
lib/Cake
Model/Datasource
Test/Case/Model/Datasource/Database

View file

@ -2984,7 +2984,7 @@ class DboSource extends DataSource {
$tableParameters = array_merge($tableParameters, $this->buildTableParameters($col, $table)); $tableParameters = array_merge($tableParameters, $this->buildTableParameters($col, $table));
} }
} }
if (empty($indexes) && !empty($primary)) { if (!isset($columns['indexes']['PRIMARY']) && !empty($primary)) {
$col = array('PRIMARY' => array('column' => $primary, 'unique' => 1)); $col = array('PRIMARY' => array('column' => $primary, 'unique' => 1));
$indexes = array_merge($indexes, $this->buildIndex($col, $table)); $indexes = array_merge($indexes, $this->buildIndex($col, $table));
} }

View file

@ -877,6 +877,52 @@ class MysqlTest extends CakeTestCase {
$this->assertContains('`user_id` int(11) NOT NULL,', $result); $this->assertContains('`user_id` int(11) NOT NULL,', $result);
} }
/**
* Test that the primary flag is handled correctly.
*
* @return void
*/
public function testCreateSchemaAutoPrimaryKey() {
$schema = new CakeSchema();
$schema->tables = array(
'no_indexes' => array(
'id' => array('type' => 'integer', 'null' => false, 'key' => 'primary'),
'data' => array('type' => 'integer', 'null' => false),
'indexes' => array(),
)
);
$result = $this->Dbo->createSchema($schema, 'no_indexes');
$this->assertContains('PRIMARY KEY (`id`)', $result);
$this->assertNotContains('UNIQUE KEY', $result);
$schema->tables = array(
'primary_index' => array(
'id' => array('type' => 'integer', 'null' => false),
'data' => array('type' => 'integer', 'null' => false),
'indexes' => array(
'PRIMARY' => array('column' => 'id', 'unique' => 1),
'some_index' => array('column' => 'data', 'unique' => 1)
),
)
);
$result = $this->Dbo->createSchema($schema, 'primary_index');
$this->assertContains('PRIMARY KEY (`id`)', $result);
$this->assertContains('UNIQUE KEY `some_index` (`data`)', $result);
$schema->tables = array(
'primary_flag_has_index' => array(
'id' => array('type' => 'integer', 'null' => false, 'key' => 'primary'),
'data' => array('type' => 'integer', 'null' => false),
'indexes' => array (
'some_index' => array('column' => 'data', 'unique' => 1)
),
)
);
$result = $this->Dbo->createSchema($schema, 'primary_flag_has_index');
$this->assertContains('PRIMARY KEY (`id`)', $result);
$this->assertContains('UNIQUE KEY `some_index` (`data`)', $result);
}
/** /**
* Tests that listSources method sends the correct query and parses the result accordingly * Tests that listSources method sends the correct query and parses the result accordingly
* @return void * @return void