Merge branch 'master' into packaging
[pithos] / snf-pithos-backend / pithos / backends / lib / sqlite / groups.py
1 # Copyright 2011-2012 GRNET S.A. All rights reserved.
2
3 # Redistribution and use in source and binary forms, with or
4 # without modification, are permitted provided that the following
5 # conditions are met:
6
7 #   1. Redistributions of source code must retain the above
8 #      copyright notice, this list of conditions and the following
9 #      disclaimer.
10
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.
15
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.
28
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.
33
34 from collections import defaultdict
35
36 from dbworker import DBWorker
37
38
39 class Groups(DBWorker):
40     """Groups are named collections of members, belonging to an owner."""
41     
42     def __init__(self, **params):
43         DBWorker.__init__(self, **params)
44         execute = self.execute
45         
46         execute(""" create table if not exists groups
47                           ( owner  text,
48                             name   text,
49                             member text,
50                             primary key (owner, name, member) ) """)
51         execute(""" create index if not exists idx_groups_member
52                     on groups(member) """)
53     
54     def group_names(self, owner):
55         """List all group names belonging to owner."""
56         
57         q = "select distinct name from groups where owner = ?"
58         self.execute(q, (owner,))
59         return [r[0] for r in self.fetchall()]
60     
61     def group_dict(self, owner):
62         """Return a dict mapping group names to member lists for owner."""
63         
64         q = "select name, member from groups where owner = ?"
65         self.execute(q, (owner,))
66         d = defaultdict(list)
67         for group, member in self.fetchall():
68             d[group].append(member)
69         return d
70     
71     def group_add(self, owner, group, member):
72         """Add a member to a group."""
73         
74         q = "insert or ignore into groups (owner, name, member) values (?, ?, ?)"
75         self.execute(q, (owner, group, member))
76     
77     def group_addmany(self, owner, group, members):
78         """Add members to a group."""
79         
80         q = "insert or ignore into groups (owner, name, member) values (?, ?, ?)"
81         self.executemany(q, ((owner, group, member) for member in members))
82     
83     def group_remove(self, owner, group, member):
84         """Remove a member from a group."""
85         
86         q = "delete from groups where owner = ? and name = ? and member = ?"
87         self.execute(q, (owner, group, member))
88     
89     def group_delete(self, owner, group):
90         """Delete a group."""
91         
92         q = "delete from groups where owner = ? and name = ?"
93         self.execute(q, (owner, group))
94     
95     def group_destroy(self, owner):
96         """Delete all groups belonging to owner."""
97         
98         q = "delete from groups where owner = ?"
99         self.execute(q, (owner,))
100     
101     def group_members(self, owner, group):
102         """Return the list of members of a group."""
103         
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()]
107     
108     def group_check(self, owner, group, member):
109         """Check if a member is in a group."""
110         
111         q = "select 1 from groups where owner = ? and name = ? and member = ?"
112         self.execute(q, (group, member))
113         return bool(self.fetchone())
114     
115     def group_parents(self, member):
116         """Return all (owner, group) tuples that contain member."""
117         
118         q = "select owner, name from groups where member = ?"
119         self.execute(q, (member,))
120         return self.fetchall()