| 
									
										
										
										
											2021-01-05 11:22:48 +01:00
										 |  |  | # SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import time | 
					
						
							| 
									
										
										
										
											2022-01-24 09:46:32 +01:00
										 |  |  | from typing import Optional | 
					
						
							| 
									
										
										
										
											2021-01-05 11:22:48 +01:00
										 |  |  | import uwsgi  # pylint: disable=E0401 | 
					
						
							|  |  |  | from . import shared_abstract | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _last_signal = 10 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class UwsgiCacheSharedDict(shared_abstract.SharedDict): | 
					
						
							| 
									
										
										
										
											2022-01-24 09:46:32 +01:00
										 |  |  |     def get_int(self, key: str) -> Optional[int]: | 
					
						
							| 
									
										
										
										
											2021-01-05 11:22:48 +01:00
										 |  |  |         value = uwsgi.cache_get(key) | 
					
						
							|  |  |  |         if value is None: | 
					
						
							|  |  |  |             return value | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return int.from_bytes(value, 'big') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-24 09:46:32 +01:00
										 |  |  |     def set_int(self, key: str, value: int): | 
					
						
							| 
									
										
										
										
											2021-01-05 11:22:48 +01:00
										 |  |  |         b = value.to_bytes(4, 'big') | 
					
						
							|  |  |  |         uwsgi.cache_update(key, b) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-24 09:46:32 +01:00
										 |  |  |     def get_str(self, key: str) -> Optional[str]: | 
					
						
							| 
									
										
										
										
											2021-01-05 11:22:48 +01:00
										 |  |  |         value = uwsgi.cache_get(key) | 
					
						
							|  |  |  |         if value is None: | 
					
						
							|  |  |  |             return value | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return value.decode('utf-8') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-24 09:46:32 +01:00
										 |  |  |     def set_str(self, key: str, value: str): | 
					
						
							| 
									
										
										
										
											2021-01-05 11:22:48 +01:00
										 |  |  |         b = value.encode('utf-8') | 
					
						
							|  |  |  |         uwsgi.cache_update(key, b) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def schedule(delay, func, *args): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Can be implemented using a spooler. | 
					
						
							|  |  |  |     https://uwsgi-docs.readthedocs.io/en/latest/PythonDecorators.html | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     To make the uwsgi configuration simple, use the alternative implementation. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     global _last_signal | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def sighandler(signum): | 
					
						
							|  |  |  |         now = int(time.time()) | 
					
						
							| 
									
										
										
										
											2021-01-11 18:44:39 +01:00
										 |  |  |         key = 'scheduler_call_time_signal_' + str(signum) | 
					
						
							| 
									
										
										
										
											2021-01-05 11:22:48 +01:00
										 |  |  |         uwsgi.lock() | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2021-01-11 18:44:39 +01:00
										 |  |  |             updating = uwsgi.cache_get(key) | 
					
						
							| 
									
										
										
										
											2021-01-05 11:22:48 +01:00
										 |  |  |             if updating is not None: | 
					
						
							|  |  |  |                 updating = int.from_bytes(updating, 'big') | 
					
						
							|  |  |  |                 if now - updating < delay: | 
					
						
							|  |  |  |                     return | 
					
						
							| 
									
										
										
										
											2021-01-11 18:44:39 +01:00
										 |  |  |             uwsgi.cache_update(key, now.to_bytes(4, 'big')) | 
					
						
							| 
									
										
										
										
											2021-01-05 11:22:48 +01:00
										 |  |  |         finally: | 
					
						
							|  |  |  |             uwsgi.unlock() | 
					
						
							|  |  |  |         func(*args) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     signal_num = _last_signal | 
					
						
							|  |  |  |     _last_signal += 1 | 
					
						
							|  |  |  |     uwsgi.register_signal(signal_num, 'worker', sighandler) | 
					
						
							|  |  |  |     uwsgi.add_timer(signal_num, delay) | 
					
						
							| 
									
										
										
										
											2021-01-13 14:07:39 +01:00
										 |  |  |     return True |