]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
moved major awareness of lists, lazyloading, etc. all into the objectstore
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 7 Sep 2005 06:26:15 +0000 (06:26 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 7 Sep 2005 06:26:15 +0000 (06:26 +0000)
lib/sqlalchemy/objectstore.py

index b1e454e024922148746ec7a11ecce62cb182a4af..714ea8c292a3f793789efc29fd57a4e4f36640d8 100644 (file)
@@ -115,10 +115,15 @@ class UnitOfWork:
         self.attribute_history = weakref.WeakKeyDictionary()
         
     def attribute_set(self, obj, key, value):
-        self.register_attribute(obj, key).setattr(value)    
+        self.register_attribute(obj, key).setattr(value)
+        obj.__dict__[key] = value
+        self.register_dirty(obj)
+        
     def attribute_deleted(self, obj, key, value):
         self.register_attribute(obj, key).delattr(value)    
-    
+        del obj.__dict__[key]
+        self.register_dirty(obj)
+        
     def register_attribute(self, obj, key):
         try:
             attributes = self.attribute_history[obj]
@@ -128,6 +133,27 @@ class UnitOfWork:
             return attributes[key]
         except KeyError:
             return attributes.setdefault(key, util.PropHistory(obj.__dict__.get(key, None)))
+
+    def register_list_attribute(self, obj, key, data = None, loader = None):
+        if loader is not None:
+            obj.__dict__[key] = loader
+            return
+            
+        try:
+            childlist = obj.__dict__[key]
+        except KeyError:
+            childlist = util.HistoryArraySet()
+            obj.__dict__[key] = childlist
+        
+        if callable(childlist):
+            childlist = childlist()
+            
+        if not isinstance(childlist, util.HistoryArraySet):
+            childlist = util.HistoryArraySet(childlist)
+            obj.__dict__[key] = childlist
+        if data is not None and childlist.data != data:
+            childlist.set_data(data)
+        return childlist
         
     def register_clean(self, obj):
         self.clean.append(obj)