af4164d6dd26f5662c560ab5d6be0481987ea3c5
[tiramisu.git] / tiramisu / storage / sqlite3 / value.py
1 # -*- coding: utf-8 -*-
2 "default plugin for value: set it in a simple dictionary"
3 # Copyright (C) 2013 Team tiramisu (see AUTHORS for all contributors)
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 #
19 # ____________________________________________________________
20
21 from tiramisu.storage.sqlite3.storage import Cache
22 from tiramisu.setting import owners
23
24
25 class Values(Cache):
26     __slots__ = tuple()
27
28     def __init__(self, storage):
29         """init plugin means create values storage
30         """
31         values_table = 'CREATE TABLE IF NOT EXISTS value(path text primary '
32         values_table += 'key, value text, owner text)'
33         # should init cache too
34         super(Values, self).__init__('value', storage)
35         self.storage.execute(values_table)
36
37     # sqlite
38     def _sqlite_select(self, path):
39         return self.storage.select("SELECT value FROM value WHERE path = ?",
40                                    (path,))
41
42     # value
43     def setvalue(self, path, value, owner):
44         """set value for an option
45         a specified value must be associated to an owner
46         """
47         self.resetvalue(path)
48         path = self._sqlite_encode_path(path)
49         self.storage.execute("INSERT INTO value(path, value, owner) VALUES "
50                              "(?, ?, ?)", (path, self._sqlite_encode(value),
51                                            str(owner)))
52
53     def getvalue(self, path):
54         """get value for an option
55         return: only value, not the owner
56         """
57         path = self._sqlite_encode_path(path)
58         return self._sqlite_decode(self._sqlite_select(path)[0])
59
60     def hasvalue(self, path):
61         """if opt has a value
62         return: boolean
63         """
64         path = self._sqlite_encode_path(path)
65         return self._sqlite_select(path) is not None
66
67     def resetvalue(self, path):
68         """remove value means delete value in storage
69         """
70         path = self._sqlite_encode_path(path)
71         self.storage.execute("DELETE FROM value WHERE path = ?", (path,))
72
73     def get_modified_values(self):
74         """return all values in a dictionary
75         example: {option1: (owner, 'value1'), option2: (owner, 'value2')}
76         """
77         ret = {}
78         for path, value, owner in self.storage.select("SELECT * FROM value",
79                                                       only_one=False):
80             path = self._sqlite_decode_path(path)
81             owner = getattr(owners, owner)
82
83             value = self._sqlite_decode(value)
84             ret[path] = (owner, value)
85         return ret
86
87     # owner
88     def setowner(self, path, owner):
89         """change owner for an option
90         """
91         path = self._sqlite_encode_path(path)
92         self.storage.execute("UPDATE value SET owner = ? WHERE path = ?",
93                              (str(owner), path))
94
95     def getowner(self, path, default):
96         """get owner for an option
97         return: owner object
98         """
99         path = self._sqlite_encode_path(path)
100         owner = self.storage.select("SELECT owner FROM value WHERE path = ?",
101                                     (path,))
102         if owner is None:
103             return default
104         else:
105             return getattr(owners, owner[0])