]> 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:35:23 +0000 (15:35 -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]

Conflicts:
doc/build/changelog/changelog_09.rst
lib/sqlalchemy/util/_collections.py

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

index bbd2741c802baed5a26699daf843af1bb683ddd5..d67c088eb1cac721b2473fb6779480dc742c240f 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 e2b3ddd01cee56c722bcb5af8468b3a48113be21..99349c0197a756e7495e1c73485162b8eaab963c 100644 (file)
@@ -1292,3 +1292,4 @@ def randomize_unitofwork():
     from sqlalchemy.testing.util import RandomSet
     topological.set = unitofwork.set = session.set = mapper.set = \
             dependency.set = RandomSet
+
index 8e61275e75771d6307633700f9a5f313cce142b7..4da13b3fe0d38aa2309afc9511e9952968456767 100644 (file)
@@ -618,18 +618,27 @@ 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):
+<<<<<<< HEAD
         return self._storage.itervalues()
+=======
+        return (obj for obj in (ref() for ref in self._storage) if obj is not None)
+>>>>>>> 676876f... Fixed a potential issue in an ordered sequence implementation used
 
     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):