diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-02-18 14:23:45 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-02-18 14:23:45 -0500 |
commit | 698fb60e67a5952a46f56b21488d64a34d8acb8b (patch) | |
tree | 42a6f09c34611adfc0e8b549af40967685e4eac5 | |
parent | 15e670fbc4bdfc3d1521163677c5e874f430b958 (diff) | |
download | sqlalchemy-698fb60e67a5952a46f56b21488d64a34d8acb8b.tar.gz |
- inline the discard process
-rw-r--r-- | lib/sqlalchemy/orm/identity.py | 9 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/state.py | 7 | ||||
-rw-r--r-- | test/profiles.txt | 2 |
3 files changed, 14 insertions, 4 deletions
diff --git a/lib/sqlalchemy/orm/identity.py b/lib/sqlalchemy/orm/identity.py index 24dd47859..769010950 100644 --- a/lib/sqlalchemy/orm/identity.py +++ b/lib/sqlalchemy/orm/identity.py @@ -44,7 +44,8 @@ class IdentityMap(object): def _manage_removed_state(self, state): del state._instance_dict - self._modified.discard(state) + if state.modified: + self._modified.discard(state) def _dirty_states(self): return self._modified @@ -186,6 +187,9 @@ class WeakInstanceDict(IdentityMap): else: return list(self._dict.values()) + def _fast_discard(self, state): + self._dict.pop(state.key, None) + def discard(self, state): st = self._dict.pop(state.key, None) if st: @@ -264,6 +268,9 @@ class StrongInstanceDict(IdentityMap): self._dict[key] = state.obj() state._instance_dict = self._wr + def _fast_discard(self, state): + self._dict.pop(state.key, None) + def discard(self, state): obj = self._dict.pop(state.key, None) if obj is not None: diff --git a/lib/sqlalchemy/orm/state.py b/lib/sqlalchemy/orm/state.py index 7a4d2e13b..cb3ed0b3a 100644 --- a/lib/sqlalchemy/orm/state.py +++ b/lib/sqlalchemy/orm/state.py @@ -252,7 +252,10 @@ class InstanceState(interfaces.InspectionAttr): def _cleanup(self, ref): instance_dict = self._instance_dict() if instance_dict is not None: - instance_dict.discard(self) + instance_dict._fast_discard(self) + del self._instance_dict + if self.modified: + instance_dict._modified.discard(self) if 'callables' in self.__dict__: self.__dict__.pop('callables') @@ -513,6 +516,7 @@ class InstanceState(interfaces.InspectionAttr): if (self.session_id and self._strong_obj is None) \ or not self.modified: + self.modified = True instance_dict = self._instance_dict() if instance_dict: instance_dict._modified.add(self) @@ -533,7 +537,6 @@ class InstanceState(interfaces.InspectionAttr): self.manager[attr.key], base.state_class_str(self) )) - self.modified = True def _commit(self, dict_, keys): """Commit attributes. diff --git a/test/profiles.txt b/test/profiles.txt index 84b7f8f15..ec114925a 100644 --- a/test/profiles.txt +++ b/test/profiles.txt @@ -233,7 +233,7 @@ test.aaa_profiling.test_orm.MergeTest.test_merge_no_load 3.4_postgresql_psycopg2 # TEST: test.aaa_profiling.test_orm.SessionTest.test_expire_lots -test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_sqlite_pysqlite_cextensions 1454 +test.aaa_profiling.test_orm.SessionTest.test_expire_lots 2.7_sqlite_pysqlite_cextensions 1248 # TEST: test.aaa_profiling.test_pool.QueuePoolTest.test_first_connect |