]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fixed a potential issue in an ordered sequence implementation used
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 18 Aug 2013 19:34:23 +0000 (15:34 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 18 Aug 2013 19:34:23 +0000 (15:34 -0400)
by the ORM to iterate mapper hierarchies; under the Jython interpreter
this implementation wasn't ordered, even though cPython and Pypy
maintained ordering.  Also in 0.8.3.
[ticket:2794]

doc/build/changelog/changelog_08.rst
doc/build/changelog/changelog_09.rst
lib/sqlalchemy/orm/util.py
lib/sqlalchemy/util/_collections.py

index 9d7b4b975fb9fd28375388c5d2543d13ab8ce0a2..3e61ac570059b33831f1546f90e52aec2c5fa93d 100644 (file)
@@ -6,6 +6,15 @@
 .. changelog::
     :version: 0.8.3
 
+    .. change::
+        :tags: bug, orm
+        :tickets: 2794
+
+        Fixed a potential issue in an ordered sequence implementation used
+        by the ORM to iterate mapper hierarchies; under the Jython interpreter
+        this implementation wasn't ordered, even though cPython and Pypy
+        maintained ordering.
+
     .. change::
         :tags: bug, sql
         :tickets: 2801
index cc9954120042cbe03219a603cda8eb1d7828c901..3c38367f26a2319505789688ea0f1bcb0eeb8e7c 100644 (file)
@@ -6,6 +6,15 @@
 .. changelog::
     :version: 0.9.0
 
+    .. change::
+        :tags: bug, orm
+        :tickets: 2794
+
+        Fixed a potential issue in an ordered sequence implementation used
+        by the ORM to iterate mapper hierarchies; under the Jython interpreter
+        this implementation wasn't ordered, even though cPython and Pypy
+        maintained ordering.  Also in 0.8.3.
+
     .. change::
         :tags: bug, sql
         :tickets: 2801
index d88164e7d35322b8ce0530608e34aba28b4b37bc..9737072497b62574db806d5ce8bd06e4d42beb87 100644 (file)
@@ -911,3 +911,4 @@ def randomize_unitofwork():
     from sqlalchemy.testing.util import RandomSet
     topological.set = unitofwork.set = session.set = mapper.set = \
             dependency.set = RandomSet
+
index c3b44abae750d90cc13262eaa69067ebd0e0fbf9..b2e5c6250593bc28cd039a197384b90e3734da3f 100644 (file)
@@ -650,18 +650,23 @@ class IdentitySet(object):
 
 class WeakSequence(object):
     def __init__(self, elements):
-        self._storage = weakref.WeakValueDictionary(
-            (idx, element) for idx, element in enumerate(elements)
-        )
+        self._storage = [
+            weakref.ref(element) for element in elements
+        ]
+
+    def _remove(self, ref):
+        self._storage.remove(ref)
 
     def __iter__(self):
-        return iter(self._storage.values())
+        return (obj for obj in (ref() for ref in self._storage) if obj is not None)
 
     def __getitem__(self, index):
         try:
-            return self._storage[index]
+            obj = self._storage[index]
         except KeyError:
             raise IndexError("Index %s out of range" % index)
+        else:
+            return obj()
 
 
 class OrderedIdentitySet(IdentitySet):