
    ;;i{"                         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	 	 ddlZddlZddlZd Z e       Z G d de	j&                        Z G d d	      Zy# e
$ r ddlZ	Y Bw xY w# e
$ r ddlZY Lw xY w)
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                 <    dt        t        |       dz        z  dd  S )Nz%02x   )abshash)keys    Y/home/rose/Desktop/poly/venv/lib/python3.12/site-packages/IPython/external/pickleshare.pygethashfiler   :   s!    ScS))23//    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)PickleShareDBz5The main 'connection' object for PickleShare databasec                    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)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    $$t9Dwwrww11$78J	yy!		-
 
R
	  77ell* + 
	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__U   s    ii#o	 HHJt}}-E $**$**S/!*<!<::c?1%%	 $1ll1668,  
 ,

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'] = 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    ii#o&--/LLL& XXd^qKKq1- 	$chhj&9&9:DJJsO ^  	ww%,,& '	s$   B3)B) B&)	C2CCc                     | j                   |z  }|j                         s|j                          |t        |      z  }| j	                  |i       }|j                  ||i       || |<   y)z
hashed setN)r   r   r   r   getupdate)r   hashrootr	   r9   hroothfileds          r
   hsetzPickleShareDB.hsety   sZ    		H$||~KKMC((HHUB	#u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   r>   r	   default	fast_onlyr?   r@   rA   s           r
   hgetzPickleShareDB.hget   sq    		H$C((HHUI&	>i'"3-' 

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

47#
 LLO  
  i$GH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)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O 
 "%XA		AAvv~HHJ	 r   c                     | j                   |z  }| j                  j                  |d       	 |j                          y# t        $ r Y yw xY w)zdel db["key"]N)r   r   poprZ   r   )r   r	   r,   s      r
   __delitem__zPickleShareDB.__delitem__   sC    ii#o

sD!	JJL 	 	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4T3??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_filere   )r   globpatfilesr[   s       r
   rO   zPickleShareDB.keys   sX     ?IIOOC(EIINN7+E-2BUaiik  #UBBBs   A*A*c                 4    t        | j                               S N)iterrO   r   s    r
   __iter__zPickleShareDB.__iter__   s    DIIK  r   c                 4    t        | j                               S rn   )rQ   rO   rp   s    r
   __len__zPickleShareDB.__len__   s    499;r   c                 \    |si | _         |D ]  }| j                   j                  |d         y)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   s*     DJBJJNN2t$ 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?   g      ?r3   r#   r   )r'   timesleeprQ   )r   r	   maxwaittimewtimestrieswaitedvals          r
   waitgetzPickleShareDB.waitget   s     cUQY&!,3i
  #sm#JJve}%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   rp   s    r
   __repr__zPickleShareDB.__repr__  s    $tyy00r   rn   )<   )__name__
__module____qualname____doc__r!   r0   r:   rB   rD   rH   rE   r\   r_   re   rO   rq   rs   rT   r   r   r    r   r
   r   r   A   s_    ?"(  +4t #&.*	@C! %@-1r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)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                 J    | j                   j                  t                      y rn   )__dict__r=   locals)r   dbkeydirs      r
   r!   zPickleShareLink.__init__   s    VX&r   c                 L    | 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                 B    || j                   | j                  dz   |z   <   y )Nrb   )r   r   )r   r	   r   s      r
   __setattr__zPickleShareLink.__setattr__&  s    +.c!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   rJ   z<PickleShareLink 'z': ;>)r   rO   joinr   basename)r   r   rO   ks       r
   r   zPickleShareLink.__repr__)  sm    ]]4 wwt}}X.56MM(#HH$7$Qd1g&&($78
 	
7s    A;N)r   r   r   r   r!   r   r   r   r   r   r
   r   r     s    'H/
r   r   )r   __version__pathlibr   r   r%   ry   collections.abcabccollections_abcImportErrorcollectionscPickler)   r   sysr   objectrD   MutableMappingr   r   r   r   r
   <module>r      s   $L    *-  
0 H	Q1O22 Q1h
 
K  *)*  s"   A A$ 	A! A!$	A0/A0