]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
dont see the need to re-call post_configure inside a reentrant loop. since we're
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 14 Aug 2009 17:02:56 +0000 (17:02 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 14 Aug 2009 17:02:56 +0000 (17:02 +0000)
in 0.6 let's just simplify.

lib/sqlalchemy/orm/mapper.py
test/orm/test_mapper.py

index dcf33d07eb66116de63b80288e9f8449dc5671fe..f4cc72cefc654d8d771557797a17997851f03e16 100644 (file)
@@ -636,10 +636,6 @@ class Mapper(object):
             try:
                 global _already_compiling
                 if _already_compiling:
-                    # re-entrance to compile() occurs rarely, when a class-mapped construct is
-                    # used within a ForeignKey, something that is possible
-                    # when using the declarative layer
-                    self._post_configure_properties()
                     return
                 _already_compiling = True
                 try:
index 597b0bd566bde5b681019c2f67389d6a50ffda21..01ee232318a58ee81138c29cef795d548fbf58a6 100644 (file)
@@ -893,11 +893,6 @@ class MapperTest(_fixtures.FixtureTest):
 
     @testing.resolve_artifact_names
     def test_reentrant_compile(self):
-        # this trips the _already_compiling
-        # flag in mapper.compile().  but if the m2.compile is 
-        # changed to m1.compile, you still get a stack overflow.
-        # not sure why the previous use case did it that way (i.e. 
-        # it was declarative compiling a mapper within ForeignKey()).
         class MyFakeProperty(sa.orm.properties.ColumnProperty):
             def post_instrument_class(self, mapper):
                 super(MyFakeProperty, self).post_instrument_class(mapper)
@@ -908,6 +903,18 @@ class MapperTest(_fixtures.FixtureTest):
         })
         m2 = mapper(Address, addresses)
         compile_mappers()
+
+        sa.orm.clear_mappers()
+        class MyFakeProperty(sa.orm.properties.ColumnProperty):
+            def post_instrument_class(self, mapper):
+                super(MyFakeProperty, self).post_instrument_class(mapper)
+                m1.compile()
+            
+        m1 = mapper(User, users, properties={
+            'name':MyFakeProperty(users.c.name)
+        })
+        m2 = mapper(Address, addresses)
+        compile_mappers()
         
     @testing.resolve_artifact_names
     def test_reconstructor(self):