Skip to content

Commit e782fad

Browse files
Address Serhiy's offline remark: coerce keys/values to bytes
1 parent bc849c3 commit e782fad

File tree

2 files changed

+44
-35
lines changed

2 files changed

+44
-35
lines changed

Lib/dbm/sqlite3.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77

88
BUILD_TABLE = """
99
CREATE TABLE IF NOT EXISTS Dict (
10-
key TEXT UNIQUE NOT NULL,
10+
key BLOB UNIQUE NOT NULL,
1111
value BLOB NOT NULL
1212
)
1313
"""
1414
GET_SIZE = "SELECT COUNT (key) FROM Dict"
1515
LOOKUP_KEY = "SELECT value FROM Dict WHERE key = ?"
16-
STORE_KV = "REPLACE INTO Dict (key, value) VALUES (?, ?)"
16+
STORE_KV = "REPLACE INTO Dict (key, value) VALUES (CAST(? AS BLOB), CAST(? AS BLOB))"
1717
DELETE_KEY = "DELETE FROM Dict WHERE key = ?"
1818
ITER_KEYS = "SELECT key FROM Dict"
1919

Lib/test/test_dbm_sqlite3.py

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -61,31 +61,31 @@ class ReadOnly(_SQLiteDbmTests):
6161
def setUp(self):
6262
super().setUp()
6363
with dbm_sqlite3.open(self.filename, "w") as db:
64-
db["key1"] = "value1"
65-
db["key2"] = "value2"
64+
db[b"key1"] = "value1"
65+
db[b"key2"] = "value2"
6666
self.db = dbm_sqlite3.open(self.filename, "r")
6767

6868
def tearDown(self):
6969
self.db.close()
7070
super().tearDown()
7171

7272
def test_readonly_read(self):
73-
self.assertEqual(self.db["key1"], "value1")
74-
self.assertEqual(self.db["key2"], "value2")
73+
self.assertEqual(self.db[b"key1"], b"value1")
74+
self.assertEqual(self.db[b"key2"], b"value2")
7575

7676
def test_readonly_write(self):
7777
with self.assertRaises(dbm_sqlite3.error):
78-
self.db["new"] = "value"
78+
self.db[b"new"] = "value"
7979

8080
def test_readonly_delete(self):
8181
with self.assertRaises(dbm_sqlite3.error):
82-
del self.db["key1"]
82+
del self.db[b"key1"]
8383

8484
def test_readonly_keys(self):
85-
self.assertEqual(self.db.keys(), ["key1", "key2"])
85+
self.assertEqual(self.db.keys(), [b"key1", b"key2"])
8686

8787
def test_readonly_iter(self):
88-
self.assertEqual([k for k in self.db], ["key1", "key2"])
88+
self.assertEqual([k for k in self.db], [b"key1", b"key2"])
8989

9090

9191
class ReadWrite(_SQLiteDbmTests):
@@ -108,19 +108,19 @@ def test_readwrite_unique_key(self):
108108
self.db["key"] = "value"
109109
self.db["key"] = "other"
110110
keys, vals = self.db_content()
111-
self.assertEqual(keys, ["key"])
112-
self.assertEqual(vals, ["other"])
111+
self.assertEqual(keys, [b"key"])
112+
self.assertEqual(vals, [b"other"])
113113

114114
def test_readwrite_delete(self):
115115
self.db["key"] = "value"
116116
self.db["new"] = "other"
117117

118-
del self.db["new"]
118+
del self.db[b"new"]
119119
keys, vals = self.db_content()
120-
self.assertEqual(keys, ["key"])
121-
self.assertEqual(vals, ["value"])
120+
self.assertEqual(keys, [b"key"])
121+
self.assertEqual(vals, [b"value"])
122122

123-
del self.db["key"]
123+
del self.db[b"key"]
124124
keys, vals = self.db_content()
125125
self.assertEqual(keys, [])
126126
self.assertEqual(vals, [])
@@ -131,7 +131,7 @@ def test_readwrite_null_key(self):
131131

