Changes Model::find() to allow modification of DataSource connection during callbacks.

This commit is contained in:
nate 2009-09-10 09:28:55 -04:00 committed by mark_story
parent 38f578199d
commit 1c8a2f232b
3 changed files with 32 additions and 1 deletions

View file

@ -1948,7 +1948,6 @@ class Model extends Overloadable {
list($type, $query) = array($conditions, $fields); list($type, $query) = array($conditions, $fields);
} }
$db =& ConnectionManager::getDataSource($this->useDbConfig);
$this->findQueryType = $type; $this->findQueryType = $type;
$this->id = $this->getID(); $this->id = $this->getID();
@ -1995,6 +1994,9 @@ class Model extends Overloadable {
} }
} }
if (!$db =& ConnectionManager::getDataSource($this->useDbConfig)) {
return false;
}
$results = $db->read($this, $query); $results = $db->read($this, $query);
$this->resetAssociations(); $this->resetAssociations();
$this->findQueryType = null; $this->findQueryType = null;

View file

@ -4899,6 +4899,23 @@ class ModelReadTest extends BaseModelTest {
$expected = array('mariano', 'nate', 'larry', 'garrett'); $expected = array('mariano', 'nate', 'larry', 'garrett');
$this->assertEqual($result, $expected); $this->assertEqual($result, $expected);
} }
/**
* Tests that the database configuration assigned to the model can be changed using
* (before|after)Find callbacks
*
* @return void
*/
function testCallbackSourceChange() {
$this->loadFixtures('Post');
$TestModel = new Post();
$this->assertEqual(3, count($TestModel->find('all')));
$this->expectError(new PatternExpectation('/Non-existent data source foo/i'));
$this->expectError(new PatternExpectation('/Only variable references/i'));
$this->assertFalse($TestModel->find('all', array('connection' => 'foo')));
}
/** /**
* testMultipleBelongsToWithSameClass method * testMultipleBelongsToWithSameClass method
* *

View file

@ -763,6 +763,18 @@ class Post extends CakeTestModel {
* @access public * @access public
*/ */
var $belongsTo = array('Author'); var $belongsTo = array('Author');
function beforeFind($queryData) {
if (isset($queryData['connection'])) {
$this->useDbConfig = $queryData['connection'];
}
return true;
}
function afterFind($results) {
$this->useDbConfig = 'test_suite';
return $results;
}
} }
/** /**
* Author class * Author class