[Zope3-checkins] CVS: Zope3/src/zodb/storage/file - format.py:1.1.2.3
Jeremy Hylton
jeremy@zope.com
Fri, 18 Apr 2003 12:13:14 -0400
Update of /cvs-repository/Zope3/src/zodb/storage/file
In directory cvs.zope.org:/tmp/cvs-serv19539/file
Modified Files:
Tag: jeremy-new-pack-branch
format.py
Log Message:
Add an optional to _loadBack_impl to provide data even for 0 backpointer.
Useful for packing George Bailey.
=== Zope3/src/zodb/storage/file/format.py 1.1.2.2 => 1.1.2.3 ===
--- Zope3/src/zodb/storage/file/format.py:1.1.2.2 Wed Apr 16 14:20:52 2003
+++ Zope3/src/zodb/storage/file/format.py Fri Apr 18 12:13:13 2003
@@ -395,8 +395,13 @@
h.ext = self._file.read(h.elen)
return h
- def _loadBack_impl(self, oid, back):
+ def _loadBack_impl(self, oid, back, fail):
# shared implementation used by various _loadBack methods
+ #
+ # If the backpointer ultimately resolves to 0:
+ # If fail is True, raise KeyError for zero backpointer.
+ # If fail is False, return the empty data from the record
+ # with no backpointer.
while 1:
if not back:
# If backpointer is 0, object does not currently exist.
@@ -405,20 +410,23 @@
refs = self._file.read(h.nrefs * 8)
if h.plen:
return self._file.read(h.plen), refs, h.serial, back, h.tloc
+ if h.back == 0 and not fail:
+ assert h.nrefs == 0
+ return None, None, h.serial, back, h.tloc
back = h.back
- def _loadBack(self, oid, back):
- data, refs, serial, old, tloc = self._loadBack_impl(oid, back)
+ def _loadBack(self, oid, back, fail=True):
+ data, refs, serial, old, tloc = self._loadBack_impl(oid, back, fail)
return data, serial
- def _loadBackPOS(self, oid, back):
+ def _loadBackPOS(self, oid, back, fail=True):
"""Return position of data record for backpointer."""
- data, refs, serial, old, tloc = self._loadBack_impl(oid, back)
+ data, refs, serial, old, tloc = self._loadBack_impl(oid, back, fail)
return old
- def _loadBackTxn(self, oid, back):
+ def _loadBackTxn(self, oid, back, fail=True):
"""Return data, serial, and txn id for backpointer."""
- data, refs, serial, old, tloc = self._loadBack_impl(oid, back)
+ data, refs, serial, old, tloc = self._loadBack_impl(oid, back, fail)
self._file.seek(tloc)
h = self._file.read(TRANS_HDR_LEN)
tid = h[:8]