def _append_db_queue(self, modified_settings, is_cancel=False): """Update the queue to the runtime DB.""" now = get_current_time_string(display_sub_seconds=True) for broadcast_change in ( get_broadcast_change_iter(modified_settings, is_cancel)): broadcast_change["time"] = now self.db_inserts_map[self.TABLE_BROADCAST_EVENTS].append( broadcast_change) if is_cancel: self.db_deletes_map[self.TABLE_BROADCAST_STATES].append({ "point": broadcast_change["point"], "namespace": broadcast_change["namespace"], "key": broadcast_change["key"]}) # Delete statements are currently executed before insert # statements, so we should clear out any insert statements that # are deleted here. # (Not the most efficient logic here, but unless we have a # large number of inserts, then this should not be a big # concern.) inserts = [] for insert in self.db_inserts_map[self.TABLE_BROADCAST_STATES]: if any([insert[key] != broadcast_change[key] for key in ["point", "namespace", "key"]]): inserts.append(insert) self.db_inserts_map[self.TABLE_BROADCAST_STATES] = inserts else: self.db_inserts_map[self.TABLE_BROADCAST_STATES].append({ "point": broadcast_change["point"], "namespace": broadcast_change["namespace"], "key": broadcast_change["key"], "value": broadcast_change["value"]})
def load(self, pickled_settings): """Load broadcast variables from the state dump file.""" with self.lock: self.settings = pickle.loads(pickled_settings) # Ensure database table is in sync modified_settings = [] for point_string, point_string_settings in self.settings.items(): for namespace, namespace_settings in point_string_settings.items(): stuff_stack = [([], namespace_settings)] while stuff_stack: keys, stuff = stuff_stack.pop() for key, value in stuff.items(): if isinstance(value, dict): stuff_stack.append((keys + [key], value)) else: setting = {key: value} for rkey in reversed(keys): setting = {rkey: setting} modified_settings.append( (point_string, namespace, setting)) for broadcast_change in get_broadcast_change_iter(modified_settings): self.db_inserts_map[self.TABLE_BROADCAST_STATES].append({ "point": broadcast_change["point"], "namespace": broadcast_change["namespace"], "key": broadcast_change["key"], "value": broadcast_change["value"]})
def put_broadcast(self, modified_settings, is_cancel=False): """Put or clear broadcasts in runtime database.""" now = get_current_time_string(display_sub_seconds=True) for broadcast_change in ( get_broadcast_change_iter(modified_settings, is_cancel)): broadcast_change["time"] = now self.db_inserts_map[self.TABLE_BROADCAST_EVENTS].append( broadcast_change) if is_cancel: self.db_deletes_map[self.TABLE_BROADCAST_STATES].append({ "point": broadcast_change["point"], "namespace": broadcast_change["namespace"], "key": broadcast_change["key"]}) # Delete statements are currently executed before insert # statements, so we should clear out any insert statements that # are deleted here. # (Not the most efficient logic here, but unless we have a # large number of inserts, then this should not be a big # concern.) inserts = [] for insert in self.db_inserts_map[self.TABLE_BROADCAST_STATES]: if any(insert[key] != broadcast_change[key] for key in ["point", "namespace", "key"]): inserts.append(insert) self.db_inserts_map[self.TABLE_BROADCAST_STATES] = inserts else: self.db_inserts_map[self.TABLE_BROADCAST_STATES].append({ "point": broadcast_change["point"], "namespace": broadcast_change["namespace"], "key": broadcast_change["key"], "value": broadcast_change["value"]})
def load(self, pickled_settings): """Load broadcast variables from the state dump file.""" with self.lock: self.settings = pickle.loads(pickled_settings) # Ensure database table is in sync modified_settings = [] for point_string, point_string_settings in self.settings.items(): for namespace, namespace_settings in ( point_string_settings.items()): stuff_stack = [([], namespace_settings)] while stuff_stack: keys, stuff = stuff_stack.pop() for key, value in stuff.items(): if isinstance(value, dict): stuff_stack.append((keys + [key], value)) else: setting = {key: value} for rkey in reversed(keys): setting = {rkey: setting} modified_settings.append( (point_string, namespace, setting)) for broadcast_change in get_broadcast_change_iter(modified_settings): self.db_inserts_map[self.TABLE_BROADCAST_STATES].append({ "point": broadcast_change["point"], "namespace": broadcast_change["namespace"], "key": broadcast_change["key"], "value": broadcast_change["value"]})