]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
turn commit_all into an iterative method
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 25 Jun 2012 17:12:48 +0000 (13:12 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 25 Jun 2012 17:12:48 +0000 (13:12 -0400)
lib/sqlalchemy/orm/loading.py
lib/sqlalchemy/orm/session.py
lib/sqlalchemy/orm/state.py
test/aaa_profiling/test_orm.py

index 8fb13b3a024f236a9537ddd10543bc96e8077abb..b0d1718e08b07e3770232018ffd4926c8c3f5c53 100644 (file)
@@ -18,6 +18,7 @@ from . import attributes, exc as orm_exc
 from .interfaces import EXT_CONTINUE
 from ..sql import util as sql_util
 from .util import _none_set, state_str
+statelib = util.importlater("sqlalchemy.orm", "state")
 
 _new_runid = util.counter()
 
@@ -80,9 +81,10 @@ def instances(query, cursor, context):
                     context.refresh_state.dict, query._only_load_props)
             context.progress.pop(context.refresh_state)
 
-        for state, dict_ in context.progress.items():
-            state.commit_all(dict_, session.identity_map)
-
+        statelib.InstanceState.commit_all_states(
+            context.progress.items(),
+            session.identity_map
+        )
 
         for ii, (dict_, attrs) in context.partials.iteritems():
             ii.commit(dict_, attrs)
index 1f302923d18df6bb25cd1ac05b5636f5f935163f..9ce3c8628ee1e8b024bdd83cb42d94c6f2ed004e 100644 (file)
@@ -21,7 +21,7 @@ from .util import (
 from .unitofwork import UOWTransaction
 from .mapper import Mapper
 from .events import SessionEvents
-
+statelib = util.importlater("sqlalchemy.orm", "state")
 import sys
 
 __all__ = ['Session', 'SessionTransaction', 'SessionExtension']
@@ -1217,7 +1217,11 @@ class Session(object):
                     state.key = instance_key
 
                 self.identity_map.replace(state)
-                state.commit_all(state.dict, self.identity_map)
+
+        statelib.InstanceState.commit_all_states(
+            ((state, state.dict) for state in states),
+            self.identity_map
+        )
 
         self._register_altered(states)
         # remove from new last, might be the last strong ref
index 52b29a99dd39e7d51bfad96eb8143c28b7538295..8333d670820b0183faaca070097d0cbcc0131510 100644 (file)
@@ -435,24 +435,30 @@ class InstanceState(object):
          - the "modified" flag is set to False
          - any "expired" markers/callables for attributes loaded are removed.
 
-        Attributes marked as "expired" can potentially remain "expired" after this step
-        if a value was not populated in state.dict.
+        Attributes marked as "expired" can potentially remain 
+        "expired" after this step if a value was not populated in state.dict.
 
         """
+        self.commit_all_states([(self, dict_)], instance_dict)
 
-        self.committed_state.clear()
-        self.__dict__.pop('_pending_mutations', None)
+    @classmethod
+    def commit_all_states(self, iter, instance_dict=None):
+        """Mass version of commit_all()."""
+
+        for state, dict_ in iter:
+            state.committed_state.clear()
+            state.__dict__.pop('_pending_mutations', None)
 
-        callables = self.callables
-        for key in list(callables):
-            if key in dict_ and callables[key] is self:
-                del callables[key]
+            callables = state.callables
+            for key in list(callables):
+                if key in dict_ and callables[key] is state:
+                    del callables[key]
 
-        if instance_dict and self.modified:
-            instance_dict._modified.discard(self)
+            if instance_dict and state.modified:
+                instance_dict._modified.discard(state)
 
-        self.modified = self.expired = False
-        self._strong_obj = None
+            state.modified = state.expired = False
+            state._strong_obj = None
 
 class InspectAttr(object):
     """Provide inspection interface to an object's state."""
index 2058b73c4356a82c650813cbc8ed293cd302fb80..d66d2704ddb3816a964dc2e477e4050dd155a3b5 100644 (file)
@@ -70,7 +70,7 @@ class MergeTest(fixtures.MappedTest):
         # third call, merge object already present. almost no calls.
 
         @profiling.function_call_count(variance=0.05,
-                versions={'2.7':14, '2.6':14, '2.5':15, '3': 15})
+                versions={'2.7':15, '2.6':15, '2.5':16, '3': 16})
         def go():
             return sess2.merge(p2, load=False)
         p3 = go()