;ò
ÎÑAHc           @   sÔ   d  Z  d k l Z d k Z d k Z d k Z d k Z d k	 Z	 d k
 Z
 d k Z d k l Z d „  Z e ƒ  Z d e	 i f d „  ƒ  YZ d f  d „  ƒ  YZ d	 „  Z d
 „  Z d „  Z e d j o e ƒ  n d S(   s&   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: easy_install pickleshare

Author: Ville Vainio <vivainio@gmail.com>
License: MIT open source license.

(   s   pathN(   s   Setc         C   s    d t  t |  ƒ d ƒ d Sd  S(   Ns   %02xi   iþÿÿÿ(   s   abss   hashs   key(   s   key(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   gethashfile-   s    s   PickleShareDBc           B   s˜   t  Z d  Z d „  Z d „  Z d „  Z d „  Z e e d „ Z	 d „  Z
 d „  Z d „  Z d	 „  Z e d
 „ Z d „  Z d d „ Z d „  Z d „  Z RS(   s7    The main 'connection' object for PickleShare database c         C   sJ   t  | ƒ i ƒ  i ƒ  |  _ |  i i ƒ  o |  i i ƒ  n h  |  _ d S(   s:    Return a db object that will manage the specied directoryN(   s   Paths   roots
   expandusers   abspaths   selfs   isdirs   makedirss   cache(   s   selfs   root(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   __init__4   s
     c         C   sË   |  i | } y | i ƒ  t i } Wn t j
 o t | ƒ ‚ n X| |  i	 j o | |  i	 | d j o |  i	 | d Sn y t
 i | i ƒ  ƒ } Wn t | ƒ ‚ n X| | f |  i	 | <| Sd S(   s    db['key'] reading i   i    N(   s   selfs   roots   keys   fils   stats   ST_MTIMEs   mtimes   OSErrors   KeyErrors   caches   pickles   loads   opens   obj(   s   selfs   keys   objs   mtimes   fil(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   __getitem__=   s     (c         C   s¡   |  i | } | i } | o | i ƒ  o | i ƒ  n t i | | i
 d ƒ ƒ } y | | i f |  i | <Wn, t j
 o  } | i d j o ‚  q n Xd S(   s    db['key'] = 5 s   wi   N(   s   selfs   roots   keys   fils   parents   isdirs   makedirss   pickles   dumps   values   opens   pickleds   mtimes   caches   OSErrors   es   errno(   s   selfs   keys   values   es   parents   pickleds   fil(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   __setitem__P   s     	c         C   so   |  i | } | i ƒ  o | i ƒ  n | t | ƒ } |  i	 | h  ƒ } | i h  | | <ƒ | |  | <d S(   s    hashed set N(   s   selfs   roots   hashroots   hroots   isdirs   makedirss   gethashfiles   keys   hfiles   gets   ds   updates   value(   s   selfs   hashroots   keys   values   hroots   ds   hfile(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   hset]   s     c         C   s   |  i | } | t | ƒ } |  i | t ƒ } | t j o? | o% | t j o t | ƒ ‚ n | Sn |  i | ƒ } n | i | | ƒ Sd S(   s    hashed get N(   s   selfs   roots   hashroots   hroots   gethashfiles   keys   hfiles   gets	   _sentinels   ds	   fast_onlys   defaults   KeyErrors   hdict(   s   selfs   hashroots   keys   defaults	   fast_onlys   hroots   ds   hfile(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   hgeti   s     c         C   sË   |  i | d ƒ } | i ƒ  t | ƒ o | d p d } | i d ƒ o | g | d  } n h  } xZ | D]R } y | i
 |  | ƒ Wn' t j
 o d G| Gd GH|  | =n X|  i | ƒ qm W| Sd S(   s>    Get all data contained in hashed category 'hashroot' as dict s   /*iÿÿÿÿs    s   xxs   Corrupts!   deleted - hset is not threadsafe!N(   s   selfs   keyss   hashroots   hfiless   sorts   lens   lasts   endswiths   alls   fs   updates   KeyErrors   uncache(   s   selfs   hashroots   alls   lasts   fs   hfiles(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   hdict|   s      
 c         C   sœ   |  i | d ƒ } h  } x, | D]$ } | i |  | ƒ |  i | ƒ q  W| |  | d <x? | D]7 } |  i | } | i
 ƒ  d j o q] n | i ƒ  q] Wd S(   s»    Compress category 'hashroot', so hset is fast again
        
        hget will fail if fast_only is True for compressed items (that were
        hset before hcompress).
        
        s   /*s   /xxs   xxN(   s   selfs   keyss   hashroots   hfiless   alls   fs   updates   uncaches   roots   ps   basenames   remove(   s   selfs   hashroots   alls   fs   ps   hfiles(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys	   hcompress“   s       c         C   sH   |  i | } |  i i | t ƒ y | i ƒ  Wn t j
 o n Xd S(   s    del db["key"] N(	   s   selfs   roots   keys   fils   caches   pops   Nones   removes   OSError(   s   selfs   keys   fil(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   __delitem__ª   s     c         C   s&   t  |  i i | ƒ ƒ i d d ƒ Sd S(   s%    Make a key suitable for user's eyes s   \s   /N(   s   strs   selfs   roots	   relpathtos   ps   replace(   s   selfs   p(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   _normalizedµ   s     c         C   s    | t j o |  i i ƒ  } n> g  i } t i |  i | ƒ D] } | t
 | ƒ ƒ q> ~ } g  i } | D]* } | i ƒ  o | |  i | ƒ ƒ qk qk ~ Sd S(   s,    All keys in DB, or all keys matching a globN(   s   globpats   Nones   selfs   roots	   walkfiless   filess   appends   _[1]s   globs   ps   Paths   isfiles   _normalized(   s   selfs   globpats   filess   _[1]s   p(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   keys¹   s
     =c         G   s=   | o h  |  _ n x! | D] } |  i i | t ƒ q Wd S(   sÜ    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(   s   itemss   selfs   caches   its   pops   None(   s   selfs   itemss   it(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   uncacheÂ   s      i<   c         C   sÇ   d g d d g d d g } d } d } x• n o y |  | } | SWn t j
 o n X| | j o t | ƒ ‚ n t i	 | | ƒ | | | 7} | t
 | ƒ d j  o | d 7} q. q5 Wd S(   s"   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. 
        f0.20000000000000001i   f0.5i   i   i    N(   s   wtimess   triess   waiteds   selfs   keys   vals   KeyErrors   maxwaittimes   times   sleeps   len(   s   selfs   keys   maxwaittimes   vals   wtimess   triess   waited(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   waitgetÏ   s"      
c         C   s   t  |  | ƒ Sd S(   s,    Get a convenient link for accessing items  N(   s   PickleShareLinks   selfs   folder(   s   selfs   folder(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   getlinkï   s     c         C   s   d |  i Sd  S(   Ns   PickleShareDB('%s')(   s   selfs   root(   s   self(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   __repr__ó   s    (   s   __name__s
   __module__s   __doc__s   __init__s   __getitem__s   __setitem__s   hsets	   _sentinels   Trues   hgets   hdicts	   hcompresss   __delitem__s   _normalizeds   Nones   keyss   uncaches   waitgets   getlinks   __repr__(    (    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   PickleShareDB2   s    											 	s   PickleShareLinkc           B   s2   t  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   sà    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         C   s   |  i i t ƒ  ƒ d  S(   N(   s   selfs   __dict__s   updates   locals(   s   selfs   dbs   keydir(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   __init__  s    c         C   s"   |  i d |  i d d | Sd  S(   Ns   dbs   keydirs   /(   s   selfs   __dict__s   key(   s   selfs   key(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   __getattr__  s    c         C   s   | |  i |  i d | <d  S(   Ns   /(   s   vals   selfs   dbs   keydirs   key(   s   selfs   keys   val(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   __setattr__  s    c         C   sv   |  i d } | i |  i d d ƒ } d |  i d d i g  i } | D] } | t | ƒ i	 ƒ  ƒ qH ~ ƒ f Sd  S(   Ns   dbs   keydirs   /*s   <PickleShareLink '%s': %s>s   ;(
   s   selfs   __dict__s   dbs   keyss   joins   appends   _[1]s   ks   Paths   basename(   s   selfs   keyss   dbs   _[1]s   k(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   __repr__	  s    (   s   __name__s
   __module__s   __doc__s   __init__s   __getattr__s   __setattr__s   __repr__(    (    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   PickleShareLinkø   s
   	 			c          C   s  t  d ƒ }  |  i ƒ  d G|  i ƒ  GHd |  d <d d d g |  d <d d	 d
 f g |  d <|  i d d d ƒ |  i d d d ƒ d G|  i d d ƒ GHd G|  i d d ƒ GHd G|  i d ƒ GH|  i ƒ  GH|  i d ƒ GHt |  ƒ GH|  i	 ƒ  |  i
 d ƒ } d | _ | i d	 | _ | i GHd  S(   Ns   ~/testpickleshares   Should be empty:i   s   helloi   i   i9  s	   aku ankkai   i.   s   paths/nest/ok/keynames   hashs   akui   s   ankkas   12 =s   313 =s
   all hasheds   paths/nest/ok/k*s   myobjects/test(   s   PickleShareDBs   dbs   clears   itemss   hsets   hgets   hdicts   keyss   dicts   uncaches   getlinks   lnks   foos   bar(   s   dbs   lnk(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   test  s&    


	c       	   C   sM  t  d ƒ } d  k } d  k } x(t d ƒ D]}  xá t d ƒ D]Ó } |  d d j o
 |  d j  o+ t | ƒ | j o | t | ƒ =q> q> n | d d j o | i d ƒ n | i	 t | ƒ g  ƒ |  | d t
 i ƒ  f g | t | ƒ <| i d	 | | i d	 | d ƒ d
 ƒ q> W|  G| i i ƒ  |  d d j o | i ƒ  q+ q+ Wd  S(   Ns
   ~/fsdbtestiè  i   i    iÈ   i!   f0.02s   proc %ds   hashi   i
   (   s   PickleShareDBs   dbs   times   syss   ranges   is   js   strs   sleeps   gets   oss   getpids   hsets   hgets   stdouts   flushs   uncache(   s   is   dbs   js   syss   time(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   stress(  s$      <*c          C   s  d  k  } | i d ƒ }	 t } d  k } t | i ƒ d j  o |	 GHd  Sn | i d } | i d }  | d j oE |  o d g }  n | |  d ƒ }
 d  k } | i |
 i ƒ  ƒ nÆ | d j o` | i i ƒ  } | |  d ƒ }
 t | ƒ } |
 i ƒ  x€ |
 i ƒ  D] \ } } | |
 | <qWnY | d j o, | |  d ƒ }
 |
 i ƒ  |
 i d	 ƒ GHn  | d
 j o t ƒ  t ƒ  n d  S(   NsÒ       pickleshare - manage PickleShare databases 
    
    Usage:
        
        pickleshare dump /path/to/db > dump.txt
        pickleshare load /path/to/db < dump.txt
        pickleshare test /path/to/db
    i   i   s   dumps   .i    s   loads   testwaits   250s   test(   s   textwraps   dedents   usages   PickleShareDBs   DBs   syss   lens   argvs   cmds   argss   dbs   pprints   itemss   stdins   reads   conts   evals   datas   clears   ks   vs   waitgets   tests   stress(   s   argss   conts   DBs   ks   cmds   textwraps   syss   pprints   vs   usages   dbs   data(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   main=  s<    			 	
 
s   __main__(   s   __doc__s   IPython.external.paths   paths   Paths   oss   stats   times   cPickles   pickles   UserDicts   warningss   globs   setss   Sets   sets   gethashfiles   objects	   _sentinels	   DictMixins   PickleShareDBs   PickleShareLinks   tests   stresss   mains   __name__(   s   stats   sets   gethashfiles   warningss   oss   globs   times   PickleShareDBs   stresss	   _sentinels   PickleShareLinks   UserDicts   tests   Paths   mains   pickle(    (    sN   /nyx/web/d/b/dbachman/work/src/ipython-0.8.4/IPython/Extensions/pickleshare.pys   ?"   s    						Æ			'