Ë
    "ïàj“-  ã                   ó‚   — d Z ddlZddlZddlmZ ddlmZ dZ ej                  d«      Z	 G d„ d«      Z
 G d	„ d
e
«      Zy)af  
Implements two property managers: one in-memory (dict-based), and one
persistent low performance variant using shelve.

The properties dictionaray is built like::

    { ref-url1: {propname1: value1,
                 propname2: value2,
                 },
      ref-url2: {propname1: value1,
                 propname2: value2,
                 },
      }

é    N)Úutil)ÚReadWriteLockÚreStructuredTextzwsgidav.prop_manc                   ó~   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dd„Z
dd	„Zdd„Zdd„Z	 dd„Zdd„Zdd„Zdd„Zdd„Zy
)ÚPropertyManagerzè
    An in-memory property manager implementation using a dictionary.

    This is obviously not persistent, but should be enough in some cases.
    For a persistent implementation, see property_manager.ShelvePropertyManager().
    c                 óL   — d | _         d| _        t        «       | _        d| _        y )NFé   )Ú_dictÚ_loadedr   Ú_lockÚ_verbose©Úselfs    úP/srv/dav/.venv/lib/python3.12/site-packages/wsgidav/prop_man/property_manager.pyÚ__init__zPropertyManager.__init__7   s    € ØˆŒ
ØˆŒÜ"“_ˆŒ
Øˆ�ó    c                  ó   — y)Nr   © r   s    r   Ú__repr__zPropertyManager.__repr__=   s   € Ø r   c                 ób   — | j                   dk\  r| j                  «        | j                  «        y )Né   )r   Ú_checkÚ_closer   s    r   Ú__del__zPropertyManager.__del__@   s    € ØŸ™¨!Ò+Ø�K‰KŒMØ�‰�r   c                 óò   — t         j                  d«       | j                  j                  «        	 i | _        d| _        | j                  j                  «        y # | j                  j                  «        w xY w)Nz_lazy_open()T©Ú_loggerÚdebugr   Úacquire_writer
   r   Úreleaser   s    r   Ú
_lazy_openzPropertyManager._lazy_openE   sR   € Ü�‰�nÔ%Ø�
‰
× Ñ Ô"ð	!ØˆDŒJØˆDŒLà�J‰J×ÑÕ øˆD�J‰J×ÑÕ úó   ±A ÁA6c                  ó   — y ©Nr   r   s    r   Ú_synczPropertyManager._syncN   s   € Ør   c                 óò   — t         j                  d«       | j                  j                  «        	 d | _        d| _        | j                  j                  «        y # | j                  j                  «        w xY w©Nz_close()Fr   r   s    r   r   zPropertyManager._closeQ   sR   € Ü�‰�jÔ!Ø�
‰
× Ñ Ô"ð	!ØˆDŒJØ ˆDŒLà�J‰J×ÑÕ øˆD�J‰J×ÑÕ úr"   c                 óì   — 	 | j                   sy| j                  j                  «       D ]  \  }}|› d|› �}Œ y# t        $ r1 t        j                  | j                  j                  › d|› �«       Y yw xY w)NTú, z _check: ERROR F)r   r
   ÚitemsÚ	Exceptionr   Ú	exceptionÚ	__class__Ú__name__)r   ÚmsgÚkÚvÚ_dummys        r   r   zPropertyManager._checkZ   s{   € ð		Ø—<’<ØØŸ
™
×(Ñ(Ó*ò %‘��1Ø˜3˜b  ˜‘ð%ð øÜò 	Ü×Ñ §¡×!8Ñ!8Ð 9¸ÈÈÐNÔOÙð	ús   ‚9 �)9 ¹7A3Á2A3c           	      óv  — t         j                  | j                  j                  › d| j	                  «       › d|› �«       | j
                  s | j                  «        | j                  dk\  ry 	 | j                  j                  «       D ]Q  \  }}t         j                  d|› �«       |j                  «       D ]!  \  }}	 t         j                  d|› d|›�«       Œ# ŒS y # t        $ r%}t         j                  d|› d|› �«       Y d }~ŒPd }~ww xY w# t        $ r"}t         j                  d|› �«       Y d }~y d }~ww xY w)	Nú(z): r   z    z        z: z: ERROR z PropertyManager._dump()  ERROR: )r   Úinfor-   r.   r   r   r!   r   r
   r*   r+   Úerror)r   r/   r0   r1   Úk2Úv2Úes          r   Ú_dumpzPropertyManager._dumpf   s  € Ü�‰˜Ÿ™×/Ñ/Ð0°°$·-±-³/Ð1BÀ#ÀcÀUÐKÔLØ�|Š|Ø�O‰OÔØ�}‰} Ò!Øð
	BØŸ
