From 0e23fdfbb3d2889870215cfa459e5bbae87acbdb Mon Sep 17 00:00:00 2001 From: mark_story Date: Wed, 21 Oct 2009 00:22:36 -0400 Subject: [PATCH] Fixing infinitely nesting stack frames when TreeBehavior::reorder() is called and the models $cacheQueries = true and there are a sizable number of records being manipulated. Test cases added. Fixes #188 --- cake/libs/model/behaviors/tree.php | 5 ++++- .../cases/libs/model/behaviors/tree.test.php | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/cake/libs/model/behaviors/tree.php b/cake/libs/model/behaviors/tree.php index da23c193d89..145d298e181 100644 --- a/cake/libs/model/behaviors/tree.php +++ b/cake/libs/model/behaviors/tree.php @@ -460,7 +460,7 @@ function movedown(&$Model, $id = null, $number = 1) { 'fields' => array($Model->primaryKey, $left, $right), 'recursive' => $recursive) ); if ($nextNode) { - list($nextNode)= array_values($nextNode); + list($nextNode) = array_values($nextNode); } else { return false; } @@ -640,6 +640,8 @@ function reorder(&$Model, $options = array()) { $sort = $field . ' ' . $order; $nodes = $this->children($Model, $id, true, $fields, $sort, null, null, $recursive); + $cacheQueries = $Model->cacheQueries; + $Model->cacheQueries = false; if ($nodes) { foreach ($nodes as $node) { $id = $node[$Model->alias][$Model->primaryKey]; @@ -649,6 +651,7 @@ function reorder(&$Model, $options = array()) { } } } + $Model->cacheQueries = $cacheQueries; return true; } /** diff --git a/cake/tests/cases/libs/model/behaviors/tree.test.php b/cake/tests/cases/libs/model/behaviors/tree.test.php index 147da89ae75..86834122b81 100644 --- a/cake/tests/cases/libs/model/behaviors/tree.test.php +++ b/cake/tests/cases/libs/model/behaviors/tree.test.php @@ -1172,6 +1172,25 @@ function testReorderTree() { $sortedNodes = $this->Tree->find('list', array('order' => $leftField)); $this->assertIdentical($nodes, $sortedNodes); } +/** + * test reordering large-ish trees with cacheQueries = true. + * This caused infinite loops when moving down elements as stale data is returned + * from the memory cache + * + * @access public + * @return void + */ + function testReorderBigTreeWithQueryCaching() { + extract($this->settings); + $this->Tree =& new $modelClass(); + $this->Tree->initialize(2, 10); + + $original = $this->Tree->cacheQueries; + $this->Tree->cacheQueries = true; + $this->Tree->reorder(array('field' => 'name', 'direction' => 'DESC')); + $this->assertTrue($this->Tree->cacheQueries, 'cacheQueries was not restored after reorder(). %s'); + $this->Tree->cacheQueries = $original; + } /** * testGenerateTreeListWithSelfJoin method *