1 """Provide a (g)dbm-compatible interface to ZODB.
2 Author: Oleg Broytman <phd@phd.pp.ru>
3 Copyright (C) 2001-2002 PhiloSoft Design
9 from ZODB import FileStorage, DB, POSException
11 # prevent a second import of this module from spuriously succeeding
12 del sys.modules[__name__]
16 __all__ = ["error", "open"]
18 error = POSException.POSError # Exported for anydbm
22 def __init__(self, file, flag, mode=0666, trans_threshold=1000):
23 create = (flag == 'n') # force recreation
24 # if flag == 'w' or 'c' and file does not exist FileStorage will set it to 1 for us
26 self.read_only = read_only = (flag == 'r')
29 self.trans_threshold = trans_threshold
30 self._transcount = 0 # transactions counter - for commiting transactions
32 storage = FileStorage.FileStorage(file, create=create, read_only = read_only)
34 self.conn = conn = db.open()
35 self.dbroot = conn.root()
41 return self.dbroot.keys()
44 return len(self.dbroot)
46 def has_key(self, key):
47 return self.dbroot.has_key(key)
49 def get(self, key, default=None):
50 if self.dbroot.has_key(key):
54 def __getitem__(self, key):
55 return self.dbroot[key]
57 def __setitem__(self, key, value):
58 self.dbroot[key] = value
61 def __delitem__(self, key):
66 if self._closed: return
67 if not self.read_only:
68 get_transaction().commit()
69 self.conn.db().close()
74 self._transcount = self._transcount + 1
75 if self._transcount == self.trans_threshold:
77 get_transaction().commit()
80 def open(file, flag, mode=0666):
81 return ZODBhash(file, flag, mode)