summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-02-18 14:23:45 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2015-02-18 14:23:45 -0500
commit698fb60e67a5952a46f56b21488d64a34d8acb8b (patch)
tree42a6f09c34611adfc0e8b549af40967685e4eac5
parent15e670fbc4bdfc3d1521163677c5e874f430b958 (diff)
downloadsqlalchemy-698fb60e67a5952a46f56b21488d64a34d8acb8b.tar.gz
- inline the discard process
-rw-r--r--lib/sqlalchemy/orm/identity.py9
-rw-r--r--lib/sqlalchemy/orm/state.py7
-rw-r--r--test/profiles.txt2
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