comment 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 """Storage connections, executions and managements.
23
24 Storage is basic components used to set Config informations in DB.
25 The primary "entry point" class into this package is the StorageType and it's
26 public configurator ``set_storage()``.
27 """
28
29
30 from time import time
31 from tiramisu.error import ConfigError
32 from tiramisu.i18n import _
33
34
35 class StorageType(object):
36     """Object to store storage's type. If a Config is already set,
37     default storage is store as selected storage. You cannot change it
38     after.
39     """
40     default_storage = 'dictionary'
41     storage_type = None
42     mod = None
43
44     def set(self, name):
45         if self.storage_type is not None:
46             raise ConfigError(_('storage_type is already set, cannot rebind it'))
47         self.storage_type = name
48
49     def get(self):
50         if self.storage_type is None:
51             self.storage_type = self.default_storage
52         storage = self.storage_type
53         if self.mod is None:
54             modulepath = 'tiramisu.storage.{0}'.format(storage)
55             mod = __import__(modulepath)
56             for token in modulepath.split(".")[1:]:
57                 mod = getattr(mod, token)
58             self.mod = mod
59         return self.mod
60
61
62 storage_type = StorageType()
63
64
65 def set_storage(name, **args):
66     """Change storage's configuration
67
68     :params name: is the storage name. If storage is already set, cannot
69         reset storage name
70
71     Other attributes are differents according to the selected storage's name
72     """
73     storage_type.set(name)
74     settings = storage_type.get().Setting()
75     for option, value in args.items():
76         try:
77             getattr(settings, option)
78             setattr(settings, option, value)
79         except AttributeError:
80             raise ValueError(_('option {0} not already exists in storage {1}'
81                                '').format(option, name))
82
83
84 def get_storage(context, session_id, persistent):
85     def gen_id(config):
86         return str(id(config)) + str(time())
87
88     if session_id is None:
89         session_id = gen_id(context)
90     imp = storage_type.get()
91     storage = imp.Storage(session_id, persistent)
92     return imp.Settings(storage), imp.Values(storage)
93
94
95 def list_sessions():
96     """List all available session (persistent or not persistent)
97     """
98     return storage_type.get().list_sessions()
99
100
101 def delete_session(session_id):
102     """Delete a selected session, be careful, you can deleted a session
103     use by an other instance
104     """
105     return storage_type.get().delete_session(session_id)
106
107
108 __all__ = (set_storage, list_sessions, delete_session)