start works on storage
[tiramisu.git] / tiramisu / storage / __init__.py
1 # Copyright (C) 2013 Team tiramisu (see AUTHORS for all contributors)
2 #
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16 #
17 # The original `Config` design model is unproudly borrowed from
18 # the rough gus of pypy: pypy: http://codespeak.net/svn/pypy/dist/pypy/config/
19 # the whole pypy projet is under MIT licence
20 # ____________________________________________________________
21
22 """Config's informations are, by default, volatiles. This means, all values and
23 settings changes will be lost.
24
25 The storage is the system Tiramisu uses to communicate with various DB.
26 You can specified a persistent storage.
27
28 Storage is basic components used to set Config informations in DB.
29 The primary "entry point" class is the StorageType and it's public
30 configurator ``set_storage()``.
31 """
32
33
34 from time import time
35 from tiramisu.error import ConfigError
36 from tiramisu.i18n import _
37
38
39 class StorageType(object):
40     """Object to store storage's type. If a Config is already set,
41     default storage is store as selected storage. You cannot change it
42     after.
43     """
44     default_storage = 'dictionary'
45     storage_type = None
46     mod = None
47
48     def set(self, name):
49         if self.storage_type is not None:
50             if self.storage_type == name:
51                 return
52             raise ConfigError(_('storage_type is already set, cannot rebind it'))
53         self.storage_type = name
54
55     def get(self):
56         if self.storage_type is None:
57             self.storage_type = self.default_storage
58         if self.mod is None:
59             modulepath = 'tiramisu.storage.{0}'.format(self.storage_type)
60             mod = __import__(modulepath)
61             for token in modulepath.split(".")[1:]:
62                 mod = getattr(mod, token)
63             self.mod = mod
64         return self.mod
65
66
67 storage_type = StorageType()
68 storage_option_type = StorageType()
69
70
71 def set_storage(type_, name, **kwargs):
72     """Change storage's configuration
73
74     :params name: is the storage name. If storage is already set, cannot
75         reset storage name
76
77     Other attributes are differents according to the selected storage's name
78     """
79     if type_ == 'option':
80         storage_option_type.set(name)
81         setting = storage_option_type.get().setting
82     else:
83         storage_type.set(name)
84         setting = storage_type.get().setting
85     for option, value in kwargs.items():
86         try:
87             getattr(setting, option)
88             setattr(setting, option, value)
89         except AttributeError:
90             raise ValueError(_('option {0} not already exists in storage {1}'
91                                '').format(option, name))
92
93
94 def _impl_getstate_setting():
95     setting = storage_type.get().setting
96     state = {'name': storage_type.storage_type}
97     for var in dir(setting):
98         if not var.startswith('_'):
99             state[var] = getattr(setting, var)
100     return state
101
102
103 def get_storage(type_, session_id, persistent, test):
104     """all used when __setstate__ a Config
105     """
106     if type_ == 'option':
107         return storage_option_type.get().Storage(session_id, persistent, test)
108     else:
109         return storage_type.get().Storage(session_id, persistent, test)
110
111
112 def get_storages(context, session_id, persistent):
113     def gen_id(config):
114         return str(id(config)) + str(time())
115
116     if session_id is None:
117         session_id = gen_id(context)
118     imp = storage_type.get()
119     storage = imp.Storage(session_id, persistent)
120     return imp.Settings(storage), imp.Values(storage)
121
122
123 def get_storages_option():
124     imp = storage_option_type.get()
125     return imp.Base, imp.OptionDescription
126
127
128 def list_sessions(type_):
129     """List all available session (persistent or not persistent)
130     """
131     if type_ == 'option':
132         return storage_option_type.get().list_sessions()
133     else:
134         return storage_type.get().list_sessions()
135
136
137 def delete_session(type_, session_id):
138     """Delete a selected session, be careful, you can deleted a session
139     use by an other instance
140     :params session_id: id of session to delete
141     """
142     if type_ == 'option':
143         return storage_option_type.get().delete_session(session_id)
144     else:
145         return storage_type.get().delete_session(session_id)
146
147
148 __all__ = (set_storage, list_sessions, delete_session)