]> jfr.im git - irc/rizon/acid.git/commitdiff
Keep a separate dirty items list instead of finding them by iterating over all objects
authorAdam <redacted>
Wed, 22 Oct 2014 19:27:07 +0000 (15:27 -0400)
committerAdam <redacted>
Wed, 22 Oct 2014 20:40:40 +0000 (16:40 -0400)
pyva/pyva/src/main/python/pseudoclient/collection.py

index e362e4dfa2339234063fff3a763c2b26048aefd7..32622909c0f3e5a3f001b4d2e5b5f0abc4f104e8 100644 (file)
@@ -64,6 +64,7 @@ class CollectionManager(InvariantCollection):
        def __init__(self, type):
                InvariantCollection.__init__(self)
                self.__type = type
+               self.__dirty_items = []
                self.__deleted_items = []
 
                self.db_open()
@@ -98,14 +99,15 @@ class CollectionManager(InvariantCollection):
        def commit(self):
                try:
                        deleted = [(e.id, ) for e in self.list_deleted()]
-                       changed = [e for e in self.list_dirty()]
 
                        if len(deleted) > 0:
                                self.cursor.executemany("DELETE FROM " + self.module.name + "_" + self.name + "_options WHERE id = %s", deleted)
                                self.cursor.executemany("DELETE FROM " + self.module.name + "_" + self.name + " WHERE id = %s", deleted)
                                self.module.elog.commit('Deleted %d %s from database.' % (len(deleted), self.name))
 
-                       for e in changed:
+                       changed = 0
+                       for e in self.list_dirty():
+                               changed = changed + 1
                                try:
                                        if e.id == -1:
                                                self.cursor.execute("INSERT INTO " + self.module.name + "_" + self.name + " (name) VALUES(%s)", (e.name,))
@@ -120,13 +122,11 @@ class CollectionManager(InvariantCollection):
                                except Exception, err:
                                        traceback.print_exc()
                                        self.module.elog.error(self.name + ' commit failed for ' + e.name + ': @b%s@b' % err)
-                       if len(changed) > 0:
-                               self.module.elog.commit('Committed %d %s to database.' % (len(changed), self.name))
+                       if changed:
+                               self.module.elog.commit('Committed %d %s to database.' % (changed, self.name))
 
+                       self.clear_dirty()
                        self.clear_deleted()
-
-                       for e in self.list_all():
-                               e._dirty = False
                except Exception, err:
                        traceback.print_exc()
                        self.module.elog.error(self.name + ' commit failed: @b%s@b' % err)
@@ -143,7 +143,7 @@ class CollectionManager(InvariantCollection):
        def is_dirty(self, item):
                self.check(item)
 
-               return item in self and self[item]._dirty
+               return item in self and item in self.__dirty_items
 
        def is_valid(self, item):
                self.check(item)
@@ -167,12 +167,12 @@ class CollectionManager(InvariantCollection):
 
                if old_value != value:
                        setattr(entity, attribute, value)
-                       entity._dirty = True
+                       self.set_dirty(entity)
 
        def add(self, item):
                if not item in self:
                        entity = self.__type(-1, item)
-                       entity._dirty = True
+                       self.set_dirty(entity)
                        entity.registered = True
                        self[item] = entity
 
@@ -189,7 +189,7 @@ class CollectionManager(InvariantCollection):
                if entity.banned and entity.registered:
                        entity.registered = False
                        entity.clear()
-                       entity._dirty = True
+                       self.set_dirty(entity)
                elif not entity.banned:
                        if not item.lower() in self.__deleted_items:
                                self.__deleted_items.append(entity)
@@ -205,7 +205,7 @@ class CollectionManager(InvariantCollection):
                entity.ban_reason = reason
                entity.ban_date = date
                entity.ban_expiry = expiry
-               entity._dirty = True
+               self.set_dirty(entity)
 
                self.on_banned(item)
 
@@ -223,7 +223,7 @@ class CollectionManager(InvariantCollection):
                if not entity.registered:
                        self.remove(item)
                else:
-                       entity._dirty = True
+                       self.set_dirty(entity)
 
                self.on_unbanned(item)
 
@@ -239,6 +239,13 @@ class CollectionManager(InvariantCollection):
        def on_unbanned(self, item):
                pass
 
+       def set_dirty(self, item):
+               if item not in self.__dirty_items:
+                       self.__dirty_items.append(item)
+
+       def clear_dirty(self):
+               self.__dirty_items = []
+
        def clear_deleted(self):
                self.__deleted_items = []
 
@@ -246,13 +253,14 @@ class CollectionManager(InvariantCollection):
                return self.__deleted_items
 
        def list_dirty(self):
-               items = [item for item in self]
-               return [self[item] for item in items if self.is_dirty(item)]
+               return self.__dirty_items
 
        def list_valid(self):
-               items = [item for item in self]
-               return [self[item] for item in items if self.is_valid(item)]
+               for item in self:
+                       if self.is_valid(item):
+                               yield self[item]
 
        def list_banned(self):
-               items = [item for item in self]
-               return [self[item] for item in items if self.is_banned(item)]
+               for item in self:
+                       if self.is_banned(item):
+                               yield self[item]