
    ]j                         d dl Z d dlmZmZmZ d dlmZ d dlmZ ddl	m
Z
mZ erddlmZ defd	Zdd
ddee   ddfdZdd
ddee   ddfdZdedee   fdZddededefdZy)    N)TYPE_CHECKINGListOptional)Redis)Pipeline   )DuplicateSchedulerErrorSchedulerNotFound)CronSchedulerreturnc                       y)z0Get the Redis key for the CronScheduler registryzrq:cron_schedulers r       D/root/env/lib/python3.12/site-packages/rq/cron_scheduler_registry.pyget_registry_keyr      s    r   cron_schedulerr   pipelinec                     ||n| j                   }t               }t        j                         }|j                  || j                  |id      }|dk(  rt        d| j                   d      y)a9  Register a CronScheduler in the registry with current timestamp as score

    Args:
        cron_scheduler: CronScheduler instance to register
        pipeline: Redis pipeline to use. If None, uses cron_scheduler.connection

    Raises:
        DuplicateSchedulerError: If the scheduler is already registered
    NT)nxr   CronScheduler 'z' is already registered)
connectionr   timezaddnamer	   )r   r   r   registry_keyscoreadded_counts         r   registerr      sv     &1~7P7PJ#%L IIKE //,1D1De0LQU/VKa%8K8K7LLc&dee r   c                     ||n| j                   }t               }|j                  || j                        }|st	        d| j                   d      y)a  Remove a CronScheduler from the registry

    Args:
        cron_scheduler: CronScheduler instance to unregister
        pipeline: Redis pipeline to use. If None, uses cron_scheduler.connection

    Raises:
        SchedulerNotFound: If the scheduler is not found in the registry
    Nr   z' not found in registry)r   r   zremr   r
   )r   r   r   r   results        r   
unregisterr"   )   sZ     &1~7P7PJ#%L __\>+>+>?F/.2E2E1FF] ^__ r   r   c                     t               }| j                  |dd      }|D cg c]%  }t        |t              r|j	                  d      n|' c}S c c}w )zGet all registered CronScheduler names from the registry

    Args:
        connection: Redis connection to use

    Returns:
        List of CronScheduler names (strings) sorted by registration time (oldest first)
    r   zutf-8)r   zrange
isinstancebytesdecode)r   r   keyskeys       r   get_keysr+   <   sQ     $%L \1b1D OSSs:c5#9CJJwsBSSSs   *A	thresholdc                 f    t        j                          |z
  }| j                  t               d|      S )a^  Remove stale CronScheduler entries from the registry

    Removes schedulers that haven't sent a heartbeat in more than `threshold` seconds.

    Args:
        connection: Redis connection to use
        threshold: Number of seconds after which a scheduler is considered stale (default: 120)

    Returns:
        Number of stale entries removed
    r   )r   zremrangebyscorer   )r   r,   cutoff_times      r   cleanupr0   O   s/     ))+	)K &&'7'91kJJr   )N)x   )r   typingr   r   r   redisr   redis.clientr   
exceptionsr	   r
   cronr   strr   r   r"   r+   intr0   r   r   r   <module>r9      s     0 0  ! B# #  
f_ f8J fVZ f.` `(8:L `X\ `&T T49 T&K K# K Kr   