Ë
    VzPgÖ&  ã                   ój  — d Z ddlmZ dZ	 ddlmZ ddlZddl	Z	ddl
Z
	 ddlmZ 	 ddlZ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j4                  «      Z G d
„ d«      Zd„ Zedk(  r e«        yy# e$ r	 ddlmZ Y Œ�w xY w# e$ r ddlZY Œ}w xY w# e$ r ddlZY Œ‡w xY w)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                 ó<   — dt        t        | «      dz  «      z  dd  S )Nz%02xé   éþÿÿÿ)ÚabsÚhash)Úkeys    ú\/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/pickleshare.pyÚgethashfiler   @   s!   € Ø”Sœ˜c› S™Ó)Ñ)¨2¨3Ð/Ð/ó    c                   óz   — 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y)ÚPickleShareDBz7 The main 'connection' object for PickleShare database c                 óÔ  — t        |t        «      st        |«      }t        j                  j                  t        j                  j                  |«      «      }t        |«      | _        | j                  j                  «       s%	 | j                  j                  d¬«       i | _        yi | _        y# t        $ r/}|j                  t        j                  k7  r‚ Y d}~i | _        yd}~ww xY w)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ˆDÜ�w‰w�‰œrŸw™w×1Ñ1°$Ó7Ó8ˆÜ˜“JˆŒ	Ø�y‰y×ÑÔ!ðØ—	‘	—‘¨�Ô-ð
 ˆ�
�Rˆ�
øô	 ò Ø—7‘7œeŸl™lÒ*Øó +ð ˆ�
ûð	ús   ÂB/ Â/	C'Â8C"Ã"C'c                 óØ  — | j                   |z  }	 |j                  «       t        j                     }|| j
                  v r'|| j
                  |   d   k(  r| j
                  |   d   S 	 |j                  d«      5 }t        j                  |j                  «       «      }ddd«       |f| j
                  |<   |S # t        $ r t	        |«      ‚w xY w# 1 sw Y   Œ4xY w#  t	        |«      ‚xY w)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‰i˜#‰oˆð	 Ø—X‘X“Z¤§¡Ñ.ˆEð �$—*‘*Ñ ¨$¯*©*°S©/¸!Ñ*<Ò!<Ø—:‘:˜c‘? 1Ñ%Ð%ð	 à—‘˜$” 1Ü—l‘l 1§6¡6£8Ó,�÷  ð
 ˜u˜+ˆ�
‰
�3‰Øˆ
øô ò 	 Ü˜3“-Ðð	 ú÷  �ûð	 Ü˜3“-Ðús/   ‘!B8 Á(C Á9$CÂC Â8CÃCÃC ÃC)c                 óº  — | j                   |z  }|j                  }|r"|j                  «       s|j                  d¬«       |j	                  d«      5 }t        j                  ||d¬«       ddd«       	 ||j                  «       j                  f| j                  |<   y# 1 sw Y   Œ4xY w# t        $ r(}|j                  t        j                  k7  r‚ Y d}~y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‰i˜#‰oˆØ—‘ˆÙ˜&Ÿ-™-œ/Ø�L‰L ˆLÔ&ð �X‰X�dŒ^˜qÜ�K‰K˜˜q¨1Õ-÷ ð	Ø$ c§h¡h£j×&9Ñ&9Ð:ˆD�J‰J�sŠO÷ ˆ^ûô ò 	Ø�w‰wœ%Ÿ,™,Ò&Øô 'ûð	ús$   ÁBÁ3)B) ÂB&Â)	CÂ2CÃCc                 óÒ   — | j                   |z  }|j                  «       s|j                  «        |t        |«      z  }| j	                  |i «      }|j                  ||i«       || |<   y)z hashed set N)r   r   r   r   ÚgetÚupdate)r"   Úhashrootr   r<   ÚhrootÚhfileÚds          r   ÚhsetzPickleShareDB.hset}   sZ   € à—	‘	˜HÑ$ˆØ�|‰|Œ~Ø�K‰KŒMØœ CÓ(Ñ(ˆØ�H‰H�U˜BÓˆØ	�‰�3˜�-Ô ØˆˆUŠr   Tc                 óì   — | j                   |z  }|t        |«      z  }| j                  |t        «      }|t        u r(|r|t        u rt	        |«      ‚|S | j                  |«      }|j                  ||«      S )z hashed get )r   r   r?   Ú	_sentinelr*   Úhdict)r"   rA   r   ÚdefaultÚ	fast_onlyrB   rC   rD   s           r   ÚhgetzPickleShareDB.hget‰   sq   € à—	‘	˜HÑ$ˆØœ CÓ(Ñ(ˆà�H‰H�UœIÓ'ˆà”	‰>ÙØœiÑ'Ü" 3›-Ð'à�ð —
‘
˜8Ó$ˆAà�u‰u�S˜'Ó"Ð"r   c                 óJ  — | j                  |dz   «      }|j                  «        t        |«      xr |d   xs d}|j                  d«      r	|g|dd z   }i }|D ](  }	 |j	                  | |   «       | j                  |«       Œ* |S # t
        $ r t        d|d«       | |= Y Œ0w xY w)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˜kÑ)ˆFàˆãˆAðØ—