™
×(Ñ(Ó*ò A‘��1Ü—‘˜t A 3˜ZÔ(ØŸg™g›iò A‘F�B˜ðAÜŸ™ x°¨t°2°b°VÐ%<Õ=ñAñAøô
 %ò AÜŸ™ x°¨t°8¸A¸3Ð%?×@Ñ@ûðAûô ò 	BÜ�M‰MÐ<¸Q¸CÐ@×AÑAûð	BúsC   Á-AD Â<CÃD Ã	D
Ã%DÄ D ÄD
Ä
D Ä	D8ÄD3Ä3D8Nc                 óž  — t         j                  d|› d�«       | j                  j                  «        	 | j                  s| j                  «        g }|| j                  v r3| j                  |   j                  «       D ]  }|j                  |«       Œ || j                  j                  «        S # | j                  j                  «        w xY w)Nzget_properties(ú))
r   r   r   Úacquire_readr   r!   r
   ÚkeysÚappendr    )r   Únorm_urlÚenvironÚ
returnlistÚpropdatas        r   Úget_propertieszPropertyManager.get_propertiesx   s¡   € Ü�‰˜¨ z°Ð3Ô4Ø�
‰
×ÑÔ!ð		!Ø—<’<Ø—‘Ô!ØˆJØ˜4Ÿ:™:Ñ%Ø $§
¡
¨8Ñ 4× 9Ñ 9Ó ;ò 0�HØ×%Ñ% hÕ/ð0àà�J‰J×ÑÕ øˆD�J‰J×ÑÕ ús   µA B0 Â0Cc           	      ó  — t         j                  d|› d|› d�«       | j                  j                  «        	 | j                  s| j                  «        || j                  vr	 | j                  j                  «        y 	 | j                  |   }|j                  |«      | j                  j                  «        S # t        $ r$}t         j                  d|› d|› d|› �«       ‚ d }~ww xY w# | j                  j                  «        w xY w)Nzget_property(r)   r<   z) failed : )r   r   r   r=   r   r!   r
   r    r+   r,   Úget)r   r@   ÚnamerA   Úresourcepropsr9   s         r   Úget_propertyzPropertyManager.get_property†   sà   € Ü�‰˜ h Z¨r°$°°qÐ9Ô:Ø�
‰
×ÑÔ!ð	!Ø—<’<Ø—‘Ô!Ø˜tŸz™zÑ)Øð �J‰J×ÑÕ ðØ $§
¡
¨8Ñ 4�ð !×$Ñ$ TÓ*à�J‰J×ÑÕ øô ò Ü×!Ñ! M°(°¸2¸d¸VÀ;ÈqÈcÐ"RÔSØûðûð
 �J‰J×ÑÕ ús/   ¸*C) Á?B9 ÂC) Â9	C&ÃC!Ã!C&Ã&C) Ã)Dc           
      ó,  — |r|j                  d«      sJ ‚|sJ ‚|€J ‚t        j                  d|› d|› d|› d|› �«       |ry | j                  j	                  «        	 | j
                  s| j                  «        || j                  v r| j                  |   }ni }|||<   || j                  |<   | j                  «        | j                  dk\  r| j                  «        | j                  j                  «        y # | j                  j                  «        w xY w)Nú/zwrite_property(r)   ú
, dry_run=z):
	r   )Ú
startswithr   r   r   r   r   r!   r
   r%   r   r   r    )r   r@   rG   Úproperty_valueÚdry_runrA   Úlocatordicts          r   Úwrite_propertyzPropertyManager.write_property™   sú   € ñ ˜H×/Ñ/°Ô4Ð4Ð4ÙˆˆtØÐ)Ð)Ð)ä�‰Ø˜h˜Z r¨$¨¨z¸'¸À&ÈÐHXÐYô	
