[Bug #802128] Make the mode argument of dumbdbm actually work the way it's

described, and add a test for it.

2.5 bugfix candidate, maybe; arguably this patch changes the API of
dumbdbm and shouldn't be added in a point-release.
This commit is contained in:
Andrew M. Kuchling 2006-12-22 15:04:45 +00:00
parent b29069d6b6
commit dc26758ffe
2 changed files with 23 additions and 3 deletions

View File

@ -68,7 +68,8 @@ class _Database(UserDict.DictMixin):
try: try:
f = _open(self._datfile, 'r') f = _open(self._datfile, 'r')
except IOError: except IOError:
f = _open(self._datfile, 'w', self._mode) f = _open(self._datfile, 'w')
self._chmod(self._datfile)
f.close() f.close()
self._update() self._update()
@ -106,7 +107,8 @@ class _Database(UserDict.DictMixin):
except self._os.error: except self._os.error:
pass pass
f = self._open(self._dirfile, 'w', self._mode) f = self._open(self._dirfile, 'w')
self._chmod(self._dirfile)
for key, pos_and_siz_pair in self._index.iteritems(): for key, pos_and_siz_pair in self._index.iteritems():
f.write("%r, %r\n" % (key, pos_and_siz_pair)) f.write("%r, %r\n" % (key, pos_and_siz_pair))
f.close() f.close()
@ -152,7 +154,8 @@ class _Database(UserDict.DictMixin):
# the in-memory index dict, and append one to the directory file. # the in-memory index dict, and append one to the directory file.
def _addkey(self, key, pos_and_siz_pair): def _addkey(self, key, pos_and_siz_pair):
self._index[key] = pos_and_siz_pair self._index[key] = pos_and_siz_pair
f = _open(self._dirfile, 'a', self._mode) f = _open(self._dirfile, 'a')
self._chmod(self._dirfile)
f.write("%r, %r\n" % (key, pos_and_siz_pair)) f.write("%r, %r\n" % (key, pos_and_siz_pair))
f.close() f.close()
@ -214,6 +217,9 @@ class _Database(UserDict.DictMixin):
__del__ = close __del__ = close
def _chmod (self, file):
if hasattr(self._os, 'chmod'):
self._os.chmod(file, self._mode)
def open(file, flag=None, mode=0666): def open(file, flag=None, mode=0666):

View File

@ -38,6 +38,20 @@ class DumbDBMTestCase(unittest.TestCase):
self.read_helper(f) self.read_helper(f)
f.close() f.close()
def test_dumbdbm_creation_mode(self):
# On platforms without chmod, don't do anything.
if not hasattr(os, 'chmod'):
return
f = dumbdbm.open(_fname, 'c', 0632)
f.close()
import stat
st = os.stat(_fname + '.dat')
self.assertEqual(stat.S_IMODE(st.st_mode), 0632)
st = os.stat(_fname + '.dir')
self.assertEqual(stat.S_IMODE(st.st_mode), 0632)
def test_close_twice(self): def test_close_twice(self):
f = dumbdbm.open(_fname) f = dumbdbm.open(_fname)
f['a'] = 'b' f['a'] = 'b'