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"]})
Exemple #2
0
    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"]})
Exemple #3
0
 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"]})
Exemple #4
0
    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"]})