def __init__(self, type):
InvariantCollection.__init__(self)
self.__type = type
+ self.__dirty_items = []
self.__deleted_items = []
self.db_open()
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,))
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)
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)
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
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)
entity.ban_reason = reason
entity.ban_date = date
entity.ban_expiry = expiry
- entity._dirty = True
+ self.set_dirty(entity)
self.on_banned(item)
if not entity.registered:
self.remove(item)
else:
- entity._dirty = True
+ self.set_dirty(entity)
self.on_unbanned(item)
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 = []
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]