[Zope3-checkins] CVS: ZODB4/ZODB - TmpStore.py:1.8

Jeremy Hylton jeremy@zope.com
Tue, 23 Jul 2002 18:15:13 -0400


Update of /cvs-repository/ZODB4/ZODB
In directory cvs.zope.org:/tmp/cvs-serv22138

Modified Files:
	TmpStore.py 
Log Message:
Cleanup and simplify code.
Fix buggy modifiedInVersion().

modifiedInVersion() returned 1 if the object was modified in TmpStore,
regardless of whether the TmpStore was working on a version.  Fixed to
return self._bver.

Add comments to explain what most instance variables are.

Change _tindex from [] to {}, which makes it easier to use to update
_index.

Limit code in close() and remove __del__().

Remove optional argument from constructor because it was never used.

Elminate use of local variables to shadow instance variables.


=== ZODB4/ZODB/TmpStore.py 1.7 => 1.8 ===
 # FOR A PARTICULAR PURPOSE.
 # 
 ##############################################################################
-import POSException
-from utils import p64, u64
+from ZODB import POSException
+from ZODB.utils import p64, u64
+
+import tempfile
 
 class TmpStore:
-    _transaction=_isCommitting=None
+    """A storage to support savepoints."""
 
-    def __init__(self, base_version, file=None):
-        if file is None:
-            import tempfile
-            file=tempfile.TemporaryFile()
+    _bver = ''
 
-        self._file = file
-        self._index = {}
+    def __init__(self, base_version):
+        self._transaction = None
+        if base_version:
+            self._bver = base_version
+        self._file = tempfile.TemporaryFile()
+        # _pos: current file position
+        # _tpos: file position at last commit point
         self._pos = self._tpos = 0
-        self._bver = base_version
-        self._tindex = []
+        # _index: map oid to pos of last committed version
+        self._index = {}
+        # _tindex: map oid to pos for new updates
+        self._tindex = {}
         self._db = None
+        # XXX what is this for?
         self._created = []
 
-    def __del__(self):
-        self.close()
-
     def close(self):
         self._file.close()
-        del self._file
-        del self._index
-        del self._db
 
     def getName(self):
         return self._db.getName()
@@ -46,20 +47,22 @@
         return self._pos
 
     def load(self, oid, version):
-        #if version is not self: raise KeyError, oid
-        pos=self._index.get(oid, None)
+        pos = self._index.get(oid, None)
         if pos is None:
             return self._storage.load(oid, self._bver)
-        file=self._file
-        file.seek(pos)
-        h=file.read(24)
+        self._file.seek(pos)
+        h = self._file.read(24)
         if h[:8] != oid:
             raise POSException.StorageSystemError, 'Bad temporary storage'
-        return file.read(u64(h[16:])), h[8:16]
+        size = u64(h[16:])
+        serial = h[8:16]
+        return self._file.read(size), serial
         
+    # XXX clarify difference between self._storage & self._db._storage
+
     def modifiedInVersion(self, oid):
         if self._index.has_key(oid):
-            return 1
+            return self._bver
         return self._db._storage.modifiedInVersion(oid)
 
     def new_oid(self):
@@ -72,42 +75,46 @@
     def store(self, oid, serial, data, version, transaction):
         if transaction is not self._transaction:
             raise POSException.StorageTransactionError(self, transaction)
-        file=self._file
-        pos=self._pos
-        file.seek(pos)
-        l=len(data)
+        self._file.seek(self._pos)
+        l = len(data)
         if serial is None:
             serial = '\0\0\0\0\0\0\0\0'
-        file.write(oid+serial+p64(l))
-        file.write(data)
-        self._tindex.append((oid,pos))
-        self._pos=pos+l+24
+        self._file.write(oid + serial + p64(l))
+        self._file.write(data)
+        self._tindex[oid] = self._pos
+        self._pos += l + 24
         return serial
         
     def tpc_abort(self, transaction):
-        if transaction is not self._transaction: return
-        del self._tindex[:]
-        self._transaction=None
-        self._pos=self._tpos
+        if transaction is not self._transaction:
+            return
+        self._tindex.clear()
+        self._transaction = None
+        self._pos = self._tpos
 
     def tpc_begin(self, transaction):
-        if self._transaction is transaction: return
-        self._transaction=transaction
-        del self._tindex[:]   # Just to be sure!
-        self._pos=self._tpos
+        if self._transaction is transaction:
+            return
+        self._transaction = transaction
+        self._tindex.clear()
+        self._pos = self._tpos
 
-    def tpc_vote(self, transaction): pass
+    def tpc_vote(self, transaction):
+        pass
 
     def tpc_finish(self, transaction, f=None):
-        if transaction is not self._transaction: return
-        if f is not None: f()
-        index=self._index
-        tindex=self._tindex
-        for oid, pos in tindex: index[oid]=pos
-        del tindex[:]
-        self._tpos=self._pos
+        if transaction is not self._transaction:
+            return
+        if f is not None:
+            f()
+        self._index.update(self._tindex)
+        self._tindex.clear()
+        self._tpos = self._pos
 
-    def undoLog(self, first, last, filter=None): return ()
+    def undoLog(self, first, last, filter=None):
+        return ()
     
     def versionEmpty(self, version):
-        if version is self: return len(self._index)
+        # XXX what is this supposed to do?
+        if version == self._bver:
+            return len(self._index)