[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:
parent
b29069d6b6
commit
dc26758ffe
|
@ -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):
|
||||||
|
|
|
@ -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'
|
||||||
|
|
Loading…
Reference in New Issue