Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / lib / sqlite / groups.py @ d50ed8d4

History | View | Annotate | Download (4.4 kB)

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()