mirror of
https://github.com/python/cpython.git
synced 2025-01-24 01:54:02 +08:00
dbm.dumb was opening files without specifying the encoding. Caused problem on
at least OS X where the default is macroman. Closes issue #4382.
This commit is contained in:
parent
02c3b5cc30
commit
2b5d6ebfe5
@ -66,9 +66,9 @@ class _Database(collections.MutableMapping):
|
|||||||
|
|
||||||
# Mod by Jack: create data file if needed
|
# Mod by Jack: create data file if needed
|
||||||
try:
|
try:
|
||||||
f = _io.open(self._datfile, 'r')
|
f = _io.open(self._datfile, 'r', encoding="Latin-1")
|
||||||
except IOError:
|
except IOError:
|
||||||
f = _io.open(self._datfile, 'w')
|
f = _io.open(self._datfile, 'w', encoding="Latin-1")
|
||||||
self._chmod(self._datfile)
|
self._chmod(self._datfile)
|
||||||
f.close()
|
f.close()
|
||||||
self._update()
|
self._update()
|
||||||
@ -77,7 +77,7 @@ class _Database(collections.MutableMapping):
|
|||||||
def _update(self):
|
def _update(self):
|
||||||
self._index = {}
|
self._index = {}
|
||||||
try:
|
try:
|
||||||
f = _io.open(self._dirfile, 'r')
|
f = _io.open(self._dirfile, 'r', encoding="Latin-1")
|
||||||
except IOError:
|
except IOError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
@ -108,7 +108,7 @@ class _Database(collections.MutableMapping):
|
|||||||
except self._os.error:
|
except self._os.error:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
f = self._io.open(self._dirfile, 'w')
|
f = self._io.open(self._dirfile, 'w', encoding="Latin-1")
|
||||||
self._chmod(self._dirfile)
|
self._chmod(self._dirfile)
|
||||||
for key, pos_and_siz_pair in self._index.items():
|
for key, pos_and_siz_pair in self._index.items():
|
||||||
# Use Latin-1 since it has no qualms with any value in any
|
# Use Latin-1 since it has no qualms with any value in any
|
||||||
@ -159,9 +159,9 @@ class _Database(collections.MutableMapping):
|
|||||||
# 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 = _io.open(self._dirfile, 'a')
|
f = _io.open(self._dirfile, 'a', encoding="Latin-1")
|
||||||
self._chmod(self._dirfile)
|
self._chmod(self._dirfile)
|
||||||
f.write("%r, %r\n" % (key, pos_and_siz_pair))
|
f.write("%r, %r\n" % (key.decode("Latin-1"), pos_and_siz_pair))
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
def __setitem__(self, key, val):
|
def __setitem__(self, key, val):
|
||||||
@ -169,8 +169,10 @@ class _Database(collections.MutableMapping):
|
|||||||
key = key.encode('utf-8')
|
key = key.encode('utf-8')
|
||||||
elif not isinstance(key, (bytes, bytearray)):
|
elif not isinstance(key, (bytes, bytearray)):
|
||||||
raise TypeError("keys must be bytes or strings")
|
raise TypeError("keys must be bytes or strings")
|
||||||
if not isinstance(val, (bytes, bytearray)):
|
if isinstance(val, str):
|
||||||
raise TypeError("values must be bytes")
|
val = val.encode('utf-8')
|
||||||
|
elif not isinstance(val, (bytes, bytearray)):
|
||||||
|
raise TypeError("values must be bytes or strings")
|
||||||
if key not in self._index:
|
if key not in self._index:
|
||||||
self._addkey(key, self._addval(val))
|
self._addkey(key, self._addval(val))
|
||||||
else:
|
else:
|
||||||
|
@ -22,6 +22,9 @@ Core and Builtins
|
|||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #4382: dbm.dumb did not specify the expected file encoding for opened
|
||||||
|
files.
|
||||||
|
|
||||||
- Issue #4383: When IDLE cannot make the connection to its subprocess, it would
|
- Issue #4383: When IDLE cannot make the connection to its subprocess, it would
|
||||||
fail to properly display the error message.
|
fail to properly display the error message.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user