Commit 2b5d6ebf authored by Brett Cannon's avatar Brett Cannon

dbm.dumb was opening files without specifying the encoding. Caused problem on

at least OS X where the default is macroman.

Closes issue #4382.
parent 02c3b5cc
...@@ -66,9 +66,9 @@ class _Database(collections.MutableMapping): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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 ...@@ -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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment