Dbm.py revision e876949f2b8a68646cac269cff9fd1c71975d3ac
1e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum# A wrapper around the (optional) built-in class dbm, supporting keys
2e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum# and values of almost any type instead of just string.
3e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum# (Actually, this works only for keys and values that can be read back
4e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum# correctly after being converted to a string.)
5e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
6e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
7e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossumdef opendbm(filename, mode, perm):
8e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	return Dbm().init(filename, mode, perm)
9e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
10e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
11e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossumclass Dbm:
12e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
13e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	def init(self, filename, mode, perm):
14e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		import dbm
15e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		self.db = dbm.open(filename, mode, perm)
16e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		return self
17e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
18e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	def __repr__(self):
19e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		s = ''
20e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		for key in self.keys():
21e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			t = `key` + ': ' + `self[key]`
22e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			if s: t = t + ', '
23e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			s = s + t
24e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		return '{' + s + '}'
25e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
26e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	def __len__(self):
27e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		return len(self.db)
28e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
29e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	def __getitem__(self, key):
30e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		return eval(self.db[`key`])
31e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
32e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	def __setitem__(self, key, value):
33e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		self.db[`key`] = `value`
34e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
35e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	def __delitem__(self, key):
36e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		del self.db[`key`]
37e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
38e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	def keys(self):
39e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		res = []
40e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		for key in self.db.keys():
41e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			res.append(eval(key))
42e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		return res
43e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
44e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	def has_key(self, key):
45e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		return self.db.has_key(`key`)
46e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
47e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
48e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossumdef test():
49e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	d = opendbm('@dbm', 'rw', 0666)
50e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	print d
51e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	while 1:
52e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		try:
53e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			key = eval(raw_input('key: '))
54e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			if d.has_key(key):
55e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum				value = d[key]
56e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum				print 'currently:', value
57e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			value = eval(raw_input('value: '))
58e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			if value == None:
59e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum				del d[key]
60e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			else:
61e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum				d[key] = value
62e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		except KeyboardInterrupt:
63e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			print ''
64e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			print d
65e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum		except EOFError:
66e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			print '[eof]'
67e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum			break
68e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum	print d
69e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
70e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossum
71e876949f2b8a68646cac269cff9fd1c71975d3acGuido van Rossumtest()
72