[Zope3-checkins] CVS: Zope3/src/zodb/storage/file - pack.py:1.1.2.6

Jeremy Hylton jeremy@zope.com
Fri, 18 Apr 2003 12:17:43 -0400


Update of /cvs-repository/Zope3/src/zodb/storage/file
In directory cvs.zope.org:/tmp/cvs-serv20152/file

Modified Files:
      Tag: jeremy-new-pack-branch
	pack.py 
Log Message:
Fix packing of George Bailey events and add test of this case.


=== Zope3/src/zodb/storage/file/pack.py 1.1.2.5 => 1.1.2.6 ===
--- Zope3/src/zodb/storage/file/pack.py:1.1.2.5	Thu Apr 17 19:05:01 2003
+++ Zope3/src/zodb/storage/file/pack.py	Fri Apr 18 12:17:12 2003
@@ -270,6 +270,18 @@
 
         return pos, new_pos
 
+    def fetchBackpointer(self, oid, back):
+        """Return data and refs backpointer `back` to object `oid.
+
+        If `back` is 0 or ultimately resolves to 0, return None
+        and None.  In this case, the transaction undoes the object
+        creation.
+        """
+        if back == 0:
+            return None, None
+        data, refs, serial, tid = self._loadBackTxn(oid, back, False)
+        return data, refs
+
     def copyDataRecords(self, pos, th):
         """Copy any current data records between pos and tend.
 
@@ -303,15 +315,13 @@
             if h.plen:
                 refs = self._file.read(8 * h.nrefs)
                 data = self._file.read(h.plen)
-            elif h.back:
+            else:
                 # If a current record has a backpointer, fetch
                 # refs and data from the backpointer.  We need
                 # to write the data in the new record.
-                data, refs, serial, tid = self._loadBackTxn(h.oid, h.back)
-                refs = "".join(refs)
-            else:
-                data = ""
-                refs = ""
+                data, refs = self.fetchBackpointer(h.oid, h.back)
+                if refs is not None:
+                    refs = "".join(refs)
 
             self.writePackedDataRecord(h, data, refs, new_tpos)
             new_pos = self._tfile.tell()
@@ -321,6 +331,10 @@
     def writePackedDataRecord(self, h, data, refs, new_tpos):
         # Update the header to reflect current information, then write
         # it to the output file.
+        if data is None:
+            data = ""
+        if refs is None:
+            refs = ""
         h.prev = 0
         h.back = 0
         h.plen = len(data)
@@ -366,17 +380,8 @@
                 if h.plen:
                     data = self._file.read(h.plen)
                 else:
-                    if not h.back:
-                        # If the backpointer is 0, then this transaction
-                        # undoes the object creation.  It either aborts
-                        # the version that created the object or undid the
-                        # transaction that created it.  Return None
-                        # for data and refs because the backpointer has
-                        # the real data and refs.
-                        data = None
-                        refs = None
-                    else:
-                        data, refs, nil, nil = self._loadBackTxn(h.oid, h.back)
+                    data, refs = self.fetchBackpointer(h.oid, h.back)
+                    if h.back:
                         prev_txn = self.getTxnFromData(h.oid, h.back)
 
                 self._copier.copy(h.oid, h.serial, data, refs, h.version,