Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (4.5 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) "
75
             "values (?, ?, ?)")
76
        self.execute(q, (owner, group, member))
77

    
78
    def group_addmany(self, owner, group, members):
79
        """Add members to a group."""
80

    
81
        q = ("insert or ignore into groups (owner, name, member) "
82
             "values (?, ?, ?)")
83
        self.executemany(q, ((owner, group, member) for member in members))
84

    
85
    def group_remove(self, owner, group, member):
86
        """Remove a member from a group."""
87

    
88
        q = "delete from groups where owner = ? and name = ? and member = ?"
89
        self.execute(q, (owner, group, member))
90

    
91
    def group_delete(self, owner, group):
92
        """Delete a group."""
93

    
94
        q = "delete from groups where owner = ? and name = ?"
95
        self.execute(q, (owner, group))
96

    
97
    def group_destroy(self, owner):
98
        """Delete all groups belonging to owner."""
99

    
100
        q = "delete from groups where owner = ?"
101
        self.execute(q, (owner,))
102

    
103
    def group_members(self, owner, group):
104
        """Return the list of members of a group."""
105

    
106
        q = "select member from groups where owner = ? and name = ?"
107
        self.execute(q, (owner, group))
108
        return [r[0] for r in self.fetchall()]
109

    
110
    def group_check(self, owner, group, member):
111
        """Check if a member is in a group."""
112

    
113
        q = "select 1 from groups where owner = ? and name = ? and member = ?"
114
        self.execute(q, (group, member))
115
        return bool(self.fetchone())
116

    
117
    def group_parents(self, member):
118
        """Return all (owner, group) tuples that contain member."""
119

    
120
        q = "select owner, name from groups where member = ?"
121
        self.execute(q, (member,))
122
        return self.fetchall()