From: Mike Bayer Date: Mon, 31 Aug 2009 21:24:52 +0000 (+0000) Subject: - Fixed recursion issue which occured if a mapped object's X-Git-Tag: rel_0_6beta1~310 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=358ab55c311a823c241a5ae87806cb2607e5e1f1;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Fixed recursion issue which occured if a mapped object's `__len__()` or `__nonzero__()` method resulted in state changes. [ticket:1501] --- diff --git a/CHANGES b/CHANGES index 8f58c1d737..4018496c53 100644 --- a/CHANGES +++ b/CHANGES @@ -430,6 +430,10 @@ CHANGES http://www.sqlalchemy.org/trac/wiki/UsageRecipes/PreFilteredQuery for an example. + - Fixed recursion issue which occured if a mapped object's + `__len__()` or `__nonzero__()` method resulted in state + changes. [ticket:1501] + - Fixed a somewhat hypothetical issue which would result in the wrong primary key being calculated for a mapper using the old polymorphic_union function - but this diff --git a/lib/sqlalchemy/orm/state.py b/lib/sqlalchemy/orm/state.py index 25e557edae..3e80b703fd 100644 --- a/lib/sqlalchemy/orm/state.py +++ b/lib/sqlalchemy/orm/state.py @@ -289,7 +289,7 @@ class InstanceState(object): instance_dict._modified.add(self) self.modified = True - if not self._strong_obj: + if self._strong_obj is None: self._strong_obj = self.obj() def commit(self, dict_, keys): diff --git a/test/orm/test_mapper.py b/test/orm/test_mapper.py index 5d013b65cc..250992049f 100644 --- a/test/orm/test_mapper.py +++ b/test/orm/test_mapper.py @@ -2631,7 +2631,35 @@ class RequirementsTest(_base.MappedTest): sa.orm.eagerload_all('h3s.h1s')).all() eq_(len(h1s), 5) + @testing.resolve_artifact_names + def test_nonzero_len_recursion(self): + class H1(object): + def __len__(self): + return len(self.get_value()) + + def get_value(self): + self.value = "foobar" + return self.value + + class H2(object): + def __nonzero__(self): + return bool(self.get_value()) + def get_value(self): + self.value = "foobar" + return self.value + + mapper(H1, ht1) + mapper(H2, ht1) + + h1 = H1() + h1.value = "Asdf" + h1.value = "asdf asdf" # ding + + h2 = H2() + h2.value = "Asdf" + h2.value = "asdf asdf" # ding + class MagicNamesTest(_base.MappedTest): @classmethod