[Checkins] SVN: ZODB/branches/gocept-iteration/src/Z - Implement better iterator for MappingStorage.

Christian Theune ct at gocept.com
Thu Feb 14 09:10:31 EST 2008


Log message for revision 83836:
  - Implement better iterator for MappingStorage.
  - Remove invalid use of `_extension` from FileStorage and the iterator tests.
  - Apply all IteratorStorage tests to ZEO.
  - Make IteratorGCSpanTransaction test create an empty transaction.
  - Update IStorageTransactionInformation to make clear that `extension` is the
    (unpickled) dict of extension data.
  

Changed:
  U   ZODB/branches/gocept-iteration/src/ZEO/tests/IterationTests.py
  U   ZODB/branches/gocept-iteration/src/ZEO/tests/testZEO.py
  U   ZODB/branches/gocept-iteration/src/ZODB/FileStorage/FileStorage.py
  U   ZODB/branches/gocept-iteration/src/ZODB/MappingStorage.py
  U   ZODB/branches/gocept-iteration/src/ZODB/interfaces.py
  U   ZODB/branches/gocept-iteration/src/ZODB/tests/IteratorStorage.py

-=-
Modified: ZODB/branches/gocept-iteration/src/ZEO/tests/IterationTests.py
===================================================================
--- ZODB/branches/gocept-iteration/src/ZEO/tests/IterationTests.py	2008-02-14 14:10:07 UTC (rev 83835)
+++ ZODB/branches/gocept-iteration/src/ZEO/tests/IterationTests.py	2008-02-14 14:10:31 UTC (rev 83836)
@@ -46,7 +46,10 @@
 
     def checkIteratorGCSpanTransactions(self):
         iterator = self._storage.iterator()
-        self._dostore()
+        t = transaction.Transaction()
+        self._storage.tpc_begin(t)
+        self._storage.tpc_vote(t)
+        self._storage.tpc_finish(t)
         self.assertEquals([], list(iterator))
 
     def checkIteratorGCStorageCommitting(self):

Modified: ZODB/branches/gocept-iteration/src/ZEO/tests/testZEO.py
===================================================================
--- ZODB/branches/gocept-iteration/src/ZEO/tests/testZEO.py	2008-02-14 14:10:07 UTC (rev 83835)
+++ ZODB/branches/gocept-iteration/src/ZEO/tests/testZEO.py	2008-02-14 14:10:31 UTC (rev 83836)
@@ -41,7 +41,7 @@
 from ZODB.tests import StorageTestBase, BasicStorage,  \
      TransactionalUndoStorage,  \
      PackableStorage, Synchronization, ConflictResolution, RevisionStorage, \
-     MTStorage, ReadOnlyStorage
+     MTStorage, ReadOnlyStorage, IteratorStorage
 
 from ZODB.tests.testDemoStorage import DemoStorageWrappedBase
 
@@ -177,6 +177,7 @@
     Synchronization.SynchronizedStorage,
     MTStorage.MTStorage,
     ReadOnlyStorage.ReadOnlyStorage,
+    IteratorStorage.IteratorStorage,
     # ZEO test mixin classes (in the same order as imported)
     CommitLockTests.CommitLockVoteTests,
     ThreadTests.ThreadTests,

Modified: ZODB/branches/gocept-iteration/src/ZODB/FileStorage/FileStorage.py
===================================================================
--- ZODB/branches/gocept-iteration/src/ZODB/FileStorage/FileStorage.py	2008-02-14 14:10:07 UTC (rev 83835)
+++ ZODB/branches/gocept-iteration/src/ZODB/FileStorage/FileStorage.py	2008-02-14 14:10:31 UTC (rev 83836)
@@ -1690,7 +1690,6 @@
     def __init__(self, tid, status, user, desc, ext, pos, tend, file, tpos):
         BaseStorage.TransactionRecord.__init__(
             self, tid, status, user, desc, ext)
-        self._extension = ext
         self._pos = pos
         self._tend = tend
         self._file = file

