
    j{"                         d 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	 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d Z e            Z G d de	j                  Z G d d	          ZdS )
a]  
Vendoring of pickleshare, reduced to used functionalities.

---

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.

z0.7.5    )PathNc                 V    dt          t          |           dz            z  dd          S )Nz%02x   )abshash)keys    c/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/IPython/external/pickleshare.pygethashfiler   :   s(    ScS)))233//    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 )PickleShareDBz5The main 'connection' object for PickleShare databasec                    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 )z9Return a db object that will manage the specied directoryTparentsN)
isinstancestrospathabspath
expanduserr   rootis_dirmkdirOSErrorerrnoEEXISTcache)selfr   es      r
   __init__zPickleShareDB.__init__D   s    $$$ 	t99Dwrw11$7788JJ	y!! 		----   7el** +**** 


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__U   s,   i#o	 HHJJt}-EE 	  	  	 3--	  $*$*S/!*<!<!<:c?1%%	 $ -1l16688,,- - - - - - - - - - - - - - -	 3--,
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'] = 5Tr   wb   )protocolN)r   parentr   r   r(   r)   dumpr%   st_mtimer   r   r   ENOENT)r   r	   valuer,   r5   r.   r    s          r
   __setitem__zPickleShareDB.__setitem__i   s#   i#o 	'&--// 	'LLL&&& XXd^^ 	.qKq1----	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.	$chhjj&9:DJsOOO 	 	 	w%,&& '&&&&&	s*   A77A;>A;#B( (
C2CCc                     | j         |z  }|                                s|                                 |t          |          z  }|                     |i           }|                    ||i           || |<   dS )z
hashed setN)r   r   r   r   getupdate)r   hashrootr	   r9   hroothfileds          r
   hsetzPickleShareDB.hsety   ss    	H$||~~ 	KKMMMC(((HHUB	#u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   r>   r	   default	fast_onlyr?   r@   rA   s           r
   hgetzPickleShareDB.hget   s    	H$C(((HHUI&&	>> i''"3--' 

8$$AuuS'"""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   r>   hfileslastallr.   s         r
   rE   zPickleShareDB.hdict   s    8d?++6{{)vbz/R== 	*VfSbSk)F 	 	A

47####   i$GHHHGGG LLOOOO
s   0BB-,B-c                    |                      |dz             }i }|D ]2}|                    | |                    |                     |           3|| |dz   <   |D ],}| j        |z  }|j        dk    r|                                 -dS )zCompress category 'hashroot', so hset is fast again

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

        rJ   z/xxrM   N)rO   r=   rT   r   nameunlink)r   r>   rU   rW   r.   ps         r
   	hcompresszPickleShareDB.hcompress   s     8d?++ 	 	AJJtAwLLOOOO!$X 	 	A	AAv~~HHJJJJ		 	r   c                     | j         |z  }| j                            |d           	 |                                 dS # t          $ r Y dS w xY w)zdel db["key"]N)r   r   poprZ   r   )r   r	   r,   s      r
   __delitem__zPickleShareDB.__delitem__   s]    i#o
sD!!!	JJLLLLL 	 	 	 DD	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4T3???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_filere   ).0r[   r   s     r
   
<listcomp>z&PickleShareDB.keys.<locals>.<listcomp>   s4    BBBaiikkB  ##BBBr   )r   rglobglob)r   globpatfiless   `  r
   rO   zPickleShareDB.keys   sL     ?IOOC((EEINN7++EBBBBUBBBBr   c                 D    t          |                                           S N)iterrO   r   s    r
   __iter__zPickleShareDB.__iter__   s    DIIKK   r   c                 D    t          |                                           S rr   )rQ   rO   rt   s    r
   __len__zPickleShareDB.__len__   s    499;;r   c                 X    |si | _         |D ]}| j                             |d           dS )zRemoves 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   r^   )r   itemsits      r
   rT   zPickleShareDB.uncache   sE      	DJ 	% 	%BJNN2t$$$$	% 	%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?   g      ?r3   r#   r   )r'   timesleeprQ   )r   r	   maxwaittimewtimestrieswaitedvals          r
   waitgetzPickleShareDB.waitget   s     cUQY&!,	3i
    ##smm#Jve}%%%fUm#Fs6{{Q&&
	s   	" 
//c                 "    t          | |          S )z)Get a convenient link for accessing items)PickleShareLink)r   folders     r
   getlinkzPickleShareDB.getlink  s    tV,,,r   c                     d| j         z  S )NzPickleShareDB('%s'))r   rt   s    r
   __repr__zPickleShareDB.__repr__  s    $ty00r   rr   )r{   )__name__
__module____qualname____doc__r!   r0   r:   rB   rD   rH   rE   r\   r_   re   rO   ru   rw   rT   r   r   r   ri   r   r
   r   r   A   s(       ??  "  (      +4t # # # #&  .  *	 	 	@ @ @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   zA 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 rr   )__dict__r=   locals)r   dbkeydirs      r
   r!   zPickleShareLink.__init__   s"    VXX&&&&&r   c                 J    | j         d         | j         d         dz   |z            S )Nr   r   rb   )r   )r   r	   s     r
   __getattr__zPickleShareLink.__getattr__#  s%    }T"4=#:S#@3#FGGr   c                 0    || j         | j        dz   |z   <   d S )Nrb   )r   r   )r   r	   r   s      r
   __setattr__zPickleShareLink.__setattr__&  s     +.c!C'(((r   c                     | j         d         }|                    | j         d         dz             }d| j         d         dd                    d |D                       dS )	Nr   r   rJ   z<PickleShareLink 'z': ;c                 P    g | ]#}t          |                                          $S ri   )r   basename)rk   ks     r
   rl   z,PickleShareLink.__repr__.<locals>.<listcomp>.  s*    777Qd1gg&&((777r   >)r   rO   join)r   r   rO   s      r
   r   zPickleShareLink.__repr__)  sk    ]4 wwt}X.566M(###HH77$7778888
 	
r   N)r   r   r   r   r!   r   r   r   ri   r   r
   r   r     s]         ' ' 'H H H/ / /
 
 
 
 
r   r   )r   __version__pathlibr   r   r%   r~   collections.abcabccollections_abcImportErrorcollectionscPickler)   r   sysr   objectrD   MutableMappingr   r   ri   r   r
   <module>r      sh  $ $L                   *------- * * *))))))*   MMMMM  



0 0 0 FHH	Q1 Q1 Q1 Q1 Q1O2 Q1 Q1 Q1h
 
 
 
 
 
 
 
 
 
s    	++4 	A A 