]> git.phdru.name Git - m_lib.git/blob - m_lib/hash/ZODBhash.py
Fix octals (066 => 0o666) for Py3 compatibility
[m_lib.git] / m_lib / hash / ZODBhash.py
1 """(g)dbm-compatible interface to ZODB"""
2
3 import sys
4 try:
5     from ZODB import FileStorage, DB, POSException
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 = POSException.POSError                     # Exported for anydbm
15
16
17 class ZODBhash:
18     def __init__(self, file, flag, mode=0o666, trans_threshold=1000):
19         create = (flag == 'n') # force recreation
20         # if flag == 'w' or 'c' and file does not exist FileStorage will set it to 1 for us 
21
22         self.read_only = read_only = (flag == 'r')
23         self._closed = 0
24
25         self.trans_threshold = trans_threshold
26         self._transcount = 0 # transactions counter - for commiting transactions
27
28         storage = FileStorage.FileStorage(file, create=create, read_only = read_only)
29         db = DB(storage)
30         self.conn = conn = db.open()
31         self.dbroot = conn.root()
32
33     def __del__(self):
34         self.close()
35
36     def keys(self):
37         return self.dbroot.keys()
38
39     def __len__(self):
40         return len(self.dbroot)
41
42     def has_key(self, key):
43         return self.dbroot.has_key(key)
44
45     def get(self, key, default=None):
46         if self.dbroot.has_key(key):
47             return self[key]
48         return default
49
50     def __getitem__(self, key):
51         return self.dbroot[key]
52
53     def __setitem__(self, key, value):
54         self.dbroot[key] = value
55         self._add_tran()
56
57     def __delitem__(self, key):
58         del self.dbroot[key]
59         self._add_tran()
60
61     def close(self):
62         if self._closed: return
63         if not self.read_only:
64             get_transaction().commit()
65             self.conn.db().close()
66         self.conn.close()
67         self._closed = 1
68
69     def _add_tran(self):
70         self._transcount = self._transcount + 1
71         if self._transcount == self.trans_threshold:
72             self._transcount = 0
73             get_transaction().commit()
74
75
76 def open(file, flag, mode=0o666):
77     return ZODBhash(file, flag, mode)