Skip to content

Commit 5a3d125

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 6d5a3c7 commit 5a3d125

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
@@ -40,6 +40,9 @@ def __init__(self, base, *args, **kw):
4040
self._transform = lambda data: data
4141
self._untransform = decompress
4242

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

65+
def _loadBeforeEx(self, oid, tid):
66+
data, serial = self.base.loadBeforeEx(oid, tid)
67+
if data is not None:
68+
data = self._untransform(data)
69+
return data, serial
70+
6271
def loadBefore(self, oid, tid):
6372
r = self.base.loadBefore(oid, tid)
6473
if r is not None:
@@ -151,7 +160,7 @@ class ServerZlibStorage(ZlibStorage):
151160
"""
152161

153162
copied_methods = ZlibStorage.copied_methods + (
154-
'load', 'loadBefore', 'loadSerial', 'store', 'restore',
163+
'load', 'loadBefore', 'loadBeforeEx', 'loadSerial', 'store', 'restore',
155164
'iterator', 'storeBlob', 'restoreBlob', 'record_iternext',
156165
)
157166

0 commit comments

Comments
 (0)