ñ Øà�
‰
× Ñ Ô"ð	!Ø—<’<Ø—‘Ô!Ø˜4Ÿ:™:Ñ%Ø"Ÿj™j¨Ñ2‘à �Ø .ˆK˜Ñà#.ˆD�J‰J�xÑ Ø�J‰JŒLØ!Ÿ]™]¨aÒ/Ø—‘”à�J‰J×ÑÕ øˆD�J‰J×ÑÕ ús   ÁA?C7 Ã7Dc           	      óì  — t         j                  d|› d|› d|› d�«       |ry| j                  j                  «        	 | j                  s| j                  «        || j                  v r5| j                  |   }||v r"||= || j                  |<   | j                  «        | j                  dk\  r| j                  «        | j                  j                  «        y# | j                  j                  «        w xY w)z[
        Specifying the removal of a property that does not exist is NOT an error.
        zremove_property(r)   rL   r<   Nr   )r   r   r   r   r   r!   r
   r%   r   r   r    )r   r@   rG   rO   rA   rP   s         r   Úremove_propertyzPropertyManager.remove_property·   sË   € ô 	�‰Ð(¨¨
°"°T°F¸*ÀWÀIÈQÐOÔPÙàØ�
‰
× Ñ Ô"ð	!Ø—<’<Ø—‘Ô!Ø˜4Ÿ:™:Ñ%Ø"Ÿj™j¨Ñ2�Ø˜;Ñ&Ø# DÐ)ð ,7�D—J‘J˜xÑ(Ø—J‘J”LØ!Ÿ]™]¨aÒ/Ø—‘”à�J‰J×ÑÕ øˆD�J‰J×ÑÕ ús   ¾A>C ÃC3c                 ól  — t         j                  d|› d�«       | j                  j                  «        	 | j                  s| j                  «        || j                  v r| j                  |= | j                  «        | j                  j                  «        y # | j                  j                  «        w xY w)Nzremove_properties(r<   )	r   r   r   r   r   r!   r
   r%   r    )r   r@   rA   s      r   Úremove_propertiesz!PropertyManager.remove_propertiesÐ   s€   € Ü�‰Ð*¨8¨*°AÐ6Ô7Ø�
‰
× Ñ Ô"ð	!Ø—<’<Ø—‘Ô!Ø˜4Ÿ:™:Ñ%Ø—J‘J˜xÐ(Ø—
‘
”à�J‰J×ÑÕ øˆD�J‰J×ÑÕ ús   µAB ÂB3c                 ó*  — t         j                  d|› d|› d�«       | j                  j                  «        	 | j                  dk\  r| j                  «        | j                  s| j                  «        || j                  v r:| j                  |   j                  «       | j                  |<   | j                  «        | j                  dk\  r| j                  d«       | j                  j                  «        y # | j                  j                  «        w xY w)Nzcopy_properties(r)   r<   r   z
after copy)r   r   r   r   r   r   r   r!   r
   Úcopyr%   r    )r   Úsrc_urlÚdest_urlrA   s       r   Úcopy_propertieszPropertyManager.copy_propertiesÜ   sÇ   € Ü�‰Ð(¨¨	°°H°:¸QÐ?Ô@Ø�
‰
× Ñ Ô"ð	!Ø!Ÿ]™]¨aÒ/Ø—‘”Ø—<’<Ø—‘Ô!Ø˜$Ÿ*™*Ñ$Ø'+§z¡z°'Ñ':×'?Ñ'?Ó'A�—
‘
˜8Ñ$Ø—
‘
”Ø!Ÿ]™]¨aÒ/Ø—‘˜LÔ)à�J‰J×ÑÕ øˆD�J‰J×ÑÕ ús   ¸B#C6 Ã6Dc           	      ó(  — t         j                  d|› d|› d|› d�«       | j                  j                  «        	 | j                  dk\  r| j                  «        | j                  s| j                  «        |r{t        | j                  j                  «       «      D ]T  }t        j                  ||«      sŒ|j                  ||«      }| j                  |   | j                  |<   | j                  |= ŒV n7|| j                  v r)| j                  |   | j                  |<   | j                  |= | j                  «        | j                  dk\  r| j                  d«       | j                  j                  «        y # | j                  j                  «        w xY w)Nzmove_properties(r)   r<   r   z
after move)r   r   r   r   r   r   r   r!   Úlistr
   r>   r   Úis_equal_or_child_uriÚreplacer%   r    )r   rX   rY   Úwith_childrenrA   ÚurlÚds          r   Úmove_propertieszPropertyManager.move_propertiesì   s4  € Ü�‰Ð(¨¨	°°H°:¸RÀ¸ÈaÐPÔQØ�
‰
× Ñ Ô"ð	!Ø!Ÿ]™]¨aÒ/Ø—‘”Ø—<’<Ø—‘Ô!Ùä §
¡
§¡Ó 1Ó2ò ,�CÜ×1Ñ1°'¸3Õ?ØŸK™K¨°Ó:˜Ø(,¯
©
°3©˜Ÿ
™
 1™Ø ŸJ™J s™Oñ	,ð
 ˜DŸJ™JÑ&à'+§z¡z°'Ñ':�—
‘
˜8Ñ$Ø—J‘J˜wÐ'Ø�J‰JŒLØ!Ÿ]™]¨aÒ/Ø—‘˜LÔ)à�J‰J×ÑÕ øˆD�J‰J×ÑÕ ús   »A9E5 Â5B%E5 Å5F)Ú r$   )FN)r.   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r!   r%   r   r   r:   rD   rI   rQ   rS   rU   rZ   rb   r   r   r   r   r   /   sZ   „ ñòò!òò
!òò!ó
óBó$!ó!ð( FJó!ó<!ó2
!ó!ô !r   r   c                   ó@   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	ˆ xZ
S )ÚShelvePropertyManagerzH
    A low performance property manager implementation using shelve
    c                 ój   •— t         j                  j                  |«      | _        t        ‰| �  «        y r$   )ÚosÚpathÚabspathÚ_storage_pathÚsuperr   )r   Ústorage_pathr-   s     €r   r   zShelvePropertyManager.__init__  s#   ø€ ÜŸW™WŸ_™_¨\Ó:ˆÔÜ‰ÑÕr   c                 ó"   — d| j                   › d�S )NzShelvePropertyManager(r<   )rm   r   s    r   r   zShelvePropertyManager.__repr__  s   € Ø'¨×(:Ñ(:Ð';¸1Ð=Ð=r   c                 óþ  — t         j                  d| j                  › d�«       | j                  j	                  «        	 | j
                  r	 | j                  j                  «        yt        j                  | j                  d¬«      | _	        d| _        | j                  dk\  r"| j                  d«       | j                  d«       | j                  j                  «        y # | j                  j                  «        w xY w)Nz_lazy_open(r<   TF)Ú	writebackr   zAfter shelve.open())r   r   rm   r   r   r   r    ÚshelveÚopenr
   r   r   r:   r   s    r   r!   z ShelvePropertyManager._lazy_open  s·   € Ü�‰˜ D×$6Ñ$6Ð#7°qÐ9Ô:Ø�
