Ë
    "ïàj‰!  ã                   óx   — d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	  ej                  e«      Z G d„ d«      Zy)é    N)Úutil)Úgenerate_lock_tokenÚlock_stringÚnormalize_lock_rootÚvalidate_lockc                   óx   ‡ — e Zd ZdZdddddœˆ fd„
ZdZd	Zd
„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )ÚLockStorageRediszH
    A (high performance?) lock manager implementation using redis!
    z	127.0.0.1ië  r   N©ÚhostÚportÚdbÚpasswordc                óö   •— t         ‰| �  «        || _        || _        || _        || _        d| _        | j                  j                  d«      | _        | j                  j                  d«      | _	        d | _
        y )Nz
wsgidav-{}zlock:{}zURL2TOKEN:{})ÚsuperÚ__init__Ú_redis_hostÚ_redis_portÚ	_redis_dbÚ_redis_passwordÚ_redis_prefixÚformatÚ_redis_lock_prefixÚ_redis_url2token_prefixÚ_redis)Úselfr   r   r   r   Ú	__class__s        €úR/srv/dav/.venv/lib/python3.12/site-packages/wsgidav/lock_man/lock_storage_redis.pyr   zLockStorageRedis.__init__   sn   ø€ Ü‰ÑÔØˆÔØˆÔØˆŒØ'ˆÔØ)ˆÔØ"&×"4Ñ"4×";Ñ";¸IÓ"FˆÔØ'+×'9Ñ'9×'@Ñ'@ÀÓ'PˆÔ$Øˆ�ó    i€:	 i ê$ c                 ó.   — | j                   j                  S )N)r   Ú__name__©r   s    r   Ú__repr__zLockStorageRedis.__repr__(   s   € Ø�~‰~×&Ñ&Ð&r   c                  ó   — y)z$Overloaded by Shelve implementation.N© r!   s    r   Ú_flushzLockStorageRedis._flush.   ó   � r   c                 ó¬   — | j                   �J ‚t        j                  | j                  | j                  | j
                  | j                  ¬«      | _         y)zUCalled before first use.
        May be implemented to initialize a storage.
        Nr
   )r   ÚredisÚRedisr   r   r   r   r!   s    r   ÚopenzLockStorageRedis.open1   sF   € ð �{‰{Ð"Ð"Ð"Ü—k‘kØ×!Ñ!Ø×!Ñ!Ø�~‰~Ø×)Ñ)ô	
ˆ�r   c                 ó   — d| _         y)zCalled on shutdown.N)r   r!   s    r   ÚclosezLockStorageRedis.close=   s	   € àˆ�r   c                  ó   — y)zPurge expired locks (optional).Nr$   r!   s    r   ÚcleanupzLockStorageRedis.cleanupA   r&   r   c                 óÊ   — | j                   �W| j                   j                  | j                  j                  d«      «      }|D ]  }| j                   j	                  |«       Œ yy)zDelete all entries.NÚ*)r   Úkeysr   r   Údelete)r   r1   Úkeys      r   ÚclearzLockStorageRedis.clearD   sW   € à�;‰;Ð"Ø—;‘;×#Ñ# D×$6Ñ$6×$=Ñ$=¸cÓ$BÓCˆDØò (�Ø—‘×"Ñ" 3Õ'ñ(ð #r   c                 óº  — | j                   j                  | j                  j                  |«      «      }|€*t        j                  d|› �«       | j                  |«       yt        j                  |«      }t        |d   «      }d|cxk  rt        j                  «       k  r:n |S t        j                  d|› dt        |«      › �«       | j                  |«       y|S )a   Return a lock dictionary for a token.
        If the lock does not exist or is expired, None is returned.
        token:
            lock token
        Returns:
            Lock dictionary or <None>
        Side effect: if lock is expired, it will be purged and None is returned.
        NzLock purged dangling: Úexpirer   zLock timed-out(ú): )r   Úgetr   r   Ú_loggerÚdebugr2   ÚpickleÚloadsÚfloatÚtimer   )r   ÚtokenÚlockr6   s       r   r8   zLockStorageRedis.getK   sº   € ð �{‰{�‰˜t×6Ñ6×=Ñ=¸eÓDÓEˆØˆ<ä�M‰MÐ2°5°'Ð:Ô;Ø�K‰K˜ÔØÜ�|‰|˜DÓ!ˆÜ�t˜H‘~Ó&ˆØ�Ô$œŸ™›Ô$ð ˆô �M‰M˜O¨F¨8°3´{À4Ó7HÐ6IÐJÔKØ�K‰K˜ÔØØˆr   c                 ó˜  — |j                  d«      �J ‚|j                  d«      �J d«       ‚|rd|v sJ ‚|}t        |«      }||d<   t        |j                  d«      «      }|€t        j                  }n(|dk  s|t        j
                  kD  rt        j
                  }||d<   t        j                  «       |z   |d<   t        |«       t        «       }||d<   | j                  j                  | j                  j                  |«      t        j                  |«      t        |«      ¬«       | j                   j                  |«      }| j                  j#                  |«      s| j                  j%                  ||«       n| j                  j%                  ||«       | j'                  «        t(        j+                  d	|›d
