1 Group A has members 1, 2, 3
3 Cached members 1 is a member of A via ""
4 2 is a member of A via ""
5 3 is a member of A via ""
8 Group B has members A, 4, 5
10 Cached members: 4 is a member of B via "" $1
11 5 is a member of B via "" $2
12 A is a member of B via "" $3
13 1 is a member of B via "$3" $4
14 2 is a member of B via "$3" $5
15 3 is a member of B via "$3" $6
17 Group C has members A, B, 6
18 6 is a member of C via "" $7
19 A is a member of C via "" $8
20 1 is a member of C via $8 $9
21 2 is a member of C via $8 $10
22 3 is a member of C via $8 $11
23 B is a member of C via "" $12
24 4 is a member of C via $12 $13
25 5 is a member of C via $12 $14
26 A is a member of C via $12 $15
27 1 is a member of C via $15 $16
28 2 is a member of C via $15 $17
29 3 is a member of C via $15 $18
33 Group D has members A, C
35 A is a member of D via "" $19
36 1 is a member of D via $19 $20
37 2 is a member of D via $19 $21
38 3 is a member of D via $19 $22
39 C is a member of D via "" $23
40 6 is a member of D via $23 $24
41 A is a member of D via $23 $25
42 1 is a member of D via $25 $26
43 2 is a member of D via $25 $27
44 3 is a member of D via $25 $28
45 B is a member of D via $23 $29
46 4 is a member of D via $29 $30
47 5 is a member of D via $29 $31
48 A is a member of D via $29 $32
49 1 is a member of D via $32 $33
50 2 is a member of D via $32 $34
51 3 is a member of D via $32 $35
55 Adding a new user, 7, to group A.
58 Add the user to group A in the groups table.
60 Find all entries for group A in the cache table.
62 For each entry in that list:
63 Add "7 is a member of $entry->top via $entry->id"
65 Deleting a user, 7, from group A:
67 Remove the user from group A in the groups table.
68 find all entries in the cache table where the principal id is user 7 and
69 the parent id is A. (requires a self join)
73 find all entries for A in the cache table.
74 For each one, find the child whose id is 7.
78 Adding a group, B to group D.
80 Add group B as a member of D in the groups table.
82 $id = Add group B as a member of D via ""
84 For each member of group B (4, 5, A):
86 $sid= 4 is a member of D via $id
87 $sid= 5 is a member of D via $id
88 $sid= A is a member of D via $id
90 if the member is a group itself, recurse down:
92 1 is a member of D via $sid
93 2 is a member of D via $sid
94 3 is a member of D via $sid
96 Find all places where D is a member of $foo.
97 Repeat the above procedure, substituting $foo for D
98 and making $id D's id.
100 Removing B as a member of D:
102 Remove B as a member of D in the groups table.
103 Find all references to D in the pseudogroups table.
104 Find all children of D which are B:
105 Recurse down with the following algorithm:
106 If it's a user, delete it.
107 If it's a group, recurse through each member,
108 deleting its children and then deleting the