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
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
--- /dev/null
+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()
+
+
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)