t-        |«      › �«       |S )aë  Create a direct lock for a resource path.
        path:
            Normalized path (utf8 encoded string, no trailing '/')
        lock:
            lock dictionary, without a token entry
        Returns:
            New unique lock token.: <lock
        **Note:** the lock dictionary may be modified on return:
        - lock['root'] is ignored and set to the normalized <path>
        - lock['timeout'] may be normalized and shorter than requested
        - lock['token'] is added
        r?   r6   zUse timeout instead of expireú/ÚrootÚtimeoutr   ©ÚexzLockStorageRedis.set(r7   )r8   r   r=   r	   ÚLOCK_TIME_OUT_DEFAULTÚLOCK_TIME_OUT_MAXr>   r   r   r   Úsetr   r   r;   ÚdumpsÚintr   ÚexistsÚlpushr%   r9   r:   r   )r   Úpathr@   Úorg_pathrD   r?   r3   s          r   ÚcreatezLockStorageRedis.createb   s”  € ð �x‰x˜Ó Ð(Ð(Ð(Ø�x‰x˜Ó!Ð)ÐJÐ+JÓJÐ)Ù˜˜t™Ð#Ð#ð ˆÜ" 4Ó(ˆØˆˆV‰ô ˜Ÿ™ Ó+Ó,ˆØˆ?Ü&×<Ñ<‰GØ�qŠ[˜GÔ&6×&HÑ&HÒHÜ&×8Ñ8ˆGà!ˆˆY‰ÜŸ™› wÑ.ˆˆX‰ä�dÔä#Ó%ˆØˆˆW‰ð 	�‰�‰Ø×#Ñ#×*Ñ*¨5Ó1´6·<±<ÀÓ3EÌ#ÈgË,ð 	ô 	
ð
 ×*Ñ*×1Ñ1°$Ó7ˆØ�{‰{×!Ñ! #Ô&Ø�K‰K×Ñ˜c 5Õ)à�K‰K×Ñ˜c 5Ô)Ø�‰ŒÜ�‰Ð-¨h¨\¸¼[ÈÓ=NÐ<OÐPÔQØˆr   c                ól  — | j                   j                  | j                  j                  |«      «      sJ ‚|dk(  s|dkD  sJ ‚|dk  s|t        j
                  kD  rt        j
                  }t        j                  | j                   j                  | j                  j                  |«      «      «      }||d<   t        j                  «       |z   |d<   | j                   j                  | j                  j                  |«      t        j                  |«      t        |«      ¬«       | j                  «        |S )aL  Modify an existing lock's timeout.
        token:
            Valid lock token.
        timeout:
            Suggested lifetime in seconds (-1 for infinite).
            The real expiration time may be shorter than requested!
        Returns:
            Lock dictionary.
            Raises ValueError, if token is invalid.
        éÿÿÿÿr   rD   r6   rE   )r   rL   r   r   r	   rH   r;   r<   r8   r>   rI   rJ   rK   r%   )r   r?   rD   r@   s       r   ÚrefreshzLockStorageRedis.refresh—   sõ   € ð �{‰{×!Ñ! $×"9Ñ"9×"@Ñ"@ÀÓ"GÔHÐHÐHØ˜"Š} ¨!¢Ð+Ð+Ø�QŠ;˜'Ô$4×$FÑ$FÒFÜ&×8Ñ8ˆGô �|‰|˜DŸK™KŸO™O¨D×,CÑ,C×,JÑ,JÈ5Ó,QÓRÓSˆØ!ˆˆY‰ÜŸ™› wÑ.ˆˆX‰Ø�‰�‰Ø×#Ñ#×*Ñ*¨5Ó1´6·<±<ÀÓ3EÌ#ÈgË,ð 	ô 	
ð 	�‰ŒØˆr   c                 óô  — | j                   j                  | j                  j                  |«      «      }|€yt	        j
                  |«      }t        j                  dt        |«      › �«       | j                  j                  |j                  d«      «      }| j                   j                  |d|«       | j                   j                  | j                  j                  |«      «       | j                  «        y)zeDelete lock.
        Returns True on success. False, if token does not exist, or is expired.
        Fzdelete rC   é   T)r   r8   r   r   r;   r<   r9   r:   r   r   Úlremr2   r%   )r   r?   r@   r3   s       r   r2   zLockStorageRedis.delete²   sº   € ð �{‰{�‰˜t×6Ñ6×=Ñ=¸eÓDÓEˆØˆ<ØÜ�|‰|˜DÓ!ˆÜ�‰˜¤¨DÓ 1Ð2Ð3Ô4à×*Ñ*×1Ñ1°$·(±(¸6Ó2BÓCˆØ�‰×Ñ˜˜a Ô'Ø�‰×Ñ˜4×2Ñ2×9Ñ9¸%Ó@ÔAØ�‰ŒØr   c                óð  ‡ ‡‡	— t        j                  |«      sJ ‚|r|j                  d«      sJ ‚|s|sJ ‚ˆ	ˆ ˆfd„}t        |«      }‰ j                  j                  |«      }‰ j                  j                  |dd«      }g Š	|r ||«       |rht        d„ ‰ j                  j                  |dz   «      «      D ]<  }t        j                  ||«      sŒ |‰ j                  j                  |dd«      «       Œ> ‰	S )au  Return a list of direct locks for <path>.
        Expired locks are *not* returned (but may be purged).
        path:
            Normalized path (utf8 encoded string, no trailing '/')
        include_root:
            False: don't add <path> lock (only makes sense, when include_children
            is True).
        include_children:
            True: Also check all sub-paths for existing locks.
        token_only:
            True: only a list of token is returned. This may be implemented
            more efficiently by some providers.
        Returns:
            List of valid lock dictionaries (may be empty).
        rB   c                 ó  •— t        d„ | «      D ]v  }‰j                  j                  ‰j                  j	                  |«      «      }|sŒ:t        j                  |«      }‰r‰j                  |d   «       Œf‰j                  |«       Œx y )Nc                 ó$   — | j                  d«      S ©Nzutf-8©Údecode©Úxs    r   ú<lambda>zGLockStorageRedis.get_lock_list.<locals>.__appendLocks.<locals>.<lambda>Ù   s   €  q§x¡x°Ó'8€ r   r?   )Úmapr   r8   r   r   r;   r<   Úappend)Útoklistr?   r@   ÚlockListr   Ú
