:meta private:
| 54 | |
| 55 | |
| 56 | class FileHandlerBackend(HandlerBackend): |
| 57 | """ |
| 58 | :meta private: |
| 59 | """ |
| 60 | def __init__(self, handlers=None, filename='./.handler-saves/handlers.save', delay=120): |
| 61 | super(FileHandlerBackend, self).__init__(handlers) |
| 62 | self.filename = filename |
| 63 | self.delay = delay |
| 64 | self.timer = threading.Timer(delay, self.save_handlers) |
| 65 | |
| 66 | def register_handler(self, handler_group_id, handler): |
| 67 | if handler_group_id in self.handlers: |
| 68 | self.handlers[handler_group_id].append(handler) |
| 69 | else: |
| 70 | self.handlers[handler_group_id] = [handler] |
| 71 | self.start_save_timer() |
| 72 | |
| 73 | def clear_handlers(self, handler_group_id): |
| 74 | self.handlers.pop(handler_group_id, None) |
| 75 | self.start_save_timer() |
| 76 | |
| 77 | def get_handlers(self, handler_group_id): |
| 78 | handlers = self.handlers.pop(handler_group_id, None) |
| 79 | self.start_save_timer() |
| 80 | return handlers |
| 81 | |
| 82 | def start_save_timer(self): |
| 83 | if not self.timer.is_alive(): |
| 84 | if self.delay <= 0: |
| 85 | self.save_handlers() |
| 86 | else: |
| 87 | self.timer = threading.Timer(self.delay, self.save_handlers) |
| 88 | self.timer.start() |
| 89 | |
| 90 | def save_handlers(self): |
| 91 | self.dump_handlers(self.handlers, self.filename) |
| 92 | |
| 93 | def load_handlers(self, filename=None, del_file_after_loading=True): |
| 94 | if not filename: |
| 95 | filename = self.filename |
| 96 | tmp = self.return_load_handlers(filename, del_file_after_loading=del_file_after_loading) |
| 97 | if tmp is not None: |
| 98 | self.handlers.update(tmp) |
| 99 | |
| 100 | @staticmethod |
| 101 | def dump_handlers(handlers, filename, file_mode="wb"): |
| 102 | dirs = filename.rsplit('/', maxsplit=1)[0] |
| 103 | os.makedirs(dirs, exist_ok=True) |
| 104 | |
| 105 | with open(filename + ".tmp", file_mode) as file: |
| 106 | if apihelper.CUSTOM_SERIALIZER is None: |
| 107 | pickle.dump(handlers, file) |
| 108 | else: |
| 109 | apihelper.CUSTOM_SERIALIZER.dump(handlers, file) |
| 110 | |
| 111 | if os.path.isfile(filename): |
| 112 | os.remove(filename) |
| 113 |
no outgoing calls
searching dependent graphs…