‘
˜4 ™7Ô#ð
 �L‰L˜�Oð ð ˆ
øô ò Ü�i Ð"EÔFØ˜’Gðús   ÁBÂB"Â!B"c                 ó  — | j                  |dz   «      }i }|D ]'  }|j                  | |   «       | j                  |«       Œ) || |dz   <   |D ]1  }| j                  |z  }|j                  dk(  rŒ"|j                  «        Œ3 y)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ð ð
 "%ˆˆX˜ÑÑÛˆAØ—	‘	˜A‘ˆAØ�v‰v˜Š~ØØ�H‰H�Jñ	 r   c                 óš   — | j                   |z  }| j                  j                  |d«       	 |j                  «        y# t        $ r Y yw xY w)z del db["key"] N)r   r!   Úpopr]   r   )r"   r   r/   s      r   Ú__delitem__zPickleShareDB.__delitem__Ê   sC   € à�i‰i˜#‰oˆØ�
‰
�‰�s˜4Ô ð	Ø�J‰J�LøÜò 	ñ ð	ús   ­> ¾	A
Á	A
c                 ój   — t        |j                  | j                  «      «      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                   j                  d«      }n| j                   j                  |«      }|D �cg c]$  }|j                  «       sŒ| j	                  |«      ‘Œ& c}S c c}w )z, All keys in DB, or all keys matching a globÚ*)r   ÚrglobÚglobÚis_filerh   )r"   ÚglobpatÚfilesr^   s       r   rR   zPickleShareDB.keysÙ   sX   € ð ˆ?Ø—I‘I—O‘O CÓ(‰Eà—I‘I—N‘N 7Ó+ˆEÙ-2ÓB©U¨°a·i±iµk�× Ñ  Õ#¨UÑBÐBùÒBs   ¾A*ÁA*c                 ó4   — t        | j                  «       «      S ©N)ÚiterrR   ©r"   s    r   Ú__iter__zPickleShareDB.__iter__â   s   € Ü�D—I‘I“KÓ Ð r   c                 ó4   — t        | j                  «       «      S rq   )rT   rR   rs   s    r   Ú__len__zPickleShareDB.__len__å   s   € Ü�4—9‘9“;ÓÐr   c                 ó\   — |si | _         |D ]  }| j                   j                  |d«       Œ  y)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è   s*   € ñ ØˆDŒJÛˆBØ�J‰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||kD  rt        |«      ‚t        j                  ||   «       |||   z  }|t        |«      dz
  k  r|dz  }Œ^)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Ð#ä�J‰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   rs   s    r   Ú__repr__zPickleShareDB.__repr__  s   € Ø$ t§y¡yÑ0Ð0r   rq   )é<   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r3   r=   rE   rG   rK   rH   r_   rb   rh   rR   rt   rv   rW   r‚   r†   rˆ   © r   r   r   r   E   s^   „ ÙAòò$ò(ò ð -6À4ó #ò&ò.ò.	ò?óCò!ò ò$óò@-ó1r   r   c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)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                 óJ   — | j                   j                  t        «       «       y rq   )Ú__dict__r@   Úlocals)r"   ÚdbÚkeydirs      r   r$   zPickleShareLink.__init__(  s   € Ø�‰×ÑœV›XÕ&r   c                 óL   — | 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                 óB   — || j                   | j                  dz   |z   <   y )Nre   )r“   r”   )r"   r   r�   s      r   Ú__setattr__zPickleShareLink.__setattr__-  s   € Ø),ˆ�‰�—‘˜C‘ #Ñ%Ò&r   c                 ó   — | j                   d   }|j                  | j                   d   dz   «      }d| j                   d   ›ddj                  |D �cg c]  }t        |«      j	                  «       ‘Œ c}«      ›d�S c c}w )Nr“   r”   rM   z<PickleShareLink 'z': Ú;Ú>)r‘   rR   Újoinr   Úbasename)r"   r“   rR   Úks       r   rˆ   zPickleShareLink.__repr__/  sm   € Ø�]‰]˜4Ñ ˆØ�w‰w˜Ÿ™ hÑ/°Ñ5Ó6‰à�M‰M˜(Ó#Ø�H‰H±$Ó7±$¨Q”d˜1“g×&Ñ&Õ(°$Ñ7Õ8ð:ð 	:ùâ7s   Á A;N)rŠ   r‹   rŒ   r�   r$   r–   r˜   rˆ   rŽ   r   r   r„   r„     s   „ ñò'òFò-ó:r   r„   c                  ó¨  — dd l } | j                  d«      }t        }dd l}t	        |j
                  «      dk  rt        |«       y |j
                  d   }|j
                  dd  }|dk(  r4|sdg} ||d   «      }dd l}|j                  |j                  «       «       y |dk(  r^|j                  j                  «       } ||d   «      }t        |«      }	|j                  «        |j                  «       D ]
  \  }
}|||
<   Œ y |dk(  r6 ||d   «      }|j                  «        t        |j                  d	«      «       y |d
k(  rt        «        t        «        y y )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   Úpprintrx   Ústdinr.   ÚevalÚclearr‚   r¤   Ústress)r¥   ÚusageÚDBr§   ÚcmdÚargsr“   r©   ÚcontÚdatarž   Úvs               r   Úmainrµ   6  s"  € ÛØ�O‰Oð ó 	€Eô 
€BÛÜ
ˆ3�8‰8ƒ}�qÒÜˆeŒØà
�(‰(�1‰+€CØ�8‰8�A�Bˆ<€DØ
ˆf‚}Ù˜C˜5�TÙ��Q‘‹[ˆÛØ�‰�b—h‘h“jÕ!Ø	�ŠØ�y‰y�~‰~ÓˆÙ��Q‘‹[ˆÜ�D‹zˆØ
�‰Œ
Ø—8‘8–:‰CˆAˆaØˆBˆqŠEñ à	�
Ò	Ù��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Š   rŽ   r   r   Ú<module>rÅ      sä   ðñõB &ð €ðÝ÷
 Ó ð*Ý-ðÛó Û 
à×Ñ�AÑ˜!ÒØ�6�Là˜�>€Lò0ñ ‹H€	ôU1�O×2Ñ2ô U1÷r:ñ :ò0%ðN ˆjÒÙ…Fð øðe	 ò çðûð ò *Ý)ð*ûð ò Ýðús3   ŒB ŸB ¦B& ÂBÂBÂ	B#Â"B#Â&	B2Â1B2