§
    ŠŸjÖ&  ã                   ó‚  — d Z ddlmZ dZ	 ddlmZ n# e$ r	 ddlmZ Y nw xY wddlZddl	Z	ddl
Z
	 ddlmZ n# e$ r ddlZY nw xY w	 ddlZn# e$ r ddlZY nw xY wddlZddlZej        d         dk    refZneefZd„ Z e¦   «         Z G d„ d	ej        ¦  «        Z G d
„ d¦  «        Zd„ Zedk    r e¦   «          dS dS )a   PickleShare - a small 'shelve' like datastore with concurrency support

Like shelve, a PickleShareDB object acts like a normal dictionary. Unlike
shelve, many processes can access the database simultaneously. Changing a
value in database is immediately visible to other processes accessing the
same database.

Concurrency is possible because the values are stored in separate files. Hence
the "database" is a directory where *all* files are governed by PickleShare.

Example usage::

    from pickleshare import *
    db = PickleShareDB('~/testpickleshare')
    db.clear()
    print "Should be empty:",db.items()
    db['hello'] = 15
    db['aku ankka'] = [1,2,313]
    db['paths/are/ok/key'] = [1,(5,46)]
    print db.keys()
    del db['aku ankka']

This module is certainly not ZODB, but can be used for low-load
(non-mission-critical) situations where tiny code size trumps the
advanced features of a "real" object database.

Installation guide: pip install pickleshare

Author: Ville Vainio <vivainio@gmail.com>
License: MIT open source license.

é    )Úprint_functionz0.7.5)ÚPathNé   c                 óV   — dt          t          | ¦  «        dz  ¦  «        z  dd …         S )Nz%02xé   éþÿÿÿ)ÚabsÚhash)Úkeys    úX/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/pickleshare.pyÚgethashfiler   @   s(   € Ø•S�˜c™œ S™Ñ)Ô)Ñ)¨2¨3¨3Ô/Ð/ó    c                   ó|   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zedfd„Z	d„ Z
d	„ Zd
„ Zd„ Zdd„Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ ZdS )ÚPickleShareDBz7 The main 'connection' object for PickleShare database c                 óÂ  — t          |t          ¦  «        st          |¦  «        }t          j                             t          j                             |¦  «        ¦  «        }t          |¦  «        | _        | j         	                    ¦   «         sJ	 | j         
                    d¬¦  «         n-# t          $ r }|j        t          j        k    r‚ Y d}~nd}~ww xY wi | _        dS )z: Return a db object that will manage the specied directoryT©ÚparentsN)Ú
