1 # Copyright 2011-2012 GRNET S.A. All rights reserved.
3 # Redistribution and use in source and binary forms, with or
4 # without modification, are permitted provided that the following
7 # 1. Redistributions of source code must retain the above
8 # copyright notice, this list of conditions and the following
11 # 2. Redistributions in binary form must reproduce the above
12 # copyright notice, this list of conditions and the following
13 # disclaimer in the documentation and/or other materials
14 # provided with the distribution.
16 # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 # POSSIBILITY OF SUCH DAMAGE.
29 # The views and conclusions contained in the software and
30 # documentation are those of the authors and should not be
31 # interpreted as representing official policies, either expressed
32 # or implied, of GRNET S.A.
34 from collections import defaultdict
36 from dbworker import DBWorker
39 class Groups(DBWorker):
40 """Groups are named collections of members, belonging to an owner."""
42 def __init__(self, **params):
43 DBWorker.__init__(self, **params)
44 execute = self.execute
46 execute(""" create table if not exists groups
50 primary key (owner, name, member) ) """)
51 execute(""" create index if not exists idx_groups_member
52 on groups(member) """)
54 def group_names(self, owner):
55 """List all group names belonging to owner."""
57 q = "select distinct name from groups where owner = ?"
58 self.execute(q, (owner,))
59 return [r[0] for r in self.fetchall()]
61 def group_dict(self, owner):
62 """Return a dict mapping group names to member lists for owner."""
64 q = "select name, member from groups where owner = ?"
65 self.execute(q, (owner,))
67 for group, member in self.fetchall():
68 d[group].append(member)
71 def group_add(self, owner, group, member):
72 """Add a member to a group."""
74 q = "insert or ignore into groups (owner, name, member) values (?, ?, ?)"
75 self.execute(q, (owner, group, member))
77 def group_addmany(self, owner, group, members):
78 """Add members to a group."""
80 q = "insert or ignore into groups (owner, name, member) values (?, ?, ?)"
81 self.executemany(q, ((owner, group, member) for member in members))
83 def group_remove(self, owner, group, member):
84 """Remove a member from a group."""
86 q = "delete from groups where owner = ? and name = ? and member = ?"
87 self.execute(q, (owner, group, member))
89 def group_delete(self, owner, group):
92 q = "delete from groups where owner = ? and name = ?"
93 self.execute(q, (owner, group))
95 def group_destroy(self, owner):
96 """Delete all groups belonging to owner."""
98 q = "delete from groups where owner = ?"
99 self.execute(q, (owner,))
101 def group_members(self, owner, group):
102 """Return the list of members of a group."""
104 q = "select member from groups where owner = ? and name = ?"
105 self.execute(q, (owner, group))
106 return [r[0] for r in self.fetchall()]
108 def group_check(self, owner, group, member):
109 """Check if a member is in a group."""
111 q = "select 1 from groups where owner = ? and name = ? and member = ?"
112 self.execute(q, (group, member))
113 return bool(self.fetchone())
115 def group_parents(self, member):
116 """Return all (owner, group) tuples that contain member."""
118 q = "select owner, name from groups where member = ?"
119 self.execute(q, (member,))
120 return self.fetchall()