
    ~f&                     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    F/var/www/cvtools/html/venv/lib/python3.12/site-packages/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)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    $-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__Y   s    ii#o	 XXZ.E $**$**S/!*<!<::c?1%%	 $ -1ll1668,-
 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    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 set N)r   r   r   r   getupdate)r"   hashrootr   r<   hroothfileds          r   hsetzPickleShareDB.hset}   sZ    		H$||~KKMC((HHUB	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((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"   rA   hfileslastallr1   s         r   rH   zPickleShareDB.hdict   s    8d?+6{)vbz/R==VfSbk)F 	A

47#
 LL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     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!   popr]   r   )r"   r   r/   s      r   __delitem__zPickleShareDB.__delitem__   sC    ii#o

s4 	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4T#>>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   sT     ?IIOOC(EIINN7+E-2Baiik  #BBBs   A*A*c                 4    t        | j                               S N)iterrR   r"   s    r   __iter__zPickleShareDB.__iter__   s    DIIK  r   c                 4    t        | j                               S rq   )rT   rR   rs   s    r   __len__zPickleShareDB.__len__   s    499;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/     DJ 	$BJJNN2d#	$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     cUQY&!,3i
  #sm#JJve}%F5M!Fs6{A~%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   rs   s    r   __repr__zPickleShareDB.__repr__  s    $tyy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$(  -64 #&..	?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    VX&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__/  si    ]]4 wwh/56MM(#HH$7Qd1g&&(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'   OO  	E 
B
388}qe
((1+C88AB<D
f}C5TQ[bhhj!	yy~~Q[Dz

88: 	CAaBqE		
	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   objectrG   MutableMappingr   r   r   r   r   r   r   <module>r      s   B & 
  *-  
A!6L>L0 H	U1O22 U1r: :0%N jF e	    *)*  s3   B B B& BB	B#"B#&	B21B2