isinstanceÚstring_typesÚstrÚosÚpathÚabspathÚ
expanduserr   ÚrootÚis_dirÚmkdirÚOSErrorÚerrnoÚEEXISTÚcache)Úselfr   Úes      r   Ú__init__zPickleShareDB.__init__G   sÒ   € å˜$¥Ñ-Ô-ð 	Ý�t‘9”9ˆDÝŒw�Š�rœw×1Ò1°$Ñ7Ô7Ñ8Ô8ˆÝ˜‘J”JˆŒ	ØŒy×ÒÑ!Ô!ð 	ðØ”	—’¨�Ñ-Ô-Ð-Ð-øÝð ð ð Ø”7�eœlÒ*Ð*Øð +Ð*Ð*Ð*Ð*øøøøðøøøð ˆŒ
ˆ
ˆ
s   ÂB+ Â+
CÂ5CÃCc                 óð  — | j         |z  }	 |                     ¦   «         t          j                 }n# t          $ r t	          |¦  «        ‚w xY w|| j        v r*|| j        |         d         k    r| j        |         d         S 	 |                     d¦  «        5 }t          j        | 	                    ¦   «         ¦  «        }ddd¦  «         n# 1 swxY w Y   n#  t	          |¦  «        ‚xY w||f| j        |<   |S )z db['key'] reading é   r   ÚrbN)
r   ÚstatÚST_MTIMEr   ÚKeyErrorr!   ÚopenÚpickleÚloadsÚread)r"   r   ÚfilÚmtimeÚfÚobjs         r   Ú__getitem__zPickleShareDB.__getitem__Y   s,  € àŒi˜#‰oˆð	 Ø—X’X‘Z”Z¥¤Ô.ˆEˆEøÝð 	 ð 	 ð 	 Ý˜3‘-”-Ðð	 øøøð �$”*ÐÐ ¨$¬*°S¬/¸!Ô*<Ò!<Ð!<Ø”:˜c”? 1Ô%Ð%ð	 à—’˜$‘”ð - 1Ý”l 1§6¢6¡8¤8Ñ,Ô,�ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -øøð	 Ý˜3‘-”-Ðøøøà˜u˜+ˆŒ
�3‰Øˆ
s9   Œ$1 ±AÂC Â'C
Â>C Ã
CÃC ÃCÃC ÃC'c                 ó¬  — | j         |z  }|j        }|r*|                     ¦   «         s|                     d¬¦  «         |                     d¦  «        5 }t          j        ||d¬¦  «         ddd¦  «         n# 1 swxY w Y   	 ||                     ¦   «         j        f| j	        |<   dS # t          $ r!}|j        t          j        k    r‚ Y d}~dS d}~ww xY w)z db['key'] = 5 Tr   Úwbé   )ÚprotocolN)r   Úparentr   r   r+   r,   Údumpr(   Úst_mtimer!   r   r   ÚENOENT)r"   r   Úvaluer/   r8   r1   r#   s          r   Ú__setitem__zPickleShareDB.__setitem__m   s#  € àŒi˜#‰oˆØ”ˆØð 	'˜&Ÿ-š-™/œ/ð 	'Ø�LŠL ˆLÑ&Ô&Ð&ð �XŠX�d‰^Œ^ð 	.˜qÝŒK˜˜q¨1Ð-Ñ-Ô-Ð-ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð	Ø$ c§h¢h¡j¤jÔ&9Ð:ˆDŒJ�s‰OˆOˆOøÝð 	ð 	ð 	ØŒw�%œ,Ò&Ð&Øð 'Ð&Ð&Ð&Ð&Ð&øøøøð	øøøs*   ÁA7Á7A;Á>A;Â#B( Â(
CÂ2CÃCc                 óò   — | j         |z  }|                     ¦   «         s|                     ¦   «          |t          |¦  «        z  }|                      |i ¦  «        }|                     ||i¦  «         || |<   dS )z hashed set N)r   r   r   r   ÚgetÚupdate)r"   Úhashrootr   r<   ÚhrootÚhfileÚds          r   ÚhsetzPickleShareDB.hset}   ss   € à”	˜HÑ$ˆØ�|Š|‰~Œ~ð 	Ø�KŠK‰MŒMˆMØ� CÑ(Ô(Ñ(ˆØ�HŠH�U˜BÑÔˆØ	�Š�3˜�-Ñ Ô Ð ØˆˆU‰ˆˆr   Tc                 ó  — | j         |z  }|t          |¦  «        z  }|                      |t          ¦  «        }|t          u r1|r|t          u rt	          |¦  «        ‚|S |                      |¦  «        }|                     ||¦  «        S )z hashed get )r   r   r?   Ú	_sentinelr*   Úhdict)r"   rA   r   ÚdefaultÚ	fast_onlyrB   rC   rD   s           r   ÚhgetzPickleShareDB.hget‰   s‡   € à”	˜HÑ$ˆØ� CÑ(Ô(Ñ(ˆà�HŠH�U�IÑ'Ô'ˆà•	ˆ>ˆ>Øð Ø�iÐ'Ð'Ý" 3™-œ-Ð'à�ð —
’
˜8Ñ$Ô$ˆAà�uŠu�S˜'Ñ"Ô"Ð"r   c                 ó�  — |                       |dz   ¦  «        }|                     ¦   «          t          |¦  «        r|d         pd}|                     d¦  «        r|g|dd…         z   }i }|D ]X}	 |                     | |         ¦  «         n$# t
          $ r t          d|d¦  «         | |= Y nw xY w|                      |¦  «         ŒY|S )z> Get all data contained in hashed category 'hashroot' as dict ú/*éÿÿÿÿÚ ÚxxNÚCorruptz!deleted - hset is not threadsafe!)ÚkeysÚsortÚlenÚendswithr@   r*   ÚprintÚuncache)r"   rA   ÚhfilesÚlastÚallr1   s         r   rH   zPickleShareDB.hdictœ   sè   € à—’˜8 d™?Ñ+Ô+ˆØ�Š‰ŒˆÝ�6‰{Œ{Ð)˜v bœzÐ/¨RˆØ�=Š=˜ÑÔð 	*à�V˜f S b SœkÑ)ˆFàˆàð 	ð 	ˆAðØ—
’
˜4 œ7Ñ#Ô#Ð#Ð#øÝð ð ð Ý�i Ð"EÑFÔFÐFØ˜�G�G�Gðøøøð �LŠL˜‰OŒOˆOˆOàˆ
s   Á0BÂB-Â,B-c                 ó  — |                       |dz   ¦  «        }i }|D ]2}|                     | |         ¦  «         |                      |¦  «         Œ3|| |dz   <   |D ],}| j        |z  }|j        dk    rŒ|                     ¦   «          Œ-dS )z« Compress category 'hashroot', so hset is fast again

        hget will fail if fast_only is True for compressed items (that were
        hset before hcompress).

        rM   z/xxrP   N)rR   r@   rW   r   ÚnameÚunlink)r"   rA   rX   rZ   r1   Úps         r   Ú	hcompresszPickleShareDB.hcompress³   s¤   € ð —’˜8 d™?Ñ+Ô+ˆØˆØð 	ð 	ˆAà�JŠJ�t˜A”wÑÔÐØ�LŠL˜‰OŒOˆOˆOà!$ˆˆX˜ÑÑØð 	ð 	ˆAØ”	˜A‘ˆAØŒv˜Š~ˆ~ØØ�HŠH‰JŒJˆJˆJð		ð 	r   c                 óœ   — | j         |z  }| j                             |d¦  «         	 |                     ¦   «          dS # t          $ r Y dS w xY w)z del db["key"] N)r   r!   Úpopr]   r   )r"   r   r/   s      r   Ú__delitem__zPickleShareDB.__delitem__Ê   s]   € àŒi˜#‰oˆØŒ
�Š�s˜4Ñ Ô Ð ð	Ø�JŠJ‰LŒLˆLˆLˆLøÝð 	ð 	ð 	ð ˆDˆDð	øøøs   §= ½
AÁ
Ac                 óx   — t          |                     | j        ¦  «        ¦  «                             dd¦  «        S )z% Make a key suitable for user's eyes ú\ú/)r   Úrelative_tor   Úreplace)r"   r^   s     r   Ú_normalizedzPickleShareDB._normalizedÕ   s.   € å�1—=’= ¤Ñ+Ô+Ñ,Ô,×4Ò4°T¸#Ñ>Ô>Ð>r   Nc                 óŽ   ‡ — |€‰ j                              d¦  «        }n‰ j                              |¦  «        }ˆ fd„|D ¦   «         S )z, All keys in DB, or all keys matching a globNÚ*c                 ób   •— g | ]+}|                      ¦   «         ¯‰                     |¦  «        ‘Œ,S © )Úis_filerh   )Ú.0r^   r"   s     €r   ú
<listcomp>z&PickleShareDB.keys.<locals>.<listcomp>à   s4   ø€ ÐBÐBÐB¨°a·i²i±k´kÐB�× Ò  Ñ#Ô#ÐBÐBÐBr   )r   ÚrglobÚglob)r"   ÚglobpatÚfiless   `  r   rR   zPickleShareDB.keysÙ   sL   ø€ ð ˆ?Ø”I—O’O CÑ(Ô(ˆEˆEà”I—N’N 7Ñ+Ô+ˆEØBÐBÐBÐB¨UÐBÑBÔBÐBr   c                 óD   — t          |                      ¦   «         ¦  «        S ©N)ÚiterrR   ©r"   s    r   Ú__iter__zPickleShareDB.__iter__â   s   € Ý�D—I’I‘K”KÑ Ô Ð r   c                 óD   — t          |                      ¦   «         ¦  «        S ru   )rT   rR   rw   s    r   Ú__len__zPickleShareDB.__len__å   s   € Ý�4—9’9‘;”;ÑÔÐr   c                 óX   — |si | _         |D ]}| j                              |d¦  «         ŒdS )zË Removes all, or specified items from cache

        Use this after reading a large amount of large objects
        to free up memory, when you won't be needing the objects
        for a while.

        N)r!   ra   )r"   ÚitemsÚits      r   rW   zPickleShareDB.uncacheè   sE   € ð ð 	ØˆDŒJØð 	$ð 	$ˆBØŒJ�NŠN˜2˜dÑ#Ô#Ð#Ð#ð	$ð 	$r   é<   c                 ó  — dgdz  dgdz  z   dgz   }d}d}	 	 | |         }|S # t           $ r Y nw xY w||k    rt          |¦  «        ‚t          j        ||         ¦  «         |||         z  }|t          |¦  «        dz
  k     r|dz  }Œq)a   Wait (poll) for a key to get a value

        Will wait for `maxwaittime` seconds before raising a KeyError.
        The call exits normally if the `key` field in db gets a value
        within the timeout period.

        Use this for synchronizing different processes or for ensuring
        that an unfortunately timed "db['key'] = newvalue" operation
        in another process (which causes all 'get' operation to cause a
        KeyError for the duration of pickling) won't screw up your program
        logic.
        gš™™™™™É?r   g      à?r6   r&   r   )r*   ÚtimeÚsleeprT   )r"   r   ÚmaxwaittimeÚwtimesÚtriesÚwaitedÚvals          r   ÚwaitgetzPickleShareDB.waitgetõ   sÁ   € ð �˜‘˜c˜U Q™YÑ&¨!¨Ñ,ˆØˆØˆð	ðØ˜3”i�Ø�
øÝð ð ð Ø�ðøøøð ˜Ò#Ð#Ý˜s‘m”mÐ#åŒJ�v˜e”}Ñ%Ô%Ð%Ø�F˜5”MÑ!ˆFØ•s˜6‘{”{ A‘~Ò%Ð%Ø�q‘�ð	s   ˜	" ¢
/®/c                 ó"   — t          | |¦  «        S )z, Get a convenient link for accessing items  )ÚPickleShareLink)r"   Úfolders     r   ÚgetlinkzPickleShareDB.getlink  s   € å˜t VÑ,Ô,Ð,r   c                 ó   — d| j         z  S )NzPickleShareDB('%s'))r   rw   s    r   Ú__repr__zPickleShareDB.__repr__  s   € Ø$ t¤yÑ0Ð0r   ru   )r~   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r3   r=   rE   rG   rK   rH   r_   rb   rh   rR   rx   rz   rW   r‡   r‹   r�   rl   r   r   r   r   E   s%  € € € € € ØAÐAðð ð ð$ð ð ð(ð ð ð ð ð ð -6À4ð #ð #ð #ð #ð&ð ð ð.ð ð ð.	ð 	ð 	ð?ð ?ð ?ðCð Cð Cð Cð!ð !ð !ð ð  ð  ð$ð $ð $ðð ð ð ð@-ð -ð -ð1ð 1ð 1ð 1ð 1r   r   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )r‰   zÜ A shortdand for accessing nested PickleShare data conveniently.

    Created through PickleShareDB.getlink(), example::

        lnk = db.getlink('myobjects/test')
        lnk.foo = 2
        lnk.bar = lnk.foo + 5

    c                 óR   — | j                              t          ¦   «         ¦  «         d S ru   )Ú__dict__r@   Úlocals)r"   ÚdbÚkeydirs      r   r$   zPickleShareLink.__init__(  s"   € ØŒ×Ò�V™XœXÑ&Ô&Ð&Ð&Ð&r   c                 óJ   — | j         d         | j         d         dz   |z            S )Nr–   r—   re   )r”   )r"   r   s     r   Ú__getattr__zPickleShareLink.__getattr__+  s%   € ØŒ}˜TÔ" 4¤=°Ô#:¸3Ñ#>ÀÑ#DÔEÐEr   c                 ó0   — || j         | j        dz   |z   <   d S )Nre   )r–   r—   )r"   r   r†   s      r   Ú__setattr__zPickleShareLink.__setattr__-  s   € Ø),ˆŒ�”˜C‘ #Ñ%Ñ&Ð&Ð&r   c                 óÄ   — | j         d         }|                     | j         d         dz   ¦  «        }d| j         d         ›dd                     d„ |D ¦   «         ¦  «        ›d�S )	Nr–   r—   rM   z<PickleShareLink 'z': ú;c                 óP   — g | ]#}t          |¦  «                             ¦   «         ‘Œ$S rl   )r   Úbasename)rn   Úks     r   ro   z,PickleShareLink.__repr__.<locals>.<listcomp>4  s*   € Ð7Ð7Ð7¨Q•d˜1‘g”g×&Ò&Ñ(Ô(Ð7Ð7Ð7r   ú>)r”   rR   Újoin)r"   r–   rR   s      r   r�   zPickleShareLink.__repr__/  sk   € ØŒ]˜4Ô ˆØ�wŠw˜œ hÔ/°Ñ5Ñ6Ô6ˆˆàŒM˜(Ô#Ð#Ð#Ø�HŠHÐ7Ð7°$Ð7Ñ7Ô7Ñ8Ô8Ð8Ð8ð:ð 	:r   N)rŽ   r�   r�   r‘   r$   r™   r›   r�   rl   r   r   r‰   r‰     s]   € € € € € ðð ð'ð 'ð 'ðFð Fð Fð-ð -ð -ð:ð :ð :ð :ð :r   r‰   c                  ó8  — dd l } |                      d¦  «        }t          }dd l}t	          |j        ¦  «        dk     rt          |¦  «         d S |j        d         }|j        dd …         }|dk    rC|sdg} ||d         ¦  «        }dd l}|                     |                     ¦   «         ¦  «         d S |dk    rn|j	         
                    ¦   «         } ||d         ¦  «        }t          |¦  «        }	|                     ¦   «          |                     ¦   «         D ]
\  }
}|||
<   Œd S |dk    rI ||d         ¦  «        }|                     ¦   «          t          |                     d	¦  «        ¦  «         d S |d
k    rt          ¦   «          t          ¦   «          d S d S )Nr   zÅ    pickleshare - manage PickleShare databases

    Usage:

        pickleshare dump /path/to/db > dump.txt
        pickleshare load /path/to/db < dump.txt
        pickleshare test /path/to/db
    r6   r&   r9   ú.ÚloadÚtestwaitÚ250Útest)ÚtextwrapÚdedentr   ÚsysrT   ÚargvrV   Úpprintr|   Ústdinr.   ÚevalÚclearr‡   r¨   Ústress)r©   ÚusageÚDBr«   ÚcmdÚargsr–   r­   ÚcontÚdatar    Úvs               r   Úmainr¹   6  s¡  € Ø€O€O€OØ�OŠOð ñ 	ô 	€Eõ 
€BØ€J€J€JÝ
ˆ3Œ8�}„}�qÒÐÝˆe‰ŒˆØˆà
Œ(�1Œ+€CØŒ8�A�B�BŒ<€DØ
ˆf‚}€}ØÐ ˜C˜5�TØˆR��Q”‰[Œ[ˆØˆˆˆØ�Š�b—h’h‘j”jÑ!Ô!Ð!Ð!Ð!Ø	�ŠˆØŒy�~Š~ÑÔˆØˆR��Q”‰[Œ[ˆÝ�D‰zŒzˆØ
�Š‰
Œ
ˆ
Ø—8’8‘:”:ð 	ð 	‰CˆAˆaØˆBˆq‰EˆEð	ð 	à	�
Ò	Ð	ØˆR��Q”‰[Œ[ˆØ
�Š‰
Œ
ˆ
Ýˆb�jŠj˜ÑÔÑ Ô Ð Ð Ð Ø	�ŠˆÝ‰ŒˆÝ‰Œˆˆˆð 
ˆr   Ú__main__)r‘   Ú
__future__r   Ú__version__Úpathlibr   ÚImportErrorÚpathlib2r   r(   r€   Úcollections.abcÚabcÚcollections_abcÚcollectionsÚcPickler,   r   r«   Úversion_infor   r   Úunicoder   ÚobjectrG   ÚMutableMappingr   r‰   r¹   rŽ   rl   r   r   ú<module>rÉ      s  ððð ðB &Ð %Ð %Ð %Ð %Ð %ð €ðØÐÐÐÐÐÐøØð ð ð àÐÐÐÐÐÐÐðøøøð Ð Ð Ð Ð Ð Ð Ð Ð Ð Ð Ð ð*Ø-Ð-Ð-Ð-Ð-Ð-Ð-øØð *ð *ð *Ø)Ð)Ð)Ð)Ð)Ð)ð*øøøðØÐÐÐÐøØð ð ð Ø€M€M€M€M€Mðøøøà €€€Ø 
€
€
€
àÔ�AÔ˜!ÒÐØ�6€L€Là˜�>€Lð0ð 0ð 0ð ˆF‰HŒH€	ðU1ð U1ð U1ð U1ð U1�OÔ2ñ U1ô U1ð U1ðr:ð :ð :ð :ð :ñ :ô :ð :ð0%ð %ð %ðN ˆjÒÐØ€D�F„F€F€F€Fð Ðs-   Œ “! !±8 ¸	AÁAÁA Á	AÁA