Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / lib / sqlite / xfeatures.py @ 345dcf39

History | View | Annotate | Download (5.8 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 XFeatures(DBWorker):
40
    """XFeatures are path properties that allow non-nested
41
       inheritance patterns. Currently used for storing permissions.
42
    """
43
    
44
    def __init__(self, **params):
45
        DBWorker.__init__(self, **params)
46
        execute = self.execute
47
        
48
        execute(""" pragma foreign_keys = on """)
49
        
50
        execute(""" create table if not exists xfeatures
51
                          ( feature_id integer primary key,
52
                            path       text ) """)
53
        execute(""" create unique index if not exists idx_features_path
54
                    on xfeatures(path) """)
55

    
56
        execute(""" create table if not exists xfeaturevals
57
                          ( feature_id integer,
58
                            key        integer,
59
                            value      text,
60
                            primary key (feature_id, key, value)
61
                            foreign key (feature_id) references xfeatures(feature_id)
62
                            on delete cascade ) """)
63
    
64
#     def xfeature_inherit(self, path):
65
#         """Return the (path, feature) inherited by the path, or None."""
66
#         
67
#         q = ("select path, feature_id from xfeatures "
68
#              "where path <= ? "
69
#              "and ? like path || '%' " # XXX: Escape like...
70
#              "order by path desc")
71
#         self.execute(q, (path, path))
72
#         return self.fetchall()
73
    
74
    def xfeature_get(self, path):
75
        """Return feature for path."""
76
        
77
        q = "select feature_id from xfeatures where path = ?"
78
        self.execute(q, (path,))
79
        r = self.fetchone()
80
        if r is not None:
81
            return r[0]
82
        return None
83
    
84
    def xfeature_create(self, path):
85
        """Create and return a feature for path.
86
           If the path has a feature, return it.
87
        """
88
        
89
        feature = self.xfeature_get(path)
90
        if feature is not None:
91
            return feature
92
        q = "insert into xfeatures (path) values (?)"
93
        id = self.execute(q, (path,)).lastrowid
94
        return id
95
    
96
    def xfeature_destroy(self, path):
97
        """Destroy a feature and all its key, value pairs."""
98
        
99
        q = "delete from xfeatures where path = ?"
100
        self.execute(q, (path,))
101
    
102
    def feature_dict(self, feature):
103
        """Return a dict mapping keys to list of values for feature."""
104
        
105
        q = "select key, value from xfeaturevals where feature_id = ?"
106
        self.execute(q, (feature,))
107
        d = defaultdict(list)
108
        for key, value in self.fetchall():
109
            d[key].append(value)
110
        return d
111
    
112
    def feature_set(self, feature, key, value):
113
        """Associate a key, value pair with a feature."""
114
        
115
        q = "insert or ignore into xfeaturevals (feature_id, key, value) values (?, ?, ?)"
116
        self.execute(q, (feature, key, value))
117
    
118
    def feature_setmany(self, feature, key, values):
119
        """Associate the given key, and values with a feature."""
120
        
121
        q = "insert or ignore into xfeaturevals (feature_id, key, value) values (?, ?, ?)"
122
        self.executemany(q, ((feature, key, v) for v in values))
123
    
124
    def feature_unset(self, feature, key, value):
125
        """Disassociate a key, value pair from a feature."""
126
        
127
        q = ("delete from xfeaturevals where "
128
             "feature_id = ? and key = ? and value = ?")
129
        self.execute(q, (feature, key, value))
130
    
131
    def feature_unsetmany(self, feature, key, values):
132
        """Disassociate the key for the values given, from a feature."""
133
        
134
        q = ("delete from xfeaturevals where "
135
             "feature_id = ? and key = ? and value = ?")
136
        self.executemany(q, ((feature, key, v) for v in values))
137
    
138
    def feature_get(self, feature, key):
139
        """Return the list of values for a key of a feature."""
140
        
141
        q = "select value from xfeaturevals where feature_id = ? and key = ?"
142
        self.execute(q, (feature, key))
143
        return [r[0] for r in self.fetchall()]
144
    
145
    def feature_clear(self, feature, key):
146
        """Delete all key, value pairs for a key of a feature."""
147
        
148
        q = "delete from xfeaturevals where feature_id = ? and key = ?"
149
        self.execute(q, (feature, key))