[Zope-Checkins] CVS: ZODB3/ZODB - DemoStorage.py:1.14.4.1

Jeremy Hylton jeremy@zope.com
Tue, 29 Apr 2003 17:35:32 -0400


Update of /cvs-repository/ZODB3/ZODB
In directory cvs.zope.org:/tmp/cvs-serv4563/ZODB

Modified Files:
      Tag: ZODB3-3_1-branch
	DemoStorage.py 
Log Message:
Two backports.

Fix undoLog() to process arguments correctly.
Fix edge case in pack() -- backpointer to object created in version.


=== ZODB3/ZODB/DemoStorage.py 1.14 => 1.14.4.1 ===
--- ZODB3/ZODB/DemoStorage.py:1.14	Wed Aug 28 14:48:59 2002
+++ ZODB3/ZODB/DemoStorage.py	Tue Apr 29 17:35:32 2003
@@ -90,7 +90,6 @@
 class DemoStorage(BaseStorage.BaseStorage):
 
     def __init__(self, name='Demo Storage', base=None, quota=None):
-
         BaseStorage.BaseStorage.__init__(self, name, base)
 
         # We use a BTree because the items are sorted!
@@ -141,8 +140,8 @@
             oids = []
             for r in v.values():
                 oid, serial, pre, (version, nv), p = r
+                oids.append(oid)
                 if nv:
-                    oids.append(oid)
                     oid, serial, pre, vdata, p = nv
                     self._tindex.append([oid, serial, r, None, p])
                 else:
@@ -226,13 +225,16 @@
 
         self._lock_acquire()
         try:
-            old=self._index.get(oid, None)
+            old = self._index.get(oid, None)
             if old is None:
                 # Hm, nothing here, check the base version:
-                try: p, oserial = self._base.load(oid, '')
-                except: pass
-                else:
-                    old= oid, oserial, None, None, p
+                if self._base:
+                    try:
+                        p, oserial = self._base.load(oid, '')
+                    except KeyError:
+                        pass
+                    else:
+                        old = oid, oserial, None, None, p
 
             nv=None
             if old:
@@ -355,10 +357,11 @@
         finally: self._lock_release()
 
     def undoLog(self, first, last, filter=None):
-        # I think this is wrong given the handling of first and last
-        # in FileStorage.
+        if last < 0:
+            last = first - last + 1
         self._lock_acquire()
         try:
+            # XXX Shouldn't this be sorted?
             transactions = self._data.items()
             pos = len(transactions)
             r = []
@@ -452,9 +455,9 @@
                 # Scan non-version pickle for references
                 r=index.get(oid, None)
                 if r is None:
-                    # Base storage
-                    p, s = self._base.load(oid, '')
-                    referencesf(p, rootl)
+                    if self._base:
+                        p, s = self._base.load(oid, '')
+                        referencesf(p, rootl)
                 else:
                     pindex[oid]=r
                     oid, serial, pre, vdata, p = r
@@ -504,25 +507,27 @@
 
                 if o:
                     if len(o) != len(t):
-                        _data[tid]=1, u, d, e, tuple(o) # Reset data
+                        _data[tid] = 1, u, d, e, tuple(o) # Reset data
                 else:
                     deleted.append(tid)
 
             # Now delete empty transactions
-            for tid in deleted: del _data[tid]
+            for tid in deleted:
+                del _data[tid]
 
             # Now reset previous pointers for "current" records:
             for r in pindex.values():
-                r[2]=None # Previous record
-                if r[3]: # vdata
-                    r[3][1][2]=None
-
-            pindex=None
+                r[2] = None # Previous record
+                if r[3] and r[3][1]: # vdata
+                    # If this record contains version data and
+                    # non-version data, then clear it out.
+                    r[3][1][2] = None
 
             # Finally, rebuild indexes from transaction data:
             self._index, self._vindex = self._build_indexes()
 
-        finally: self._lock_release()
+        finally:
+            self._lock_release()
         self.getSize()
 
     def _splat(self):