132132
def test_readwrite_null_value(self):
133133
with self.assertRaises(dbm_sqlite3.error):
134-
self.db["key"] = None
134+
self.db[b"key"] = None
135135

136136

137137
class Misuse(_SQLiteDbmTests):
@@ -147,7 +147,7 @@ def tearDown(self):
147147
def test_misuse_double_create(self):
148148
self.db["key"] = "value"
149149
with dbm_sqlite3.open(self.filename, "c") as db:
150-
self.assertEqual(db["key"], "value")
150+
self.assertEqual(db[b"key"], b"value")
151151

152152
def test_misuse_double_close(self):
153153
self.db.close()
@@ -159,13 +159,13 @@ def test_misuse_invalid_flag(self):
159159

160160
def test_misuse_double_delete(self):
161161
self.db["key"] = "value"
162-
del self.db["key"]
162+
del self.db[b"key"]
163163
with self.assertRaises(KeyError):
164-
del self.db["key"]
164+
del self.db[b"key"]
165165

166166
def test_misuse_invalid_key(self):
167167
with self.assertRaises(KeyError):
168-
self.db["key"]
168+
self.db[b"key"]
169169

170170
def test_misuse_iter_close1(self):
171171
self.db["1"] = 1
@@ -186,11 +186,11 @@ def test_misuse_iter_close2(self):
186186
def test_misuse_use_after_close(self):
187187
self.db.close()
188188
with self.assertRaises(dbm_sqlite3.error):
189-
self.db["read"]
189+
self.db[b"read"]
190190
with self.assertRaises(dbm_sqlite3.error):
191-
self.db["write"] = "value"
191+
self.db[b"write"] = "value"
192192
with self.assertRaises(dbm_sqlite3.error):
193-
del self.db["del"]
193+
del self.db[b"del"]
194194
with self.assertRaises(dbm_sqlite3.error):
195195
len(self.db)
196196
with self.assertRaises(dbm_sqlite3.error):
@@ -208,7 +208,12 @@ def test_misuse_empty_filename(self):
208208

209209
class DataTypes(_SQLiteDbmTests):
210210

211-
dataset = 10, 2.5, "string", b"bytes"
211+
dataset = (
212+
# (raw, coerced)
213+
(42, b"42"),
214+
(3.14, b"3.14"),
215+
("string", b"string"),
216+
)
212217

213218
def setUp(self):
214219
super().setUp()
@@ -219,16 +224,20 @@ def tearDown(self):
219224
super().tearDown()
220225

221226
def test_datatypes_values(self):
222-
for value in self.dataset:
223-
with self.subTest(value=value):
224-
self.db["key"] = value
225-
self.assertEqual(self.db["key"], value)
227+
for raw, coerced in self.dataset:
228+
with self.subTest(raw=raw, coerced=coerced):
229+
self.db["key"] = raw
230+
self.assertEqual(self.db[b"key"], coerced)
226231

227232
def test_datatypes_keys(self):
228-
for key in self.dataset:
229-
with self.subTest(key=key):
230-
self.db[key] = "value"
231-
self.assertEqual(self.db[key], "value")
233+
for raw, coerced in self.dataset:
234+
with self.subTest(raw=raw, coerced=coerced):
235+
self.db[raw] = "value"
236+
self.assertEqual(self.db[coerced], b"value")
237+
with self.assertRaises(KeyError):
238+
self.db[raw]
239+
with self.assertRaises(KeyError):
240+
del self.db[raw]
232241

233242

234243
class CorruptDatabase(_SQLiteDbmTests):
@@ -284,9 +293,9 @@ def test_corrupt_readwrite(self):
284293
def test_corrupt_force_new(self):
285294
with closing(dbm_sqlite3.open(self.filename, "n")) as db:
286295
db["foo"] = "write"
287-
_ = db["foo"]
296+
_ = db[b"foo"]
288297
next(iter(db))
289-
del db["foo"]
298+
del db[b"foo"]
290299

291300

292301
if __name__ == "__main__":

0 commit comments

Comments
 (0)