Skip to content

Commit

Permalink
Fixes #4081. Using ElggBatch to delete recursive.
Browse files Browse the repository at this point in the history
  • Loading branch information
brettp committed Jan 26, 2012
1 parent 6a2d3d7 commit 4202d7d
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 18 deletions.
28 changes: 16 additions & 12 deletions engine/lib/entities.php
Expand Up @@ -1520,18 +1520,22 @@ function delete_entity($guid, $recursive = true) {
$entity_disable_override = access_get_show_hidden_status();
access_show_hidden_entities(true);
$ia = elgg_set_ignore_access(true);
$sub_entities = get_data("SELECT * from {$CONFIG->dbprefix}entities
WHERE container_guid=$guid
or owner_guid=$guid
or site_guid=$guid", 'entity_row_to_elggstar');
if ($sub_entities) {
foreach ($sub_entities as $e) {
// check for equality so that an entity that is its own
// owner or container does not cause infinite loop
if ($e->guid != $guid) {
$e->delete(true);
}
}

// @todo there was logic in the original code that ignored
// entities with owner or container guids of themselves.
// this should probably be prevented in ElggEntity instead of checked for here
$options = array(
'wheres' => array(
"((container_guid = $guid OR owner_guid = $guid OR site_guid = $guid)"
. " AND guid != $guid)"
),
'limit' => 0
);

$batch = new ElggBatch('elgg_get_entities', $options, 50, false);

foreach ($batch as $e) {
$e->delete(true);
}

access_show_hidden_entities($entity_disable_override);
Expand Down
12 changes: 6 additions & 6 deletions engine/tests/api/helpers.php
Expand Up @@ -526,7 +526,7 @@ public function testElggBatchIncOffset() {
'offset' => 0,
'limit' => 11
);
$batch = new ElggBatch(array('ElggCoreHelpersTest', 'test_elgg_batch_callback'), $options,
$batch = new ElggBatch(array('ElggCoreHelpersTest', 'elgg_batch_callback_test'), $options,
null, 5);
$j = 0;
foreach ($batch as $e) {
Expand All @@ -539,12 +539,12 @@ public function testElggBatchIncOffset() {
$this->assertEqual(11, $j);

// no increment, 0 start
ElggCoreHelpersTest::test_elgg_batch_callback(array(), true);
ElggCoreHelpersTest::elgg_batch_callback_test(array(), true);
$options = array(
'offset' => 0,
'limit' => 11
);
$batch = new ElggBatch(array('ElggCoreHelpersTest', 'test_elgg_batch_callback'), $options,
$batch = new ElggBatch(array('ElggCoreHelpersTest', 'elgg_batch_callback_test'), $options,
null, 5);
$batch->setIncrementOffset(false);

Expand All @@ -558,12 +558,12 @@ public function testElggBatchIncOffset() {
$this->assertEqual(11, $j);

// no increment, 3 start
ElggCoreHelpersTest::test_elgg_batch_callback(array(), true);
ElggCoreHelpersTest::elgg_batch_callback_test(array(), true);
$options = array(
'offset' => 3,
'limit' => 11
);
$batch = new ElggBatch(array('ElggCoreHelpersTest', 'test_elgg_batch_callback'), $options,
$batch = new ElggBatch(array('ElggCoreHelpersTest', 'elgg_batch_callback_test'), $options,
null, 5);
$batch->setIncrementOffset(false);

Expand All @@ -578,7 +578,7 @@ public function testElggBatchIncOffset() {
$this->assertEqual(11, $j);
}

static function test_elgg_batch_callback($options, $reset = false) {
static function elgg_batch_callback_test($options, $reset = false) {
static $count = 1;

if ($reset) {
Expand Down
49 changes: 49 additions & 0 deletions engine/tests/objects/objects.php
Expand Up @@ -239,6 +239,55 @@ public function testElggEntityRecursiveDisableWhenLoggedOut() {
access_show_hidden_entities(false);
}

public function testElggRecursiveDelete() {
$types = array('ElggGroup', 'ElggObject', 'ElggUser', 'ElggSite');
$db_prefix = elgg_get_config('dbprefix');

foreach ($types as $type) {
$parent = new $type();
$this->assertTrue($parent->save());

$child = new ElggObject();
$child->container_guid = $parent->guid;
$this->assertTrue($child->save());

$grandchild = new ElggObject();
$grandchild->container_guid = $child->guid;
$this->assertTrue($grandchild->save());

$this->assertTrue($parent->delete(true));

$q = "SELECT * FROM {$db_prefix}entities WHERE guid = $parent->guid";
$r = get_data($q);
$this->assertFalse($r);

$q = "SELECT * FROM {$db_prefix}entities WHERE guid = $child->guid";
$r = get_data($q);
$this->assertFalse($r);

$q = "SELECT * FROM {$db_prefix}entities WHERE guid = $grandchild->guid";
$r = get_data($q);
$this->assertFalse($r);
}

// object that owns itself
// can't check container_guid because of infinite loops in can_edit_entity()
$obj = new ElggObject();
$obj->save();
$obj->owner_guid = $obj->guid;
$obj->save();

$q = "SELECT * FROM {$db_prefix}entities WHERE guid = $obj->guid";
$r = get_data_row($q);
$this->assertEqual($obj->guid, $r->owner_guid);

$this->assertTrue($obj->delete(true));

$q = "SELECT * FROM {$db_prefix}entities WHERE guid = $obj->guid";
$r = get_data_row($q);
$this->assertFalse($r);
}

protected function get_object_row($guid) {
global $CONFIG;
return get_data_row("SELECT * FROM {$CONFIG->dbprefix}objects_entity WHERE guid='$guid'");
Expand Down

0 comments on commit 4202d7d

Please sign in to comment.