Skip to content

Commit 9d0736b

Browse files
committed
Add support for loadBeforeEx
zc.zlibstorage wraps base storage and includes generic __getattr__ to forward all unknown attribute access to base: https://github.com/zopefoundation/zc.zlibstorage/blob/6d5a3c75/src/zc/zlibstorage/__init__.py#L52-L53 But if base implements loadBeforeEx (zopefoundation/ZODB#323) the following scenario is then possible: ZODB sees that zlibstorage provides loadBeforeEx and loads data via loadBeforeEx instead of loadBefore, but the data are loaded not decompressed, and ZODB complains about "broken pickle". -> let's fix this by explicitly wrapping loadBeforeEx if base storage provides it.
1 parent 8df6c70 commit 9d0736b

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

src/zc/zlibstorage/__init__.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ def __init__(self, base, *args, **kw):
4141
self._transform = lambda data: data
4242
self._untransform = decompress
4343

44+
if hasattr(base, 'loadBeforeEx'):
45+
self.loadBeforeEx = self._loadBeforeEx
46+
4447
for name in self.copied_methods:
4548
v = getattr(base, name, None)
4649
if v is not None:
@@ -60,6 +63,12 @@ def load(self, oid, version=''):
6063
data, serial = self.base.load(oid, version)
6164
return self._untransform(data), serial
6265

66+
def _loadBeforeEx(self, oid, tid):
67+
data, serial = self.base.loadBeforeEx(oid, tid)
68+
if data is not None:
69+
data = self._untransform(data)
70+
return data, serial
71+
6372
def loadBefore(self, oid, tid):
6473
r = self.base.loadBefore(oid, tid)
6574
if r is not None:
@@ -153,7 +162,7 @@ class ServerZlibStorage(ZlibStorage):
153162
"""
154163

155164
copied_methods = ZlibStorage.copied_methods + (
156-
'load', 'loadBefore', 'loadSerial', 'store', 'restore',
165+
'load', 'loadBefore', 'loadBeforeEx', 'loadSerial', 'store', 'restore',
157166
'iterator', 'storeBlob', 'restoreBlob', 'record_iternext',
158167
)
159168

0 commit comments

Comments
 (0)