summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/identity.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2009-05-17 21:51:40 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2009-05-17 21:51:40 +0000
commit155466aad1c5ae4b43ed167a8b6e6013f0241370 (patch)
tree7c237401dd7f0ee68097bb3d0474dd9c33b80500 /lib/sqlalchemy/orm/identity.py
parent2be867ffac8881a4a20ca5387063ed207ac876dc (diff)
downloadsqlalchemy-155466aad1c5ae4b43ed167a8b6e6013f0241370.tar.gz
- Removed all* O(N) scanning behavior from the flush() process,
i.e. operations that were scanning the full session, including an extremely expensive one that was erroneously assuming primary key values were changing when this was not the case. * one edge case remains which may invoke a full scan, if an existing primary key attribute is modified to a new value.
Diffstat (limited to 'lib/sqlalchemy/orm/identity.py')
-rw-r--r--lib/sqlalchemy/orm/identity.py31
1 files changed, 16 insertions, 15 deletions
diff --git a/lib/sqlalchemy/orm/identity.py b/lib/sqlalchemy/orm/identity.py
index aa041a585..dc219e1eb 100644
--- a/lib/sqlalchemy/orm/identity.py
+++ b/lib/sqlalchemy/orm/identity.py
@@ -12,8 +12,8 @@ from sqlalchemy.orm import attributes
class IdentityMap(dict):
def __init__(self):
- self._mutable_attrs = {}
- self.modified = False
+ self._mutable_attrs = set()
+ self._modified = set()
self._wr = weakref.ref(self)
def replace(self, state):
@@ -34,28 +34,29 @@ class IdentityMap(dict):
def _manage_incoming_state(self, state):
state._instance_dict = self._wr
- if state.modified:
- self.modified = True
+ if state.modified:
+ self._modified.add(state)
if state.manager.mutable_attributes:
- self._mutable_attrs[state] = True
+ self._mutable_attrs.add(state)
def _manage_removed_state(self, state):
del state._instance_dict
+ self._mutable_attrs.discard(state)
+ self._modified.discard(state)
+
+ def _dirty_states(self):
+ return self._modified.union(s for s in self._mutable_attrs if s.modified)
- if state in self._mutable_attrs:
- del self._mutable_attrs[state]
-
def check_modified(self):
"""return True if any InstanceStates present have been marked as 'modified'."""
- if not self.modified:
- for state in list(self._mutable_attrs):
- if state.check_modified():
- return True
- else:
- return False
- else:
+ if self._modified:
return True
+ else:
+ for state in self._mutable_attrs:
+ if state.modified:
+ return True
+ return False
def has_key(self, key):
return key in self