Prevent sql error for uuids if id is specified as null

if the primary key is present in the data to be saved as null - prevent
passing the same key (id) twice and therefore triggering an sql error.

Signed-off-by: Mark Story <mark@mark-story.com>
This commit is contained in:
AD7six 2010-03-15 11:55:47 +01:00 committed by Mark Story
parent 4861da66ed
commit 0c951b7248
2 changed files with 30 additions and 2 deletions

View file

@ -1334,8 +1334,13 @@ class Model extends Overloadable {
($fInfo['type'] === 'string' || $fInfo['type'] === 'binary')
);
if (empty($this->data[$this->alias][$this->primaryKey]) && $isUUID) {
if (array_key_exists($this->primaryKey, $this->data[$this->alias])) {
$j = array_search($this->primaryKey, $fields);
$values[$j] = String::uuid();
} else {
list($fields[], $values[]) = array($this->primaryKey, String::uuid());
}
}
break;
}
}

View file

@ -162,6 +162,29 @@ class ModelWriteTest extends BaseModelTest {
$this->assertEqual(strlen($result['Uuid']['id']), 36);
}
/**
* Ensure that if the id key is null but present the save doesn't fail (with an
* x sql error: "Column id specified twice")
*
* @return void
* @access public
*/
function testSaveUuidNull() {
// SQLite does not support non-integer primary keys
$this->skipIf($this->db->config['driver'] == 'sqlite');
$this->loadFixtures('Uuid');
$TestModel =& new Uuid();
$TestModel->save(array('title' => 'Test record', 'id' => null));
$result = $TestModel->findByTitle('Test record');
$this->assertEqual(
array_keys($result['Uuid']),
array('id', 'title', 'count', 'created', 'updated')
);
$this->assertEqual(strlen($result['Uuid']['id']), 36);
}
/**
* testZeroDefaultFieldValue method
*