8000 gh-135386: Fix dbm.sqlite3 readonly open error by using immutable=1 · python/cpython@779faf2 · GitHub
[go: up one dir, main page]

Skip to content

Commit 779faf2

Browse files
blurb-it[bot]GeneralK1ng
authored andcommitted
gh-135386: Fix dbm.sqlite3 readonly open error by using immutable=1
1 parent 761f178 commit 779faf2

File tree

3 files changed

+19
-0
lines changed

3 files changed

+19
-0
lines changed

Lib/dbm/sqlite3.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ def __init__(self, path, /, *, flag, mode):
6969
self._cx = sqlite3.connect(uri, autocommit=True, uri=True)
7070
except sqlite3.Error as exc:
7171
raise error(str(exc))
72+
7273
self._readonly = (flag == "ro")
7374
# This is an optimization only; it's ok if it fails.
7475
if not self._readonly:

Lib/test/test_dbm_sqlite3.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import os
12
import sys
23
import unittest
34
from contextlib import closing
@@ -89,6 +90,22 @@ def test_readonly_keys(self):
8990
def test_readonly_iter(self):
9091
self.assertEqual([k for k in self.db], [b"key1", b"key2"])
9192

93+
def test_readonly_open_without_wal_shm(self):
94+
wal_path = self.filename + "-wal"
95+
shm_path = self.filename + "-shm"
96+
97+
for suffix in wal_path, shm_path:
98+
try:
99+
os.remove(suffix)
100+
except FileNotFoundError:
101+
pass
102+
103+
os.chmod(self.filename, 0o444)
104+
105+
with dbm_sqlite3.open(self.filename, "r") as db:
106+
self.assertEqual(db[b"key1"], b"value1")
107+
self.assertEqual(db[b"key2"], b"value2")
108+
92109

93110
class ReadWrite(_SQLiteDbmTests):
94111

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix :exc:`sqlite3.OperationalError` error when using :func:`dbm.open` with a read-only file object.

0 commit comments

Comments
 (0)
0