[Zodb-checkins] CVS: ZODB3/ZODB - MappingStorage.py:1.9

Barry Warsaw barry@wooz.org
Mon, 13 Jan 2003 19:12:17 -0500


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

Modified Files:
	MappingStorage.py 
Log Message:
Code cleanup, and fixed comments.


=== ZODB3/ZODB/MappingStorage.py 1.8 => 1.9 ===
--- ZODB3/ZODB/MappingStorage.py:1.8	Thu Jan  9 18:57:06 2003
+++ ZODB3/ZODB/MappingStorage.py	Mon Jan 13 19:12:14 2003
@@ -1,6 +1,6 @@
 ##############################################################################
 #
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# Copyright (c) 2001, 2002, 2003 Zope Corporation and Contributors.
 # All Rights Reserved.
 #
 # This software is subject to the provisions of the Zope Public License,
@@ -13,118 +13,50 @@
 ##############################################################################
 """Very Simple Mapping ZODB storage
 
-The Mapping storage provides an extremely simple storage
-implementation that doesn't provide undo or version support.
+The Mapping storage provides an extremely simple storage implementation that
+doesn't provide undo or version support.
 
 It is meant to illustrate the simplest possible storage.
 
-The Mapping storage uses a single data structure to map
-object ids to data.
-
-The Demo storage serves two purposes:
-
-  - Provide an example implementation of a full storage without
-    distracting storage details,
-
-  - Provide a volatile storage that is useful for giving demonstrations.
-
-The demo strorage can have a "base" storage that is used in a
-read-only fashion. The base storage must not not to contain version
-data.
-
-There are three main data structures:
-
-  _data -- Transaction logging information necessary for undo
-
-      This is a mapping from transaction id to transaction, where
-      a transaction is simply a 4-tuple:
-
-        packed, user, description, extension_data, records
-
-      where extension_data is a dictionary or None and records are the
-      actual records in chronological order. Packed is a flag
-      indicating whethe the transaction has been packed or not
-
-  _index -- A mapping from oid to record
-
-  _vindex -- A mapping from version name to version data
-
-      where version data is a mapping from oid to record
-
-A record is a tuple:
-
-  oid, serial, pre, vdata, p,
-
-where:
-
-     oid -- object id
-
-     serial -- object serial number
-
-     pre -- The previous record for this object (or None)
-
-     vdata -- version data
-
-        None if not a version, ortherwise:
-           version, non-version-record
-
-     p -- the pickle data or None
-
-The pickle data will be None for a record for an object created in
-an aborted version.
-
-It is instructive to watch what happens to the internal data structures
-as changes are made.  Foe example, in Zope, you can create an external
-method::
-
-  import Zope
-
-  def info(RESPONSE):
-      RESPONSE['Content-type']= 'text/plain'
-
-      return Zope.DB._storage._splat()
-
-and call it to minotor the storage.
-
+The Mapping storage uses a single data structure to map object ids to data.
 """
+
 __version__='$Revision$'[11:-2]
 
-import POSException, BaseStorage, string, utils
-from TimeStamp import TimeStamp
+from ZODB import utils
+from ZODB import BaseStorage
+from ZODB import POSException
+from ZODB.TimeStamp import TimeStamp
 
-class MappingStorage(BaseStorage.BaseStorage):
 
+class MappingStorage(BaseStorage.BaseStorage):
     def __init__(self, name='Mapping Storage'):
-
         BaseStorage.BaseStorage.__init__(self, name)
-
-        self._index={}
-        self._tindex=[]
+        self._index = {}
+        self._tindex = []
         self._ltid = None
-
-        # Note:
-        # If you subclass this and use a persistent mapping facility
-        # (e.g. a dbm file), you will need to get the maximum key and
-        # save it as self._oid.  See dbmStorage.
+        # Note: If you subclass this and use a persistent mapping facility
+        # (e.g. a dbm file), you will need to get the maximum key and save it
+        # as self._oid.  See dbmStorage.
 
     def __len__(self):
         return len(self._index)
 
     def getSize(self):
-        s=32
-        index=self._index
-        for oid in index.keys():
-            p=index[oid]
-            s=s+56+len(p)
-
+        # These constants are for Python object memory overheads
+        s = 32
+        for oid in self._index.keys():
+            p = self._index[oid]
+            s += 56 + len(p)
         return s
 
     def load(self, oid, version):
         self._lock_acquire()
         try:
-            p=self._index[oid]
+            p = self._index[oid]
             return p[8:], p[:8] # pickle, serial
-        finally: self._lock_release()
+        finally:
+            self._lock_release()
 
     def store(self, oid, serial, data, version, transaction):
         if transaction is not self._transaction:
@@ -136,67 +68,61 @@
         self._lock_acquire()
         try:
             if self._index.has_key(oid):
-                old=self._index[oid]
-                oserial=old[:8]
+                old = self._index[oid]
+                oserial = old[:8]
                 if serial != oserial:
                     raise POSException.ConflictError(serials=(oserial, serial))
 
-            serial=self._serial
-            self._tindex.append((oid,serial+data))
-        finally: self._lock_release()
-
+            serial = self._serial
+            self._tindex.append((oid, serial+data))
+        finally:
+            self._lock_release()
         return serial
 
     def _clear_temp(self):
-        self._tindex=[]
+        self._tindex = []
 
     def _finish(self, tid, user, desc, ext):
-
-        index=self._index
-        for oid, p in self._tindex: index[oid]=p
+        for oid, p in self._tindex:
+            self._index[oid] = p
         self._ltid = self._serial
 
     def lastTransaction(self):
         return self._ltid
 
     def pack(self, t, referencesf):
-
         self._lock_acquire()
         try:
-            # Build an index of *only* those objects reachable
-            # from the root.
-            index=self._index
-            rootl=['\0\0\0\0\0\0\0\0']
-            pop=rootl.pop
-            pindex={}
-            referenced=pindex.has_key
+            # Build an index of *only* those objects reachable from the root.
+            rootl = ['\0\0\0\0\0\0\0\0']
+            pindex = {}
             while rootl:
-                oid=pop()
-                if referenced(oid): continue
-
+                oid = rootl.pop()
+                if pindex.has_key(oid):
+                    continue
                 # Scan non-version pickle for references
-                r=index[oid]
-                pindex[oid]=r
-                p=r[8:]
+                r = self._index[oid]
+                pindex[oid] = r
+                p = r[8:]
                 referencesf(p, rootl)
 
             # Now delete any unreferenced entries:
-            for oid in index.keys():
-                if not referenced(oid): del index[oid]
+            for oid in self._index.keys():
+                if not pindex.has_key(oid):
+                    del self._index[oid]
 
-        finally: self._lock_release()
+        finally:
+            self._lock_release()
 
     def _splat(self):
-        """Spit out a string showing state.
-        """
-        o=[]
+        """Spit out a string showing state."""
+        o = []
         o.append('Index:')
-        index=self._index
-        keys=index.keys()
+        keys = self._index.keys()
         keys.sort()
         for oid in keys:
-            r=index[oid]
+            r = self._index[oid]
             o.append('  %s: %s, %s' %
                      (utils.u64(oid),TimeStamp(r[:8]),`r[8:]`))
 
-        return string.join(o,'\n')
+        return '\n'.join(o)