storage no more in setting.py, code is now in storage/__init__.py
[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 """Storage connections, executions and managements.
23
24 Storage is basic components used to set informations in DB
25 """
26
27
28 from time import time
29 from tiramisu.error import ConfigError
30 from tiramisu.i18n import _
31
32
33 class StorageType(object):
34     default_storage = 'dictionary'
35     storage_type = None
36     mod = None
37
38     def set(self, name):
39         if self.storage_type is not None:
40             raise ConfigError(_('storage_type is already set, cannot rebind it'))
41         self.storage_type = name
42
43     def get(self):
44         if self.storage_type is None:
45             self.storage_type = self.default_storage
46         storage = self.storage_type
47         if self.mod is None:
48             modulepath = 'tiramisu.storage.{0}'.format(storage)
49             mod = __import__(modulepath)
50             for token in modulepath.split(".")[1:]:
51                 mod = getattr(mod, token)
52             self.mod = mod
53         return self.mod
54
55
56 storage_type = StorageType()
57
58
59 def set_storage(name, **args):
60     storage_type.set(name)
61     settings = storage_type.get().Setting()
62     for option, value in args.items():
63         try:
64             getattr(settings, option)
65             setattr(settings, option, value)
66         except AttributeError:
67             raise ValueError(_('option {0} not already exists in storage {1}'
68                                '').format(option, name))
69
70
71 def get_storage(context, session_id, persistent):
72     def gen_id(config):
73         return str(id(config)) + str(time())
74
75     if session_id is None:
76         session_id = gen_id(context)
77     imp = storage_type.get()
78     storage = imp.Storage(session_id, persistent)
79     return imp.Settings(storage), imp.Values(storage)
80
81
82 def list_sessions():
83     return storage_type.get().list_sessions()
84
85
86 def delete_session(session_id):
87     return storage_type.get().delete_session(session_id)
88
89
90 #__all__ = (,)