
    <h&                     t   S r SSKJr  Sr SSKJr  SSKrSSK	r	SSK
r
 SSKJr   SSKrSSKrSSKr\R&                  S   S:  a  \4rO\\4rS r\" 5       r " S S	\R4                  5      r " S
 S5      rS r\S:X  a  \" 5         gg! \ a	    SSKJr   Nf = f! \ a    SSKr Nf = f! \ a    SSKr Nf = f)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                 <    S[        [        U 5      S-  5      -  SS  $ )Nz%02x   )abshash)keys    oC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\venv\Lib\site-packages\IPython/external/pickleshare.pygethashfiler   B   s!    ScS))23//    c                       \ rS rSrSrS rS rS rS r\	S4S jr
S	 rS
 rS rS rSS jrS rS rS rSS jrS rS rSrg)PickleShareDBI   z5The main 'connection' object for PickleShare databasec                    [        U[        5      (       d  [        U5      n[        R                  R                  [        R                  R                  U5      5      n[        U5      U l        U R                  R                  5       (       d   U R                  R                  SS9  0 U l        g! [         a)  nUR                  [        R                  :w  a  e  SnAN6SnAff = f)z9Return 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__PickleShareDB.__init__L   s    $--t9Dwwrww11$78J	yy!!		-
 
	  77ell* +s   B. .
C!8CC!c                    U R                   U-  n UR                  5       [        R                     nX R
                  ;   a'  X0R
                  U   S   :X  a  U R
                  U   S   $  UR                  S5       n[        R                  " UR                  5       5      nSSS5        WU4U R
                  U'   U$ ! [         a    [	        U5      ef = f! , (       d  f       N:= f!   [	        U5      e= f)zdb['key'] reading   r   rbN)
r   statST_MTIMEr   KeyErrorr"   openpickleloadsread)r#   r   filmtimefobjs         r   __getitem__PickleShareDB.__getitem__]   s    ii#o	 HHJt}}-E ****S/!*<!<::c?1%%	 $1ll1668,  
 ,

3
  	 3-	   	 3-s5   !B: )C$ :%CC$ :C
C!C$ !C$ $C1c                    U R                   U-  nUR                  nU(       a$  UR                  5       (       d  UR                  SS9  UR	                  S5       n[
        R                  " X%SS9  SSS5         X#R                  5       R                  4U R                  U'   g! , (       d  f       N8= f! [         a)  nUR                  [        R                  :w  a  e  SnAgSnAff = f)zdb['key'] = 5Tr   wb   )protocolN)r   parentr   r   r-   r.   dumpr*   st_mtimer"   r   r    ENOENT)r#   r   valuer1   r;   r3   r$   s          r   __setitem__PickleShareDB.__setitem__q   s    ii#o&--//LLL& XXd^qKK1- 	$hhj&9&9:DJJsO ^  	ww%,,& '	s$   B 7(B1  
B.1
C$;CC$c                     U R                   U-  nUR                  5       (       d  UR                  5         U[        U5      -  nU R	                  U0 5      nUR                  X#05        X`U'   g)z
hashed setN)r   r   r   r   getupdate)r#   hashrootr   r?   hroothfileds          r   hsetPickleShareDB.hset   sX    		H$||~~KKMC((HHUB	#Ur   Tc                     U R                   U-  nU[        U5      -  nU R                  U[        5      nU[        L a.  U(       a  U[        L a  [	        U5      eU$ U R                  U5      nUR                  X#5      $ )z
hashed get)r   r   rC   	_sentinelr,   hdict)r#   rE   r   default	fast_onlyrF   rG   rH   s           r   hgetPickleShareDB.hget   so    		H$C((HHUI&	>i'"3-' 

8$AuuS""r   c                 j   U R                  US-   5      nUR                  5         [        U5      =(       a    US   =(       d    SnUR                  S5      (       a	  U/USS -   n0 nU H(  n UR	                  X   5        U R                  U5        M*     U$ ! [
         a    [        SUS5        X	  N2f = f)z<Get all data contained in hashed category 'hashroot' as dict/* xxNCorruptz!deleted - hset is not threadsafe!)keyssortlenendswithrD   r,   printuncache)r#   rE   hfileslastallr3   s         r   rM   PickleShareDB.hdict   s    8d?+6{)vbz/R==VfSbk)FA

47#
 LLO  
  i$GHGs   ,BB21B2c                    U R                  US-   5      n0 nU H'  nUR                  X   5        U R                  U5        M)     X0US-   '   U H4  nU R                  U-  nUR                  S:X  a  M$  UR                  5         M6     g)zCompress category 'hashroot', so hset is fast again

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

rS   z/xxrV   N)rX   rD   r]   r   nameunlink)r#   rE   r^   r`   r3   ps         r   	hcompressPickleShareDB.hcompress   s{     8d?+AJJtwLLO 
 "%XA		AAvv~HHJ	 r   c                     U R                   U-  nU R                  R                  US5         UR                  5         g! [         a     gf = f)zdel db["key"]N)r   r"   poprd   r   )r#   r   r1   s      r   __delitem__PickleShareDB.__delitem__   sC    ii#o

sD!	JJL 	 	s   > 
A
Ac                 j    [        UR                  U R                  5      5      R                  SS5      $ )z#Make a key suitable for user's eyes\/)r   relative_tor   replace)r#   re   s     r   _normalizedPickleShareDB._normalized   s'    1==+,44T3??r   Nc                     Uc  U R                   R                  S5      nOU R                   R                  U5      nU Vs/ s H*  o3R                  5       (       d  M  U R	                  U5      PM,     sn$ s  snf )z+All keys in DB, or all keys matching a glob*)r   rglobglobis_filerq   )r#   globpatfilesre   s       r   rX   PickleShareDB.keys   sY     ?IIOOC(EIINN7+E-2BUiik#  #UBBBs   A3A3c                 4    [        U R                  5       5      $ N)iterrX   r#   s    r   __iter__PickleShareDB.__iter__   s    DIIK  r   c                 4    [        U R                  5       5      $ r|   )rZ   rX   r~   s    r   __len__PickleShareDB.__len__   s    499;r   c                 j    U(       d  0 U l         U H  nU R                   R                  US5        M!     g)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"   ri   )r#   itemsits      r   r]   PickleShareDB.uncache   s*     DJBJJNN2t$ r   c                     S/S-  S/S-  -   S/-   nSnSn  X   nU$ ! [          a     Of = fXR:  a  [        U5      e[        R                  " X4   5        XSU   -  nU[        U5      S-
  :  a  US-  nM_  )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      ?r9   r(   r   )r,   timesleeprZ   )r#   r   maxwaittimewtimestrieswaitedvals          r   waitgetPickleShareDB.waitget   s     cUQY&!,i
  #sm#JJv}%Um#Fs6{Q&
 s    
++c                     [        X5      $ )z)Get a convenient link for accessing items)PickleShareLink)r#   folders     r   getlinkPickleShareDB.getlink  s    t,,r   c                      SU R                   -  $ )NzPickleShareDB('%s'))r   r~   s    r   __repr__PickleShareDB.__repr__  s    $tyy00r   )r"   r   r|   )<   )__name__
__module____qualname____firstlineno____doc__r%   r5   r@   rI   rL   rP   rM   rf   rj   rq   rX   r   r   r]   r   r   r   __static_attributes__ r   r   r   r   I   s_    ?"(  +4t #&.*	@C! %@-1r   r   c                   0    \ rS rSrSrS rS rS rS rSr	g)	r   i  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    U R                   R                  [        5       5        g r|   )__dict__rD   locals)r#   dbkeydirs      r   r%   PickleShareLink.__init__(  s    VX&r   c                 L    U R                   S   U R                   S   S-   U-      $ )Nr   r   rn   )r   )r#   r   s     r   __getattr__PickleShareLink.__getattr__+  s)    }}T"4==#:S#@3#FGGr   c                 @    X R                   U R                  S-   U-   '   g )Nrn   )r   r   )r#   r   r   s      r   __setattr__PickleShareLink.__setattr__.  s    +.c!C'(r   c                 
   U R                   S   nUR                  U R                   S   S-   5      nSU R                   S   < SSR                  U Vs/ s H  n[        U5      R	                  5       PM     sn5      < S3$ s  snf )Nr   r   rS   z<PickleShareLink 'z': ;>)r   rX   joinr   basename)r#   r   rX   ks       r   r   PickleShareLink.__repr__1  sm    ]]4 wwt}}X.56MM(#HH$7$Qd1g&&($78
 	
7s   #B r   N)
r   r   r   r   r   r%   r   r   r   r   r   r   r   r   r     s    'H/
r   r   c                     SS K n U R                  S5      n[        nSS Kn[	        UR
                  5      S:  a  [        U5        g UR
                  S   nUR
                  SS  nUS:X  a9  U(       d  S/nU" US   5      nSS KnUR                  UR                  5       5        g US:X  a^  UR                  R                  5       nU" US   5      n[        U5      n	UR                  5         UR                  5        H	  u  pXU
'   M     g US:X  a6  U" US   5      nUR                  5         [        UR                  S	5      5        g US
:X  a  [        5         [        5         g g )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
    r9   r(   r<   .loadtestwait250test)textwrapdedentr   sysrZ   argvr\   pprintr   stdinr0   evalclearr   r   stress)r   usageDBr   cmdargsr   r   contdatar   vs               r   mainr   :  s   OO	
E 
B
388}qe
((1+C88AB<D
f}5DQ[bhhj!	yy~~Q[Dz

HHJDAqE 	
	Q[

bjj 	 
r   __main__)r   
__future__r   __version__pathlibr   ImportErrorpathlib2r   r*   r   collections.abcabccollections_abccollectionscPickler.   r    r   version_infor   r   unicoder   objectrL   MutableMappingr   r   r   r   r   r   r   <module>r      s   B & 
  *-  
A!6L>L0 H	Q1O22 Q1h
 
:+\ zF {	    *)*  s3   B B B* BB
B'&B'*
B76B7