Merge branch '1.3' of git://github.com/cakephp/cakephp into 1.3

This commit is contained in:
Ceeram 2011-03-26 20:23:29 +01:00
commit 72f4ce8dd9
6 changed files with 85 additions and 64 deletions

View file

@ -382,7 +382,8 @@ class AuthComponent extends Object {
$controller->data[$model->alias][$this->fields['password']] = null; $controller->data[$model->alias][$this->fields['password']] = null;
return false; return false;
} else { } else {
if (!$this->user()) { $user = $this->user();
if (!$user) {
if (!$this->RequestHandler->isAjax()) { if (!$this->RequestHandler->isAjax()) {
$this->Session->setFlash($this->authError, $this->flashElement, array(), 'auth'); $this->Session->setFlash($this->authError, $this->flashElement, array(), 'auth');
if (!empty($controller->params['url']) && count($controller->params['url']) >= 2) { if (!empty($controller->params['url']) && count($controller->params['url']) >= 2) {
@ -442,7 +443,7 @@ class AuthComponent extends Object {
break; break;
} }
if ($this->isAuthorized($type)) { if ($this->isAuthorized($type, null, $user)) {
return true; return true;
} }

View file

@ -218,12 +218,21 @@ class DboMysqlBase extends DboSource {
if (empty($conditions)) { if (empty($conditions)) {
$alias = $joins = false; $alias = $joins = false;
} }
$conditions = $this->conditions($this->defaultConditions($model, $conditions, $alias), true, true, $model); $complexConditions = false;
foreach ((array)$conditions as $key => $value) {
if (strpos($key, $model->alias) === false) {
$complexConditions = true;
break;
}
}
if (!$complexConditions) {
$joins = false;
}
$conditions = $this->conditions($this->defaultConditions($model, $conditions, $alias), true, true, $model);
if ($conditions === false) { if ($conditions === false) {
return false; return false;
} }
if ($this->execute($this->renderStatement('delete', compact('alias', 'table', 'joins', 'conditions'))) === false) { if ($this->execute($this->renderStatement('delete', compact('alias', 'table', 'joins', 'conditions'))) === false) {
$model->onError(); $model->onError();
return false; return false;

View file

@ -2439,7 +2439,7 @@ class DboSource extends DataSource {
} }
if (strpos($key, '.')) { if (strpos($key, '.')) {
$key = preg_replace_callback('/([a-zA-Z0-9_]{1,})\\.([a-zA-Z0-9_]{1,})/', array(&$this, '__quoteMatchedField'), $key); $key = preg_replace_callback('/([a-zA-Z0-9_-]{1,})\\.([a-zA-Z0-9_-]{1,})/', array(&$this, '__quoteMatchedField'), $key);
} }
if (!preg_match('/\s/', $key) && !strpos($key, '.')) { if (!preg_match('/\s/', $key) && !strpos($key, '.')) {
$key = $this->name($key); $key = $this->name($key);

View file

@ -18,58 +18,10 @@
* @license MIT License (http://www.opensource.org/licenses/mit-license.php) * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/ */
App::import('Core', array('Model', 'DataSource', 'DboSource', 'DboMysql')); App::import('Core', array('Model', 'DataSource', 'DboSource', 'DboMysql'));
App::import('Core', array('AppModel', 'Model'));
require_once dirname(dirname(dirname(__FILE__))) . DS . 'models.php';
Mock::generatePartial('DboMysql', 'QueryMockDboMysql', array('query')); Mock::generatePartial('DboMysql', 'QueryMockDboMysql', array('query', 'execute'));
/**
* DboMysqlTestDb class
*
* @package cake
* @subpackage cake.tests.cases.libs.model.datasources
*/
class DboMysqlTestDb extends DboMysql {
/**
* simulated property
*
* @var array
* @access public
*/
var $simulated = array();
/**
* testing property
*
* @var bool true
* @access public
*/
var $testing = true;
/**
* execute method
*
* @param mixed $sql
* @access protected
* @return void
*/
function _execute($sql) {
if ($this->testing) {
$this->simulated[] = $sql;
return null;
}
return parent::_execute($sql);
}
/**
* getLastQuery method
*
* @access public
* @return void
*/
function getLastQuery() {
return $this->simulated[count($this->simulated) - 1];
}
}
/** /**
* MysqlTestModel class * MysqlTestModel class
@ -160,7 +112,7 @@ class MysqlTestModel extends Model {
* @subpackage cake.tests.cases.libs.model.datasources.dbo * @subpackage cake.tests.cases.libs.model.datasources.dbo
*/ */
class DboMysqlTest extends CakeTestCase { class DboMysqlTest extends CakeTestCase {
var $fixtures = array('core.binary_test'); var $fixtures = array('core.binary_test', 'core.post', 'core.author');
/** /**
* The Dbo instance to be tested * The Dbo instance to be tested
* *
@ -583,7 +535,7 @@ class DboMysqlTest extends CakeTestCase {
*/ */
function testAlterSchemaIndexes() { function testAlterSchemaIndexes() {
App::import('Model', 'CakeSchema'); App::import('Model', 'CakeSchema');
$this->db->cacheSources = $this->db->testing = false; $this->db->cacheSources = false;
$schema1 =& new CakeSchema(array( $schema1 =& new CakeSchema(array(
'name' => 'AlterTest1', 'name' => 'AlterTest1',
@ -673,7 +625,7 @@ class DboMysqlTest extends CakeTestCase {
*/ */
function testAlteringTableParameters() { function testAlteringTableParameters() {
App::import('Model', 'CakeSchema'); App::import('Model', 'CakeSchema');
$this->db->cacheSources = $this->db->testing = false; $this->db->cacheSources = false;
$schema1 =& new CakeSchema(array( $schema1 =& new CakeSchema(array(
'name' => 'AlterTest1', 'name' => 'AlterTest1',
@ -757,7 +709,7 @@ class DboMysqlTest extends CakeTestCase {
* @return void * @return void
*/ */
function testReadTableParameters() { function testReadTableParameters() {
$this->db->cacheSources = $this->db->testing = false; $this->db->cacheSources = false;
$this->db->query('CREATE TABLE ' . $this->db->fullTableName('tinyint') . ' (id int(11) AUTO_INCREMENT, bool tinyint(1), small_int tinyint(2), primary key(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;'); $this->db->query('CREATE TABLE ' . $this->db->fullTableName('tinyint') . ' (id int(11) AUTO_INCREMENT, bool tinyint(1), small_int tinyint(2), primary key(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;');
$result = $this->db->readTableParameters('tinyint'); $result = $this->db->readTableParameters('tinyint');
$expected = array( $expected = array(
@ -784,7 +736,7 @@ class DboMysqlTest extends CakeTestCase {
* @return void * @return void
*/ */
function testBuildTableParameters() { function testBuildTableParameters() {
$this->db->cacheSources = $this->db->testing = false; $this->db->cacheSources = false;
$data = array( $data = array(
'charset' => 'utf8', 'charset' => 'utf8',
'collate' => 'utf8_unicode_ci', 'collate' => 'utf8_unicode_ci',
@ -804,7 +756,7 @@ class DboMysqlTest extends CakeTestCase {
* @return void * @return void
*/ */
function testGetCharsetName() { function testGetCharsetName() {
$this->db->cacheSources = $this->db->testing = false; $this->db->cacheSources = false;
$result = $this->db->getCharsetName('utf8_unicode_ci'); $result = $this->db->getCharsetName('utf8_unicode_ci');
$this->assertEqual($result, 'utf8'); $this->assertEqual($result, 'utf8');
$result = $this->db->getCharsetName('cp1250_general_ci'); $result = $this->db->getCharsetName('cp1250_general_ci');
@ -863,4 +815,47 @@ class DboMysqlTest extends CakeTestCase {
$this->db->execute($this->db->dropSchema($schema)); $this->db->execute($this->db->dropSchema($schema));
} }
/**
* test that simple delete conditions don't create joins using a mock.
*
* @return void
*/
function testSimpleDeleteConditionsNoJoins() {
$model =& new Post();
$mockDbo =& new QueryMockDboMysql($this);
$mockDbo->expectAt(0, 'execute', array(new PatternExpectation('/AS\s+`Post`\s+WHERE\s+`Post/')));
$mockDbo->setReturnValue('execute', true);
$mockDbo->delete($model, array('Post.id' => 1));
}
/**
* test deleting with joins, a MySQL specific feature.
*
* @return void
*/
function testDeleteWithJoins() {
$model =& new Post();
$mockDbo =& new QueryMockDboMysql($this);
$mockDbo->expectAt(0, 'execute', array(new PatternExpectation('/LEFT JOIN `authors`/')));
$mockDbo->setReturnValue('execute', true);
$mockDbo->delete($model, array('Author.id' => 1));
}
/**
* test joins on delete with multiple conditions.
*
* @return void
*/
function testDeleteWithJoinsAndMultipleConditions() {
$model =& new Post();
$mockDbo =& new QueryMockDboMysql($this);
$mockDbo->expectAt(0, 'execute', array(new PatternExpectation('/LEFT JOIN `authors`/')));
$mockDbo->expectAt(1, 'execute', array(new PatternExpectation('/LEFT JOIN `authors`/')));
$mockDbo->setReturnValue('execute', true);
$mockDbo->delete($model, array('Author.id' => 1, 'Post.id' => 2));
$mockDbo->delete($model, array('Post.id' => 2, 'Author.id' => 1));
}
} }

View file

@ -3512,6 +3512,10 @@ class DboSourceTest extends CakeTestCase {
$result = $this->testDb->order(array('Property.sale_price IS NULL')); $result = $this->testDb->order(array('Property.sale_price IS NULL'));
$expected = ' ORDER BY `Property`.`sale_price` IS NULL ASC'; $expected = ' ORDER BY `Property`.`sale_price` IS NULL ASC';
$this->assertEqual($result, $expected); $this->assertEqual($result, $expected);
$result = $this->testDb->order(array('Export.column-name' => 'ASC'));
$expected = ' ORDER BY `Export`.`column-name` ASC';
$this->assertEqual($result, $expected, 'Columns with -s are not working with order()');
} }
/** /**

View file

@ -3890,6 +3890,18 @@ class ModelWriteTest extends BaseModelTest {
$this->assertEqual($resultsFkFalse, $expected); $this->assertEqual($resultsFkFalse, $expected);
} }
/**
* test updateAll with empty values.
*
* @return void
*/
function testUpdateAllEmptyValues() {
$this->loadFixtures('Author', 'Post');
$model = new Author();
$result = $model->updateAll(array('user' => '""'));
$this->assertTrue($result);
}
/** /**
* testProductUpdateAllWithForeignKey * testProductUpdateAllWithForeignKey
* *
@ -3897,7 +3909,7 @@ class ModelWriteTest extends BaseModelTest {
* @access public * @access public
* @return void * @return void
*/ */
function testProductUpdateAll() { function testUpdateAllWithJoins() {
$this->skipIf( $this->skipIf(
$this->db->config['driver'] == 'postgres', $this->db->config['driver'] == 'postgres',
'%s Currently, there is no way of doing joins in an update statement in postgresql' '%s Currently, there is no way of doing joins in an update statement in postgresql'
@ -3948,7 +3960,7 @@ class ModelWriteTest extends BaseModelTest {
* @access public * @access public
* @return void * @return void
*/ */
function testProductUpdateAllWithoutForeignKey() { function testUpdateAllWithoutForeignKey() {
$this->skipIf( $this->skipIf(
$this->db->config['driver'] == 'postgres', $this->db->config['driver'] == 'postgres',
'%s Currently, there is no way of doing joins in an update statement in postgresql' '%s Currently, there is no way of doing joins in an update statement in postgresql'