[Checkins] SVN: BTrees/branches/pure_python/ Use names for states in conflict resolution.

Tres Seaver cvs-admin at zope.org
Wed Nov 14 21:29:34 UTC 2012


Log message for revision 128286:
  Use names for states in conflict resolution.

Changed:
  _U  BTrees/branches/pure_python/
  U   BTrees/branches/pure_python/BTrees/_base.py

-=-
Modified: BTrees/branches/pure_python/BTrees/_base.py
===================================================================
--- BTrees/branches/pure_python/BTrees/_base.py	2012-11-14 08:44:00 UTC (rev 128285)
+++ BTrees/branches/pure_python/BTrees/_base.py	2012-11-14 21:29:33 UTC (rev 128286)
@@ -144,29 +144,32 @@
 
     has_key = __contains__
 
-    def _p_resolveConflict(self, *states):
+    def _p_resolveConflict(self, s_old, s_com, s_new):
         is_set = getattr(self, '_values', self) is self
 
-        buckets = []
-        for state in states:
-            bucket = self.__class__()
-            if state:
-                bucket.__setstate__(state)
-            buckets.append(bucket)
-        if (buckets[1]._next != buckets[0]._next or
-            buckets[2]._next != buckets[0]._next):
+        b_old = self.__class__()
+        if s_old is not None:
+            b_old.__setstate__(s_old)
+        b_com = self.__class__()
+        if s_com is not None:
+            b_com.__setstate__(s_com)
+        b_new = self.__class__()
+        if s_new is not None:
+            b_new.__setstate__(s_new)
+        if (b_com._next != b_old._next or
+            b_new._next != b_old._next):
             raise BTreesConflictError(-1, -1, -1, 0)
 
-        if not (buckets[1] and buckets[2]):
+        if not b_com or not b_new:
             raise BTreesConflictError(-1, -1, -1, 12)
 
-        i1 = _SetIteration(buckets[0], True)
-        i2 = _SetIteration(buckets[1], True)
-        i3 = _SetIteration(buckets[2], True)
+        i_old = _SetIteration(b_old, True)
+        i_com = _SetIteration(b_com, True)
+        i_new = _SetIteration(b_new, True)
 
         def merge_error(reason):
             return BTreesConflictError(
-                i1.position, i2.position, i3.position, reason)
+                i_old.position, i_com.position, i_new.position, reason)
 
         result = self.__class__()
 
@@ -180,106 +183,106 @@
                 result._values.append(it.value)
                 it.advance()
 
-        while i1.active and i2.active and i3.active:
-            cmp12 = cmp(i1.key, i2.key)
-            cmp13 = cmp(i1.key, i3.key)
+        while i_old.active and i_com.active and i_new.active:
+            cmp12 = cmp(i_old.key, i_com.key)
+            cmp13 = cmp(i_old.key, i_new.key)
             if cmp12==0:
                 if cmp13==0:
                     if is_set:
-                        result.add(i1.key)
-                    elif i2.value == i1.value:
-                        result[i1.key] = i3.value
-                    elif i3.value == i1.value:
-                        result[i1.key] = i2.value
+                        result.add(i_old.key)
+                    elif i_com.value == i_old.value:
+                        result[i_old.key] = i_new.value
+                    elif i_new.value == i_old.value:
+                        result[i_old.key] = i_com.value
                     else:
                         raise merge_error(1)
-                    i1.advance()
-                    i2.advance()
-                    i3.advance()
+                    i_old.advance()
+                    i_com.advance()
+                    i_new.advance()
                 elif (cmp13 > 0): # insert in new
-                    merge_output(i3)
-                elif is_set or i1.value == i2.value: # deleted new
-                    if i3.position == 1:
+                    merge_output(i_new)
+                elif is_set or i_old.value == i_com.value: # deleted new
+                    if i_new.position == 1:
                         # Deleted the first item.  This will modify the
                         # parent node, so we don't know if merging will be
                         # safe
                         raise merge_error(13)
-                    i1.advance()
-                    i2.advance()
+                    i_old.advance()
+                    i_com.advance()
                 else:
                     raise merge_error(2)
             elif cmp13 == 0:
                 if cmp12 > 0: # insert committed
-                    merge_output(i2)
-                elif is_set or i1.value == i3.value: # delete committed
-                    if i2.position == 1:
+                    merge_output(i_com)
+                elif is_set or i_old.value == i_new.value: # delete committed
+                    if i_com.position == 1:
                         # Deleted the first item.  This will modify the
                         # parent node, so we don't know if merging will be
                         # safe
                         raise merge_error(13)
-                    i1.advance()
-                    i3.advance()
+                    i_old.advance()
+                    i_new.advance()
                 else:
                     raise merge_error(3)
             else: # both keys changed
