ó
Dü½cc           @   s»   d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l m Z e j Z y d  d l Z e Z	 Wn e
 k
 rŠ d  d l	 Z	 n Xd d d „  ƒ  YZ d e j f d „  ƒ  YZ d S(   iÿÿÿÿN(   t   LockFilet	   DumbBTreec           B   sª   e  Z d  Z d „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   st  Stores pickles of Article objects

    This dictionary-like object stores pickles of all the Article
    objects.  The object itself is stored using marshal.  It would be
    much simpler, and probably faster, to store the actual objects in
    the DumbBTree and pickle it.

    TBD: Also needs a more sensible name, like IteratableDictionary or
    SortedDictionary.
    c         C   s^   d |  _  | |  _ t j |  j d ƒ |  _ |  j ƒ  d |  _ i  |  _ g  |  _ |  j ƒ  d  S(   Ni    s   .lock(	   t   current_indext   pathR    t   lockfilet   lockt   _DumbBTree__dirtyt   dictt   sortedt   load(   t   selfR   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   __init__:   s    		
			c         C   s   d |  j  S(   Ns   DumbBTree(%s)(   R   (   R
   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   __repr__D   s    c         C   sD   |  j  d k s | r@ |  j j ƒ  |  _ |  j j ƒ  d |  _  n  d  S(   Ni   i    (   R   R   t   keysR   t   sort(   R
   t   dirty(    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   __sortG   s    c         C   s   |  j  j ƒ  d  S(   N(   R   R   (   R
   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyR   M   s    c         C   s,   y |  j  j ƒ  Wn t j k
 r' n Xd  S(   N(   R   t   unlockR    t   NotLockedError(   R
   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyR   P   s    c         C   sç   |  j  d k r& |  j | =d |  _ d  Sy |  j |  j  } Wn t k
 rS d  } n X| | k r• y |  j |  j  d } Wq• t k
 r‘ d  } q• Xn  |  j | =|  j d d ƒ | d  k	 rÓ |  j j | ƒ |  _  n |  j  d |  _  d  S(   Ni    i   R   (   R   R   R   R   t
   IndexErrort   Nonet   _DumbBTree__sortt   index(   R
   t   itemt   ci(    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   __delitem__V   s$    
	

c         C   s   i  |  _  d  S(   N(   R   (   R
   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   clearl   s    c         C   sG   |  j  ƒ  |  j s t ‚ n' |  j d } d |  _ | |  j | f Sd  S(   Ni    i   (   R   R   t   KeyErrorR   R   (   R
   t   key(    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   firstq   s    
			c         C   sJ   |  j  s t ‚ n4 |  j  d } t |  j  ƒ d |  _ | |  j | f Sd  S(   Niÿÿÿÿi   (   R   R   t   lenR   R   (   R
   R   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   lastz   s
    		c         C   sO   y |  j  |  j } Wn t k
 r- t ‚ n X|  j d |  _ | |  j | f S(   Ni   (   R   R   R   R   R   (   R
   R   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   next‚   s    
c         C   s   |  j  j | ƒ S(   N(   R   t   has_key(   R
   R   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyR!   Š   s    c         C   sh   d } |  j  ƒ  xE |  j D]: } | d | k rJ | |  _ | |  j | f S| d } q Wt | ƒ ‚ d  S(   Ni    i   (   R   R   R   R   R   (   R
   t   locR   R   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   set_location   s    
	c         C   s   |  j  | S(   N(   R   (   R
   R   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   __getitem__—   s    c         C   s   |  j  d k r) | |  j | <d |  _ d  Sy |  j |  j  } Wn t k
 rV | } n X| |  j | <|  j d d ƒ |  j j | ƒ |  _  d  S(   Ni    i   R   (   R   R   R   R   R   R   R   (   R
   R   t   valt   current_item(    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   __setitem__š   s    	
c         C   s   t  |  j ƒ S(   N(   R   R   (   R
   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   __len__©   s    c         C   s‰   y7 t  |  j ƒ } z t j | ƒ |  _ Wd  | j ƒ  XWn; t k
 rd } | j t j k r… ‚  q… n! t	 k
 rt n X|  j
 d d ƒ d  S(   NR   i   (   t   openR   t   marshalR	   R   t   closet   IOErrort   errnot   ENOENTt   EOFErrorR   (   R
   t   fpt   e(    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyR	   ¬   s     c         C   sg   t  j d ƒ } z t |  j d ƒ } Wd  t  j | ƒ X| j t j |  j ƒ ƒ | j ƒ  |  j	 ƒ  d  S(   Ni   t   w(
   t   ost   umaskR)   R   t   writeR*   t   dumpsR   R+   R   (   R
   t   omaskR0   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyR+   »   s    
N(   t   __name__t
   __module__t   __doc__R   R   R   R   R   R   R   R   R   R   R    R!   R#   R$   R'   R(   R	   R+   (    (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyR   .   s$   
	
											
				t   HyperDatabasec           B   s­   e  Z e j j Z d  „  Z d „  Z d „  Z d „  Z	 d d d d „ Z d „  Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s=   i  |  _  d  |  _ | |  _ t j j | ƒ |  _ i  |  _ d  S(   N(	   t   _HyperDatabase__cacheR   t"   _HyperDatabase__currentOpenArchivet   _mlistR3   R   t
   expandusert   basedirt   changed(   R
   R@   t   mlist(    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyR   Î   s
    			c         C   sf   |  j  | ƒ d } y; |  j j ƒ  \ } } t j t j t | d ƒ ƒ ƒ } Wn t k
 ra n X| S(   NR   i    (   t   _HyperDatabase__openIndicest	   dateIndexR   t   timet   asctimet	   localtimet   floatR   (   R
   t   archivet   datet   datekeyt   msgid(    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt	   firstdateÖ   s    &c         C   sf   |  j  | ƒ d } y; |  j j ƒ  \ } } t j t j t | d ƒ ƒ ƒ } Wn t k
 ra n X| S(   NR   i    (   RC   RD   R   RE   RF   RG   RH   R   (   R
   RI   RJ   RK   RL   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   lastdateà   s    &c         C   s   |  j  | ƒ t |  j ƒ S(   N(   RC   R   RD   (   R
   RI   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   numArticlesê   s    c         C   s*   |  j  | ƒ |  j | | | | | ƒ d  S(   N(   RC   t    _HyperDatabase__super_addArticle(   R
   RI   t   articlet   subjectt   authorRJ   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt
   addArticleî   s    c         C   sð   |  j  | k r d  S|  j ƒ  t j j |  j d ƒ } t j d ƒ } zF y t j | d ƒ Wn+ t k
 rˆ } | j	 t	 j
 k r‰ ‚  q‰ n XWd  t j | ƒ XxE d D]= } t t j j | | d	 | ƒ ƒ } t |  | d
 | ƒ q¢ W| |  _  d  S(   Nt   databasei    iø  RJ   RS   RR   RQ   t   threadt   -t   Index(   RJ   RS   RR   RQ   RV   (   R=   t   _HyperDatabase__closeIndicesR3   R   t   joinR@   R4   t   mkdirt   OSErrorR-   t   EEXISTR   t   setattr(   R
   RI   t   arcdirR7   R1   t   it   t(    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   __openIndicesó   s     
 #c         C   s¦   x– d D]Ž } | d } t  |  | ƒ r t |  | ƒ } | d k r{ t  |  d ƒ s\ i  |  _ n  t | ƒ } | |  j |  j <n  | j ƒ  t |  | ƒ q q Wd  |  _ d  S(	   NRJ   RS   RR   RV   RQ   RX   t   archive_length(   RJ   RS   RR   RV   RQ   (   t   hasattrt   getattrRc   R   R=   R+   t   delattrR   (   R
   R`   t   attrR   t   l(    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   __closeIndices  s    

c         C   s   |  j  ƒ  d  S(   N(   RY   (   R
   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyR+     s    c         C   s   |  j  | ƒ |  j j | ƒ S(   N(   RC   t   articleIndexR!   (   R
   RI   RL   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt
   hasArticle  s    c         C   s   |  j  | ƒ | |  j | <d  S(   N(   RC   t   threadIndex(   R
   RI   R   RL   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   setThreadKey  s    c         C   sj   |  j  | ƒ |  j j | ƒ sY |  j | } t j | ƒ } |  j | <| j |  j ƒ n |  j | } | S(   N(   RC   R<   R!   Rj   t   picklet   loadst   setListIfUnsetR>   (   R
   RI   RL   t   bufRQ   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt
   getArticle  s    c         C   sS   |  j  | ƒ t |  | d ƒ } y | j ƒ  \ } } | SWn t k
 rN d  SXd  S(   NRX   (   RC   Re   R   R   R   (   R
   RI   R   R   RL   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyR   *  s    c         C   sS   |  j  | ƒ t |  | d ƒ } y | j ƒ  \ } } | SWn t k
 rN d  SXd  S(   NRX   (   RC   Re   R    R   R   (   R
   RI   R   R   RL   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyR    3  s    c         C   s   |  j  | ƒ | j ƒ  } yM |  j j | ƒ |  j j ƒ  \ } } | d  \ } } | | k ra d  S| SWn t k
 rz d  SXd  S(   Ni   (   RC   t   lowert   subjectIndexR#   R    R   R   (   R
   RI   RR   R   t   tempidt   subject2RJ   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   getOldestArticle<  s     c         C   s   d  S(   N(    (   R
   RI   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt
   newArchiveH  s    c         C   s·   |  j  | ƒ t |  j d ƒ r0 |  j j ƒ  d  Sd } y |  j j ƒ  \ } } Wn t k
 rh d } n XxG | s² |  j | =y |  j j ƒ  \ } } Wql t k
 r® d } ql Xql Wd  S(   NR   i    i   (   RC   Rd   Rl   R   R   R   R    (   R
   RI   R   t   finishedR   RL   (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt
   clearIndexK  s     
	
 N(   R8   R9   t	   pipermailt   DatabaseRT   RP   R   RM   RN   RO   R   RC   RY   R+   Rk   Rm   Rr   R   R    Rw   Rx   Rz   (    (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyR;   Ë   s$   		
	
													(    (   R3   R*   RE   R-   R{   t   MailmanR    t	   CACHESIZEt   cPickleRn   t   ImportErrorR   R|   R;   (    (    (    s=   /export/web/mailman/mailman/Mailman/Archiver/HyperDatabase.pyt   <module>   s   	
