-ํ
็ถ<c       sn     d  Z    d k Z  d k Z  e i Z  d Z  e Z ! d f  d     YZ	  e
 d d  Z d S(   sญ  A dumb and slow but simple dbm clone.

For database spam, spam.dir contains the index (a text file),
spam.bak *may* contain a backup of the index (also a text file),
while spam.dat contains the data (a binary file).

XXX TO DO:

- seems to contain a bug when updating...

- reclaim free space (currently, space once occupied by deleted or expanded
items is never reused)

- support concurrent access (currently, if two processes take turns making
updates, they can mess up the index)

- support efficient access to large databases (currently, the whole index
is read when the database is opened, and some updates rewrite the whole index)

- support opening for read-only (flag = 'm')

Ni   s	   _Databasec      sิ   ! t  Z # d   Z 0 d   Z > d   Z H d   Z P d   Z _ d   Z f d   Z l d   Z	 } d	   Z
  d
   Z  d   Z  d   Z  d   Z  e Z  d   Z  d   Z  d   Z RS(   Nc    sย   # $ | |  _ % | t i d |  _ & | t i d |  _ ' | t i d |  _ ) y * t	 |  i d  } Wn1 + t j
 o" , t	 |  i d |  i  } n X- | i   . |  i   d  S(   Ns   dirs   dats   baks   rs   w(   s   modes   selfs   _modes   files   _oss   extseps   _dirfiles   _datfiles   _bakfiles   _opens   fs   IOErrors   closes   _update(   s   selfs   files   modes   f(    (    s   /usr/lib/python2.2/dumbdbm.pys   __init__# s    c    sร   0 1 h  |  _ 2 y 3 t |  i  } Wn 4 t j
 o
 5 n} X7 xh 7 d o] 8 | i   i   } 9 | o 9 Pn : t	 |  \ } \ } } ; | | f |  i | <qJ W< | i   d  S(   Ni   (   s   selfs   _indexs   _opens   _dirfiles   fs   IOErrors   readlines   rstrips   lines   evals   keys   poss   sizs   close(   s   selfs   sizs   keys   fs   lines   pos(    (    s   /usr/lib/python2.2/dumbdbm.pys   _update0 s    
 c    s๓   > ? y ? t  i |  i  Wn @ t  i j
 o
 @ n XA y A t  i |  i |  i  Wn B t  i j
 o
 B n XC t |  i d |  i  } D xF |  i
 i   DD ]2 \ } \ } } E | i d | | | f  qฉ WF | i   d  S(   Ns   ws   %s, (%s, %s)
(   s   _oss   unlinks   selfs   _bakfiles   errors   renames   _dirfiles   _opens   _modes   fs   _indexs   itemss   keys   poss   sizs   writes   close(   s   selfs   keys   fs   sizs   pos(    (    s   /usr/lib/python2.2/dumbdbm.pys   _commit> s        $c    sh   H I |  i | \ } } J t |  i d  } K | i |  L | i	 |  } M | i   N | Sd  S(   Ns   rb(   s   selfs   _indexs   keys   poss   sizs   _opens   _datfiles   fs   seeks   reads   dats   close(   s   selfs   keys   dats   fs   sizs   pos(    (    s   /usr/lib/python2.2/dumbdbm.pys   __getitem__H s   c    sฎ   P Q t  |  i d  } R | i d d  S t | i    } W | t d t t } X | i
 d | |  Y | } [ | i
 |  \ | i   ] | t |  f Sd  S(   Ns   rb+i    i   i   s    (   s   _opens   selfs   _datfiles   fs   seeks   ints   tells   poss
   _BLOCKSIZEs   nposs   writes   vals   closes   len(   s   selfs   vals   nposs   fs   pos(    (    s   /usr/lib/python2.2/dumbdbm.pys   _addvalP s   	c    s\   _ ` t  |  i d  } a | i |  b | i |  c | i   d | t	 |  f Sd  S(   Ns   rb+(
   s   _opens   selfs   _datfiles   fs   seeks   poss   writes   vals   closes   len(   s   selfs   poss   vals   f(    (    s   /usr/lib/python2.2/dumbdbm.pys   _setval_ s
   c    sq   f | \ } } g | | f |  i | <h t |  i d |  i  } i | i	 d | | | f  j | i
   d  S(   Ns   as   %s, (%s, %s)
(   s   poss   sizs   selfs   _indexs   keys   _opens   _dirfiles   _modes   fs   writes   close(   s   selfs   keys   .4s   poss   sizs   f(    (    s   /usr/lib/python2.2/dumbdbm.pys   _addkeyf s    c    sP  l m t  |  t  d  j o t  |  j n o n t d  n o |  i i |  o5 p |  i |  \ } } q |  i
 | | | f  nบ s |  i | \ } } t | t d t } u t |  t d t } v | | j o5 w |  i | |  \ } } x | | f |  i | <n/ z |  i |  \ } } { | | f |  i | <d  S(   Ns    s   keys and values must be stringsi   (   s   types   keys   vals	   TypeErrors   selfs   _indexs   has_keys   _addvals   poss   sizs   _addkeys
   _BLOCKSIZEs	   oldblockss   lens	   newblockss   _setval(   s   selfs   keys   vals   sizs   poss	   newblockss	   oldblocks(    (    s   /usr/lib/python2.2/dumbdbm.pys   __setitem__l s   4c    s!   } ~ |  i | = |  i   d  S(   N(   s   selfs   _indexs   keys   _commit(   s   selfs   key(    (    s   /usr/lib/python2.2/dumbdbm.pys   __delitem__} s   c    s     |  i i   Sd  S(   N(   s   selfs   _indexs   keys(   s   self(    (    s   /usr/lib/python2.2/dumbdbm.pys   keys s   c    s     |  i i |  Sd  S(   N(   s   selfs   _indexs   has_keys   key(   s   selfs   key(    (    s   /usr/lib/python2.2/dumbdbm.pys   has_key s   c    s     |  i i |  Sd  S(   N(   s   selfs   _indexs   has_keys   key(   s   selfs   key(    (    s   /usr/lib/python2.2/dumbdbm.pys   __contains__ s   c    s     |  i i   Sd  S(   N(   s   selfs   _indexs   iterkeys(   s   self(    (    s   /usr/lib/python2.2/dumbdbm.pys   iterkeys s   c    s     t  |  i  Sd  S(   N(   s   lens   selfs   _index(   s   self(    (    s   /usr/lib/python2.2/dumbdbm.pys   __len__ s   c    s:     |  i    t |  _  t |  _ |  _ |  _ d  S(   N(   s   selfs   _commits   Nones   _indexs   _datfiles   _dirfiles   _bakfile(   s   self(    (    s   /usr/lib/python2.2/dumbdbm.pys   close s   c    s+     |  i t j	 o  |  i   n d  S(   N(   s   selfs   _indexs   Nones   _commit(   s   self(    (    s   /usr/lib/python2.2/dumbdbm.pys   __del__ s   (   s   __name__s
   __module__s   __init__s   _updates   _commits   __getitem__s   _addvals   _setvals   _addkeys   __setitem__s   __delitem__s   keyss   has_keys   __contains__s   iterkeyss   __iter__s   __len__s   closes   __del__(    (    (    s   /usr/lib/python2.2/dumbdbm.pys	   _Database! s"   	
	iถ  c    s     t  |  |  Sd  S(   N(   s	   _Databases   files   mode(   s   files   flags   mode(    (    s   /usr/lib/python2.2/dumbdbm.pys   open s   (   s   __doc__s   oss   _oss   __builtin__s   opens   _opens
   _BLOCKSIZEs   IOErrors   errors	   _Databases   None(   s	   _Databases   __builtin__s   _oss   errors
   _BLOCKSIZEs   opens   _open(    (    s   /usr/lib/python2.2/dumbdbm.pys   ? s   		{