-                cmp23 = cmp(i2.key, i3.key)
+                cmp23 = cmp(i_com.key, i_new.key)
                 if cmp23 == 0:
                     raise merge_error(4)
                 if cmp12 > 0: # insert committed
-                    if cmp23 > 0: # insert i3 first
-                        merge_output(i3)
+                    if cmp23 > 0: # insert i_new first
+                        merge_output(i_new)
                     else:
-                        merge_output(i2)
-                elif cmp13 > 0: # insert i3
-                    merge_output(i3)
+                        merge_output(i_com)
+                elif cmp13 > 0: # insert i_new
+                    merge_output(i_new)
                 else:
                     raise merge_error(5) # both deleted same key
 
-        while i2.active and i3.active: # new inserts
-            cmp23 = cmp(i2.key, i3.key)
+        while i_com.active and i_new.active: # new inserts
+            cmp23 = cmp(i_com.key, i_new.key)
             if cmp23 == 0:
                 raise merge_error(6) # dueling insert
             if cmp23 > 0: # insert new
-                merge_output(i3)
+                merge_output(i_new)
             else: # insert committed
-                merge_output(i2)
+                merge_output(i_com)
 
-        while i1.active and i2.active: # new deletes rest of original
-            cmp12 = cmp(i1.key, i2.key)
+        while i_old.active and i_com.active: # new deletes rest of original
+            cmp12 = cmp(i_old.key, i_com.key)
             if cmp12 > 0: # insert committed
-                merge_output(i2)
-            elif cmp12 == 0 and (is_set or i1.value == i2.value): # del in new
-                i1.advance()
-                i2.advance()
+                merge_output(i_com)
+            elif cmp12 == 0 and (is_set or i_old.value == i_com.value): # del in new
+                i_old.advance()
+                i_com.advance()
             else: # dueling deletes or delete and change
                 raise merge_error(7)
 
-        while i1.active and i3.active: # committed deletes rest of original
-            cmp13 = cmp(i1.key, i3.key)
+        while i_old.active and i_new.active: # committed deletes rest of original
+            cmp13 = cmp(i_old.key, i_new.key)
             if cmp13 > 0: # insert new
-                merge_output(i3)
-            elif cmp13 == 0 and (is_set or i1.value == i3.value):
+                merge_output(i_new)
+            elif cmp13 == 0 and (is_set or i_old.value == i_new.value):
                 # deleted in committed
-                i1.advance()
-                i3.advance()
+                i_old.advance()
+                i_new.advance()
             else: # dueling deletes or delete and change
                 raise merge_error(8)
 
-        if i1.active: # dueling deletes
+        if i_old.active: # dueling deletes
             raise merge_error(9)
 
-        while i2.active:
-            merge_output(i2)
+        while i_com.active:
+            merge_output(i_com)
 
-        while i3.active:
-            merge_output(i3)
+        while i_new.active:
+            merge_output(i_new)
 
         if len(result._keys) == 0:
             # If the output bucket is empty, conflict resolution doesn't have
             # enough info to unlink it from its containing BTree correctly.
             raise merge_error(10)
 
-        result._next = buckets[0]._next
+        result._next = b_old._next
         return result.__getstate__()
 
 
@@ -832,31 +835,30 @@
         else:
             assert_(False, "Incorrect child type")
 
-    def _p_resolveConflict(self, *states):
-        states = map(_get_simple_btree_bucket_state, states)
-        return ((self._bucket_type()._p_resolveConflict(*states), ), )
+    def _p_resolveConflict(self, old, com, new):
+        s_old = _get_simple_btree_bucket_state(old)
+        s_com = _get_simple_btree_bucket_state(com)
+        s_new = _get_simple_btree_bucket_state(new)
+        return ((
+            self._bucket_type()._p_resolveConflict(s_old, s_com, s_new), ), )
 
 
 def _get_simple_btree_bucket_state(state):
     if state is None:
         return state
-
     if not isinstance(state, tuple):
         raise TypeError("_p_resolveConflict: expected tuple or None for state")
     if len(state) == 2:
         raise BTreesConflictError(-1, -1, -1, 11)
-
     if len(state) != 1:
         raise TypeError("_p_resolveConflict: expected 1- or 2-tuple for state")
-
     state = state[0]
     if not isinstance(state, tuple) or len(state) != 1:
         raise TypeError("_p_resolveConflict: expected 1-tuple containing "
-                        "bucket state");
+                        "bucket state")
     state = state[0]
     if not isinstance(state, tuple):
         raise TypeError("_p_resolveConflict: expected tuple for bucket state")
-
     return state
 
 



More information about the checkins mailing list