token_onlys      €€€r   Ú__appendLocksz5LockStorageRedis.get_lock_list.<locals>.__appendLocksÖ   so   ø€ ô Ñ8¸'ÓBò .�Ø—{‘{—‘ t×'>Ñ'>×'EÑ'EÀeÓ'LÓM�ÚÜ!Ÿ<™<¨Ó-�DÙ!Ø Ÿ™¨¨W©Õ6à Ÿ™¨Õ-ñ.r   r   rR   c                 ó$   — | j                  d«      S rZ   r[   r]   s    r   r_   z0LockStorageRedis.get_lock_list.<locals>.<lambda>ë   s   €  1§8¡8¨GÓ#4€ r   z/*)r   Úis_strÚ
startswithr   r   r   r   Úlranger`   r1   Úis_child_uri)
r   rN   Úinclude_rootÚinclude_childrenrd   Ú_LockStorageRedis__appendLocksr3   ÚtokListÚurc   s
   `   `    @r   Úget_lock_listzLockStorageRedis.get_lock_listÂ   sç   ú€ ô  �{‰{˜4Ô Ð Ð Ù˜Ÿ™¨Ô,Ð,Ð,ÙÑ/Ð/Ð/ö
	.ô # 4Ó(ˆØ×*Ñ*×1Ñ1°$Ó7ˆà—+‘+×$Ñ$ S¨!¨RÓ0ˆØˆÙÙ˜'Ô"áÜÑ4°d·k±k×6FÑ6FÀsÈTÁzÓ6RÓSò @�Ü×$Ñ$ S¨!Õ,Ù! $§+¡+×"4Ñ"4°Q¸¸2Ó">Õ?ð@ð ˆr   )r    Ú
__module__Ú__qualname__Ú__doc__r   rG   rH   r"   r%   r*   r,   r.   r4   r8   rP   rS   r2   rp   Ú__classcell__)r   s   @r   r	   r	      s^   ø„ ñð  +°¸!Àdö 	ð #ÐØ"Ðò'ò3ò

òò.ò(òò.3òjò6ö ,r   r	   )r;   r>   r(   Úwsgidavr   Úwsgidav.lock_man.lock_managerr   r   r   r   Úget_module_loggerr    r9   r	   r$   r   r   ú<module>rx      s=   ðó
 Û ã å ÷ó ð !ˆ$×
 Ñ
  Ó
*€÷Yò Yr   