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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy