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