Modified: ZODB/branches/gocept-iteration/src/ZODB/MappingStorage.py
===================================================================
--- ZODB/branches/gocept-iteration/src/ZODB/MappingStorage.py	2008-02-14 14:10:07 UTC (rev 83835)
+++ ZODB/branches/gocept-iteration/src/ZODB/MappingStorage.py	2008-02-14 14:10:31 UTC (rev 83836)
@@ -21,16 +21,16 @@
 The Mapping storage uses a single data structure to map object ids to data.
 """
 
+import ZODB.BaseStorage
 from ZODB.utils import u64, z64
-from ZODB.BaseStorage import BaseStorage
 from ZODB import POSException
 from persistent.TimeStamp import TimeStamp
 
 
-class MappingStorage(BaseStorage):
+class MappingStorage(ZODB.BaseStorage.BaseStorage):
 
     def __init__(self, name='Mapping Storage'):
-        BaseStorage.__init__(self, name)
+        ZODB.BaseStorage.BaseStorage.__init__(self, name)
         # ._index maps an oid to a string s.  s[:8] is the tid of the
         # transaction that created oid's current state, and s[8:] is oid's
         # current state.
@@ -142,4 +142,26 @@
         pass
 
     def iterator(self, start=None, stop=None):
-        return iter(())
+        """Return an IStorageTransactionInformation iterator."""
+        tid2oid = {}
+        for oid, odata in self._index.items():
+            tid = odata[:8]
+            oids = tid2oid.setdefault(tid, [])
+            oids.append(oid)
+
+        for tid, oids in sorted(tid2oid.items()):
+            yield TransactionRecord(self, tid, oids)
+
+
+class TransactionRecord(ZODB.BaseStorage.TransactionRecord):
+
+    def __init__(self, storage, tid, oids):
+        super(TransactionRecord, self).__init__(tid, 'p', '', '', {})
+        self._storage = storage
+        self._oids = oids
+
+    def __iter__(self):
+        for oid in self._oids:
+            storage_data = self._storage._index[oid]
+            tid, data = storage_data[:8], storage_data[8:]
+            yield ZODB.BaseStorage.DataRecord(oid, tid, data, '', None)

Modified: ZODB/branches/gocept-iteration/src/ZODB/interfaces.py
===================================================================
--- ZODB/branches/gocept-iteration/src/ZODB/interfaces.py	2008-02-14 14:10:07 UTC (rev 83835)
+++ ZODB/branches/gocept-iteration/src/ZODB/interfaces.py	2008-02-14 14:10:31 UTC (rev 83836)
@@ -794,7 +794,7 @@
     status = Attribute("Transaction Status") # XXX what are valid values?
     user = Attribute("Transaction user")
     description = Attribute("Transaction Description")
-    extension = Attribute("Transaction extension data")
+    extension = Attribute("A dictionary carrying the transaction's extension data")
 
     def __iter__():
         """Return an iterable of IStorageRecordInformation

Modified: ZODB/branches/gocept-iteration/src/ZODB/tests/IteratorStorage.py
===================================================================
--- ZODB/branches/gocept-iteration/src/ZODB/tests/IteratorStorage.py	2008-02-14 14:10:07 UTC (rev 83835)
+++ ZODB/branches/gocept-iteration/src/ZODB/tests/IteratorStorage.py	2008-02-14 14:10:31 UTC (rev 83836)
@@ -89,7 +89,7 @@
         iter = self._storage.iterator()
         count = 0
         for txn in iter:
-            self.assertEqual(txn._extension, {})
+            self.assertEqual(txn.extension, {})
             count +=1
         self.assertEqual(count, 1)
 
@@ -183,7 +183,7 @@
             eq(txn1.status,      txn2.status)
             eq(txn1.user,        txn2.user)
             eq(txn1.description, txn2.description)
-            eq(txn1._extension,  txn2._extension)
+            eq(txn1.extension,  txn2.extension)
             for rec1, rec2 in zip(txn1, txn2):
                 eq(rec1.oid,     rec2.oid)
                 eq(rec1.tid,  rec2.tid)



More information about the Checkins mailing list