]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- use a faster discard when loading
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 29 Aug 2014 17:11:52 +0000 (13:11 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 29 Aug 2014 17:11:52 +0000 (13:11 -0400)
- don't do a bool on identity map since it calls __len__

lib/sqlalchemy/orm/identity.py
lib/sqlalchemy/orm/session.py
lib/sqlalchemy/orm/state.py

index 0fa5411947e394842841fa3ccb42800f15d1b69a..24dd47859e9056c1d46a1d7fc4f340e553c1ae76 100644 (file)
@@ -187,6 +187,12 @@ class WeakInstanceDict(IdentityMap):
             return list(self._dict.values())
 
     def discard(self, state):
+        st = self._dict.pop(state.key, None)
+        if st:
+            assert st is state
+            self._manage_removed_state(state)
+
+    def safe_discard(self, state):
         if state.key in self._dict:
             st = self._dict[state.key]
             if st is state:
@@ -259,6 +265,13 @@ class StrongInstanceDict(IdentityMap):
         state._instance_dict = self._wr
 
     def discard(self, state):
+        obj = self._dict.pop(state.key, None)
+        if obj is not None:
+            self._manage_removed_state(state)
+            st = attributes.instance_state(obj)
+            assert st is state
+
+    def safe_discard(self, state):
         if state.key in self._dict:
             obj = self._dict[state.key]
             st = attributes.instance_state(obj)
index 036045dba238527d1d37c0a7990a4fa03c916f5f..52873eb34111ca8fb189c9ee757982ff80207887 100644 (file)
@@ -1427,10 +1427,10 @@ class Session(_SessionClassMethods):
                 if state.key is None:
                     state.key = instance_key
                 elif state.key != instance_key:
-                    # primary key switch. use discard() in case another
+                    # primary key switch. use safe_discard() in case another
                     # state has already replaced this one in the identity
                     # map (see test/orm/test_naturalpks.py ReversePKsTest)
-                    self.identity_map.discard(state)
+                    self.identity_map.safe_discard(state)
                     if state in self.transaction._key_switches:
                         orig_key = self.transaction._key_switches[state][0]
                     else:
index fe8ccd222b4eec4cc9b5a5d8698ccb8e78e9e4c9..17872a9b4fdbe48c378e4e881ba7cd7afa913b28 100644 (file)
@@ -58,7 +58,6 @@ class InstanceState(interfaces.InspectionAttr):
     expired = False
     deleted = False
     _load_pending = False
-
     is_instance = True
 
     def __init__(self, obj, manager):
@@ -221,7 +220,7 @@ class InstanceState(interfaces.InspectionAttr):
 
     def _cleanup(self, ref):
         instance_dict = self._instance_dict()
-        if instance_dict:
+        if instance_dict is not None:
             instance_dict.discard(self)
 
         self.callables.clear()