diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-04-27 23:56:09 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-04-27 23:56:09 +0000 |
commit | a456fd54759fb99d6575c8abe85cbbba638b3179 (patch) | |
tree | 5edbe6eba8ec187d57f7fcd8c4e0016fb6c99000 | |
parent | 60726abc1ca6762b0562941cdfd1f462a50bd335 (diff) | |
download | sqlalchemy-a456fd54759fb99d6575c8abe85cbbba638b3179.tar.gz |
the latest and greatest method to keep attributes from growing
-rw-r--r-- | lib/sqlalchemy/attributes.py | 27 | ||||
-rw-r--r-- | test/attributes.py | 3 | ||||
-rw-r--r-- | test/masscreate2.py | 36 | ||||
-rw-r--r-- | test/massload.py | 2 |
4 files changed, 44 insertions, 24 deletions
diff --git a/lib/sqlalchemy/attributes.py b/lib/sqlalchemy/attributes.py index 98884df44..627cac4b6 100644 --- a/lib/sqlalchemy/attributes.py +++ b/lib/sqlalchemy/attributes.py @@ -79,8 +79,12 @@ class ManagedAttribute(object): ManagedAttribute objects associated with the instance via this dictionary.""" def __init__(self, obj, key): self.__obj = weakref.ref(obj) - #self.obj = obj self.key = key + def __getstate__(self): + return {'key':self.key, 'obj':self.obj} + def __setstate__(self, d): + self.key = d['key'] + self.__obj = weakref.ref(d['obj']) obj = property(lambda s:s.__obj()) def history(self, **kwargs): return self @@ -496,25 +500,4 @@ class AttributeManager(object): will be passed along to newly created ManagedAttribute.""" if not hasattr(class_, '_attribute_manager'): class_._attribute_manager = self - class_._managed_attributes = ObjectAttributeGateway() setattr(class_, key, self.create_prop(class_, key, uselist, callable_, **kwargs)) - -managed_attributes = weakref.WeakKeyDictionary() - -class ObjectAttributeGateway(object): - """handles the dictionary of ManagedAttributes for instances. this level of indirection - is to prevent circular references upon objects, as well as keeping them Pickle-compatible.""" - def __set__(self, obj, value): - managed_attributes[obj] = value - def __delete__(self, obj): - try: - del managed_attributes[obj] - except KeyError: - raise AttributeError() - def __get__(self, obj, owner): - if obj is None: - return self - try: - return managed_attributes[obj] - except KeyError: - raise AttributeError()
\ No newline at end of file diff --git a/test/attributes.py b/test/attributes.py index bff864fa6..126f50456 100644 --- a/test/attributes.py +++ b/test/attributes.py @@ -45,7 +45,8 @@ class AttributesTest(PersistTest): manager.register_attribute(MyTest, 'email_address', uselist = False) x = MyTest() x.user_id=7 - pickle.dumps(x) + s = pickle.dumps(x) + y = pickle.loads(s) def testlist(self): class User(object):pass diff --git a/test/masscreate2.py b/test/masscreate2.py new file mode 100644 index 000000000..f261f832c --- /dev/null +++ b/test/masscreate2.py @@ -0,0 +1,36 @@ +import gc + +import random, string + +from sqlalchemy.attributes import * + +# with this test, run top. make sure the Python process doenst grow in size arbitrarily. + +class User(object): + pass + +class Address(object): + pass + +attr_manager = AttributeManager() +attr_manager.register_attribute(User, 'id', uselist=False) +attr_manager.register_attribute(User, 'name', uselist=False) +attr_manager.register_attribute(User, 'addresses', uselist=True) +attr_manager.register_attribute(Address, 'email', uselist=False) +attr_manager.register_attribute(Address, 'user', uselist=False) + + +for i in xrange(1000): + for j in xrange(1000): + u = User() + u.name = str(random.randint(0, 100000000)) + for k in xrange(10): + a = Address() + a.email_address = str(random.randint(0, 100000000)) + u.addresses.append(a) + a.user = u + print "clearing" + #managed_attributes.clear() + gc.collect() + + diff --git a/test/massload.py b/test/massload.py index 43309467a..ab47415e8 100644 --- a/test/massload.py +++ b/test/massload.py @@ -56,7 +56,7 @@ class LoadTest(AssertMixin): a.value = 'changed...' assert len(objectstore.get_session().dirty) == len(l) assert len(objectstore.get_session().identity_map) == len(l) - assert len(attributes.managed_attributes) == len(l) + #assert len(attributes.managed_attributes) == len(l) print len(objectstore.get_session().dirty) print len(objectstore.get_session().identity_map) objectstore.expunge(*l) |