‰
× Ñ Ô"ð	!à�|Š|Øð �J‰J×ÑÕ ô  Ÿ™ T×%7Ñ%7À5ÔIˆDŒJØˆDŒLØ!Ÿ]™]¨aÒ/Ø—‘Ð1Ô2Ø—
‘
Ð0Ô1à�J‰J×ÑÕ øˆD�J‰J×ÑÕ ús   ¿C  Á'AC  Ã C<c                 ó"  — t         j                  d«       | j                  j                  «        	 | j                  r| j
                  j                  «        | j                  j                  «        y# | j                  j                  «        w xY w)z$Write persistent dictionary to disc.z_sync()N)r   r   r   r   r   r
   Úsyncr    r   s    r   r%   zShelvePropertyManager._sync(  sY   € ä�‰�iÔ Ø�
‰
× Ñ Ô"ð	!Ø�|Š|Ø—
‘
—‘Ô!à�J‰J×ÑÕ øˆD�J‰J×ÑÕ ús   ±&A2 Á2Bc                 ó>  — t         j                  d«       | j                  j                  «        	 | j                  r(| j
                  j                  «        d | _        d| _        | j                  j                  «        y # | j                  j                  «        w xY wr'   )r   r   r   r   r   r
   Úcloser    r   s    r   r   zShelvePropertyManager._close2  si   € Ü�‰�jÔ!Ø�
‰
× Ñ Ô"ð	!Ø�|Š|Ø—
‘
× Ñ Ô"Ø!�”
Ø$�”à�J‰J×ÑÕ øˆD�J‰J×ÑÕ ús   ±4B  Â Bc                 ó¢  — | j                   j                  «        	 | j                  du }|r| j                  «        t	        | j                  «      r4| j                  j                  «        | j                  j                  «        |r| j                  «        | j                   j                  «        y# | j                   j                  «        w xY w)zDelete all entries.N)	r   r   r
   rt   ÚlenÚclearrv   rx   r    )r   Ú
was_closeds     r   r{   zShelvePropertyManager.clear=  s‡   € à�
‰
× Ñ Ô"ð
	!ØŸ™ tÐ+ˆJÙØ—	‘	”Ü�4—:‘:ŒØ—
‘
× Ñ Ô"Ø—
‘
—‘Ô!ÙØ—
‘
”à�J‰J×ÑÕ øˆD�J‰J×ÑÕ ús   œA;B2 Â2C)r.   rd   re   rf   r   r   r!   r%   r   r{   Ú__classcell__)r-   s   @r   rh   rh     s&   ø„ ñôò>ò!ò"!ò	!ö!r   rh   )rf   rj   rs   Úwsgidavr   Úwsgidav.rw_lockr   Ú__docformat__Úget_module_loggerr   r   rh   r   r   r   ú<module>r‚      sK   ðñ
ó  
Û å Ý )ð #€à
 ˆ$×
 Ñ
 Ð!3Ó
4€÷T!ñ T!ôx?!˜Oõ ?!r   