forked from GNUsocial/gnu-social
		
	Improve cache-friendliness of user_group->delete().
Doesn't clear all possible cached entries, but this should get the ones that matter most: lookups by id, nickname, and alias. This should ensure that if a group name gets reused as a new group or alias, it should work properly. There are some user-visible areas that aren't clear such as the 'top groups' lists on the GroupsAction sidebar; if a deleted group appears in those lists it'll go away within an hour when the cached query expires.
This commit is contained in:
		| @@ -551,29 +551,39 @@ class User_group extends Memcached_DataObject | ||||
|     /** | ||||
|      * Handle cascading deletion, on the model of notice and profile. | ||||
|      * | ||||
|      * Pretty sure some caching won't get handled properly here. | ||||
|      * This should handle freeing up cached entries for the group's | ||||
|      * id, nickname, URI, and aliases. There may be other areas that | ||||
|      * are not de-cached in the UI, including the sidebar lists on | ||||
|      * GroupsAction | ||||
|      */ | ||||
|     function delete() | ||||
|     { | ||||
|         if ($this->id) { | ||||
|             // Safe to delete in bulk for now | ||||
|             $related = array('Group_inbox', | ||||
|                              'Group_alias', | ||||
|                              'Group_block', | ||||
|                              'Group_member', | ||||
|                              'Local_group', | ||||
|                              'Related_group', | ||||
|                              ); | ||||
|                              'Related_group'); | ||||
|             Event::handle('UserGroupDeleteRelated', array($this, &$related)); | ||||
|  | ||||
|             foreach ($related as $cls) { | ||||
|                 $inst = new $cls(); | ||||
|                 $inst->group_id = $this->id; | ||||
|                 $inst->delete(); | ||||
|             } | ||||
|  | ||||
|             // And related groups in the other direction... | ||||
|             $inst = new Related_group(); | ||||
|             $inst->related_group_id = $this->id; | ||||
|             $inst->delete(); | ||||
|  | ||||
|             // Aliases and the local_group entry need to be cleared explicitly | ||||
|             // or we'll miss clearing some cache keys; that can make it hard | ||||
|             // to create a new group with one of those names or aliases. | ||||
|             $this->setAliases(array()); | ||||
|             $local = Local_group::staticGet('group_id', $this->id); | ||||
|             if ($local) { | ||||
|                 $local->delete(); | ||||
|             } | ||||
|         } else { | ||||
|             common_log(LOG_WARN, "Ambiguous user_group->delete(); skipping related tables."); | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user