blob: f931e93e228dde5d2c4f4eda7cb65835be089a42 [file] [log] [blame]
Guido van Rossume8769491992-08-13 12:14:11 +00001# A wrapper around the (optional) built-in class dbm, supporting keys
2# and values of almost any type instead of just string.
3# (Actually, this works only for keys and values that can be read back
4# correctly after being converted to a string.)
5
6
Guido van Rossume8769491992-08-13 12:14:11 +00007class Dbm:
8
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +00009 def __init__(self, filename, mode, perm):
Georg Brandl0a7ac7d2008-05-26 10:29:35 +000010 import dbm.ndbm
11 self.db = dbm.ndbm.open(filename, mode, perm)
Guido van Rossume8769491992-08-13 12:14:11 +000012
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000013 def __repr__(self):
14 s = ''
Skip Montanaro1e8ce582007-08-06 21:07:53 +000015 for key in self.keys():
Walter Dörwald70a6b492004-02-12 17:35:32 +000016 t = repr(key) + ': ' + repr(self[key])
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000017 if s: t = ', ' + t
18 s = s + t
19 return '{' + s + '}'
Guido van Rossume8769491992-08-13 12:14:11 +000020
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000021 def __len__(self):
22 return len(self.db)
Guido van Rossume8769491992-08-13 12:14:11 +000023
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000024 def __getitem__(self, key):
Walter Dörwald70a6b492004-02-12 17:35:32 +000025 return eval(self.db[repr(key)])
Guido van Rossume8769491992-08-13 12:14:11 +000026
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000027 def __setitem__(self, key, value):
Walter Dörwald70a6b492004-02-12 17:35:32 +000028 self.db[repr(key)] = repr(value)
Guido van Rossume8769491992-08-13 12:14:11 +000029
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000030 def __delitem__(self, key):
Walter Dörwald70a6b492004-02-12 17:35:32 +000031 del self.db[repr(key)]
Guido van Rossume8769491992-08-13 12:14:11 +000032
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000033 def keys(self):
34 res = []
Skip Montanaro1e8ce582007-08-06 21:07:53 +000035 for key in self.db.keys():
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000036 res.append(eval(key))
37 return res
Guido van Rossume8769491992-08-13 12:14:11 +000038
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000039 def has_key(self, key):
Collin Winter6f2df4d2007-07-17 20:59:35 +000040 return repr(key) in self.db
Guido van Rossume8769491992-08-13 12:14:11 +000041
42
43def test():
Collin Winter6f2df4d2007-07-17 20:59:35 +000044 d = Dbm('@dbm', 'rw', 0o600)
45 print(d)
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000046 while 1:
47 try:
Collin Winter6f2df4d2007-07-17 20:59:35 +000048 key = eval(input('key: '))
49 if key in d:
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000050 value = d[key]
Collin Winter6f2df4d2007-07-17 20:59:35 +000051 print('currently:', value)
52 value = eval(input('value: '))
Benjamin Peterson2a691a82008-03-31 01:51:45 +000053 if value is None:
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000054 del d[key]
55 else:
56 d[key] = value
57 except KeyboardInterrupt:
Collin Winter6f2df4d2007-07-17 20:59:35 +000058 print('')
59 print(d)
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000060 except EOFError:
Collin Winter6f2df4d2007-07-17 20:59:35 +000061 print('[eof]')
Andrew M. Kuchling946c53e2003-04-24 17:13:18 +000062 break
Collin Winter6f2df4d2007-07-17 20:59:35 +000063 print(d)
Guido van Rossume8769491992-08-13 12:14:11 +000064
65
66test()