]> git.phdru.name Git - m_lib.git/blob - m_lib/hash/MKhash.py
Raise Error(message) for Py3 compatibility
[m_lib.git] / m_lib / hash / MKhash.py
1 """(g)dbm-compatible interface to MetaKit"""
2
3 import sys
4 try:
5     import Mk4py
6 except ImportError:
7     # prevent a second import of this module from spuriously succeeding
8     del sys.modules[__name__]
9     raise
10
11
12 __all__ = ["error", "open"]
13
14 error = ValueError
15
16
17 class MKhash:
18     def __init__(self, file, flag, mode=0666, trans_threshold=1000):
19         self.read_only = 0
20         self._closed = 0
21
22         self.trans_threshold = trans_threshold
23         self._transcount = 0 # transactions counter - for commiting transactions
24
25         if flag in ('c', 'n'):
26             mode = 1
27         elif flag == 'r':
28             mode = 0
29             self.read_only = 1
30         else:
31             mode = 2
32
33         self.db = db = Mk4py.storage(file, mode)
34         if mode == 1:
35             self.vw = db.getas("hash[key:S,value:S]")
36         else:
37             self.vw = db.view("hash")
38
39     def __del__(self):
40         self.close()
41
42     def keys(self):
43         return map(lambda x: x.key, self.vw)
44
45     def __len__(self):
46         return len(self.vw)
47
48     def has_key(self, key):
49         return self.vw.find(key=key)+1
50
51     def get(self, key, default=None):
52         if self.has_key(key):
53             return self[key]
54         return default
55
56     def __getitem__(self, key):
57         vw = self.vw
58         ix = vw.find(key=key)
59         if ix == -1:
60             raise KeyError(key)
61         return vw[ix].value
62
63     def __setitem__(self, key, value):
64         vw = self.vw
65         ix = vw.find(key=key)
66         if ix == -1:
67             vw.append(key=key, value=value)
68         else:
69             vw[ix].value = value
70         self._add_tran()
71
72     def __delitem__(self, key):
73         vw = self.vw
74         ix = vw.find(key=key)
75         if ix == -1:
76             raise KeyError(key)
77         vw.delete(ix)
78         self._add_tran()
79
80     def close(self):
81         if self._closed: return
82         if not self.read_only: self.db.commit()
83         del self.db
84         self._closed = 1
85
86     def _add_tran(self):
87         self._transcount = self._transcount + 1
88         if self._transcount == self.trans_threshold:
89             self._transcount = 0
90             self.db.commit()
91
92
93 def open(file, flag, mode=0666):
94     return MKhash(file, flag, mode)