diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-08-06 21:11:27 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-08-06 21:11:27 +0000 |
commit | 8fc5005dfe3eb66a46470ad8a8c7b95fc4d6bdca (patch) | |
tree | ae9e27d12c9fbf8297bb90469509e1cb6a206242 /lib/sqlalchemy/orm/identity.py | |
parent | 7638aa7f242c6ea3d743aa9100e32be2052546a6 (diff) | |
download | sqlalchemy-8fc5005dfe3eb66a46470ad8a8c7b95fc4d6bdca.tar.gz |
merge 0.6 series to trunk.
Diffstat (limited to 'lib/sqlalchemy/orm/identity.py')
-rw-r--r-- | lib/sqlalchemy/orm/identity.py | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/lib/sqlalchemy/orm/identity.py b/lib/sqlalchemy/orm/identity.py index 50301a13c..b7d4234f4 100644 --- a/lib/sqlalchemy/orm/identity.py +++ b/lib/sqlalchemy/orm/identity.py @@ -45,7 +45,7 @@ class IdentityMap(dict): self._modified.discard(state) def _dirty_states(self): - return self._modified.union(s for s in list(self._mutable_attrs) + return self._modified.union(s for s in self._mutable_attrs.copy() if s.modified) def check_modified(self): @@ -54,7 +54,7 @@ class IdentityMap(dict): if self._modified: return True else: - for state in list(self._mutable_attrs): + for state in self._mutable_attrs.copy(): if state.modified: return True return False @@ -145,34 +145,49 @@ class WeakInstanceDict(IdentityMap): return self[key] except KeyError: return default - + + # Py2K def items(self): return list(self.iteritems()) def iteritems(self): for state in dict.itervalues(self): + # end Py2K + # Py3K + #def items(self): + # for state in dict.values(self): value = state.obj() if value is not None: yield state.key, value + # Py2K + def values(self): + return list(self.itervalues()) + def itervalues(self): for state in dict.itervalues(self): + # end Py2K + # Py3K + #def values(self): + # for state in dict.values(self): instance = state.obj() if instance is not None: yield instance - def values(self): - return list(self.itervalues()) - def all_states(self): + # Py3K + # return list(dict.values(self)) + + # Py2K return dict.values(self) + # end Py2K def prune(self): return 0 class StrongInstanceDict(IdentityMap): def all_states(self): - return [attributes.instance_state(o) for o in self.values()] + return [attributes.instance_state(o) for o in self.itervalues()] def contains_state(self, state): return state.key in self and attributes.instance_state(self[state.key]) is state @@ -212,7 +227,11 @@ class StrongInstanceDict(IdentityMap): ref_count = len(self) dirty = [s.obj() for s in self.all_states() if s.check_modified()] - keepers = weakref.WeakValueDictionary(self) + + # work around http://bugs.python.org/issue6149 + keepers = weakref.WeakValueDictionary() + keepers.update(self) + dict.clear(self) dict.update(self, keepers) self.modified = bool(dirty) |