
    e&                     B    d dl mZ d dlZd dlZddlmZ  G d de      Zy)    )exc_infoN   )
BaseFolderc                        e Zd ZdZdZdZ f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d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 xZ S ) LocalStatusFolderz5LocalStatus backend implemented as a plain text file.   z>OFFLINEIMAP LocalStatus CACHE DATA - DO NOT MODIFY - FORMAT %dc                 V   d| _         t        t        |   ||       |j                  | _        t
        j                  j                  | j                         | j                               | _
        t        j                         | _        | j                  j                  ddd      | _        y )N.generalfsyncF)sepsuperr   __init__rootospathjoingetrootgetfolderbasenamefilename	threadingLocksavelockconfiggetdefaultboolean
doautosave)selfname
repository	__class__s      9/usr/share/offlineimap3/offlineimap/folder/LocalStatus.pyr   zLocalStatusFolder.__init__   sw    /jAOO	T\\^T5K5K5MN!(++77w'    c                      y)Nr    r   s    r!   storesmessagesz LocalStatusFolder.storesmessages)   s    r"   c                 V    t         j                  j                  | j                         S N)r   r   existsr   r%   s    r!   isnewfolderzLocalStatusFolder.isnewfolder,   s    77>>$--000r"   c                     | j                   S r(   )r   r%   s    r!   getfullnamezLocalStatusFolder.getfullname0   s    }}r"   c                 2    |t               t               dddS )Nr   )uidflagslabelstimemtime)setr   r.   s     r!   msglist_item_initializerz*LocalStatusFolder.msglist_item_initializer4   s    SUceQQRSSr"   c                    |D ]m  }|j                         }	 |j                  d      \  }}t        |      }t        |      }| j                  |      | j                  |<   || j                  |   d<   o y# t        $ rF d|d| j
                  d}| j                  j                  |       t	        |t               d         w xY w)zRead status folder in format version 1.

        Arguments:
        - fp: I/O object that points to the opened database file.
        :Corrupt line '' in cache file ''r   r/   N)stripsplitintr3   
ValueErrorr   uiwarnr   r5   messagelist)r   fpliner.   r/   errstrs         r!   readstatus_v1zLocalStatusFolder.readstatus_v17   s      	3D::<D8!ZZ_
U#hE
 %)$A$A#$FDS!-2DS!'*	3  80V$ A77	8s   *A44ACc           
         |D ]  }|j                         }	 |j                  d      \  }}}}t        |      }t        |      }t        |      }t        |j                  d      D cg c]/  }t	        |j                               dkD  s |j                         1 c}      }| j                  |      | j                  |<   || j                  |   d<   || j                  |   d	<   || j                  |   d
<    yc c}w # t
        $ rF d|d| j                  d}| j                  j                  |       t        |t               d         w xY w)zRead status file in the current format.

        Arguments:
        - fp: I/O object that points to the opened database file.
        |,r   r8   r9   r:   r   r/   r2   r0   N)r;   r<   r=   r3   lenr>   r   r?   r@   r   r5   rA   )	r   rB   rC   r.   r/   r2   r0   lbrD   s	            r!   
readstatuszLocalStatusFolder.readstatusL   s.     	5D::<D
8,0JJsO)UE6#hE
E
6<<3D\RBHHJZ[H[bhhj\] %)$A$A#$FDS!-2DS!'*-2DS!'*.4DS!(+!	5 ] 8/V$ A77	8s%   AC=&!C8
C8
C=8C==AEc                    | j                         r| j                          y t        d| j                  dz         D ]  }| j                          t	        | j
                  d      }|j                         j                         }|| j                  | j                  z  k(  r n|| j                  dz  k(  r]| j                  j                  d| j                  d|        | j                  |       |j                          | j                          d| j
                  z  }| j                  j                  |       t!        |       s;d| j
                  z  }| j                  j                  |       j                          y || j                  | j                  z  k(  sJ | j#                         |j                          y )Nr   rtz<Upgrading LocalStatus cache from version 1 to version 2 for r7   z$Unrecognized cache magicline in '%s'zCache file '%s' is empty.)r*   dropmessagelistcacherangecur_versionopenr   readliner;   	magicliner?   _msgr   rE   closesaver@   r>   rK   )r   icachefdrC   rD   s        r!   cachemessagelistz"LocalStatusFolder.cachemessagelistf   sq   %%' q$**Q./ 	)A%%'4==$/G##%++-D )9)99: $..1,-9=$P Q""7+		 @$--OV$ ((;	)>  14==@FGGLL MMO$*:*::;<; r"   c                      y r(   r$   r%   s    r!   	openfileszLocalStatusFolder.openfiles       r"   c                      y r(   r$   r%   s    r!   
closefileszLocalStatusFolder.closefiles   r\   r"   c                     	 t        j                  | j                         y# t        $ r6}| j                  j                  dd| j                  d|       Y d}~yd}~ww xY w)z!Remove any pre-existing database. zcould not remove file z: N)r   unlinkr   OSErrorr?   debug)r   es     r!   purgezLocalStatusFolder.purge   sL    	.IIdmm$ 	.GGMM"==!- . .	.s   " 	A!,AA!c                 $    | j                          y)zFSave changed data to disk. For this backend it is the same as saveall.N)saveallr%   s    r!   rV   zLocalStatusFolder.save   s     	r"   c           	         | j                   5  t        | j                  dz   d      }|j                  | j                  | j
                  z  dz          t        | j                  j                               D ]Z  }dj                  t        |d               }dj                  t        |d               }|j                  d|d	   ||d
   |fz         \ |j                          | j                  r#t        j                  |j                                |j!                          t        j"                  | j                  dz   | j                         | j                  rut        j                  t        j$                  j'                  | j                        t        j(                        }t        j                  |       t        j                   |       ddd       y# 1 sw Y   yxY w)z%Saves the entire messagelist to disk.z.tmpwt
r`   r/   z, r0   z%s|%s|%d|%s
r.   r2   N)r   rQ   r   writerS   rP   listrA   valuesr   sortedflushr   r   r   filenorU   renamer   dirnameO_RDONLY)r   rX   msgr/   r0   fds         r!   rg   zLocalStatusFolder.saveall   sV    ]] 	4==6148GMM4>>D,<,<<DED,,3356 [s7| 456#h-#89oUUCLRX0YYZ[ MMO)*MMOIIdmmf,dmm<WWRWW__T]];R[[I!	 	 	s   GGG!c                 b   |
t               }|dk  r|S | j                  |      r| j                  ||       |S | j                  |      | j                  |<   || j                  |   d<   || j                  |   d<   || j                  |   d<   || j                  |   d<   | j                          |S )zWrites a new message, with the specified uid.

        See folder/Base for detail. Note that savemessage() does not
        check against dryrun settings, so you need to ensure that
        savemessage is never called in a dryrun mode.r   r/   r1   r2   r0   )r3   	uidexistssavemessageflagsr5   rA   rV   )r   r.   rt   r/   rtimer2   r0   s          r!   savemessagezLocalStatusFolder.savemessage   s     >UF7J>>#!!#u-J $ = =c B).g&(-f%).g&*0h'		
r"   c                 &    | j                   |   d   S Nr/   rA   r4   s     r!   getmessageflagsz!LocalStatusFolder.getmessageflags       $W--r"   c                 &    | j                   |   d   S )Nr1   r}   r4   s     r!   getmessagetimez LocalStatusFolder.getmessagetime   s    $V,,r"   c                 H    || j                   |   d<   | j                          y r|   rA   rV   )r   r.   r/   s      r!   rx   z"LocalStatusFolder.savemessageflags   s     ).g&		r"   c                 p    || j                   |   d<   |r|| j                   |   d<   | j                          y )Nr0   r2   r   )r   r.   r0   r2   s       r!   savemessagelabelsz#LocalStatusFolder.savemessagelabels   s8    *0h'-2DS!'*		r"   c                     t        |j                               D ]  \  }}|| j                  |   d<    | j                          y)z>Saves labels from a dictionary in a single database operation.r0   Nrl   itemsrA   rV   )r   r0   r.   rJ   s       r!   savemessageslabelsbulkz(LocalStatusFolder.savemessageslabelsbulk   s@     FLLN+ 	1GC.0DS!(+	1		r"   c                 |    |D ]'  }| j                   |   d   |z  | j                   |   d<   ) | j                          y Nr0   r   r   uidsr0   r.   s       r!   addmessageslabelsz#LocalStatusFolder.addmessageslabels   G     	WC.2.>.>s.CH.MPV.VDS!(+	W		r"   c                 |    |D ]'  }| j                   |   d   |z
  | j                   |   d<   ) | j                          y r   r   r   s       r!   deletemessageslabelsz&LocalStatusFolder.deletemessageslabels   r   r"   c                 &    | j                   |   d   S r   r}   r4   s     r!   getmessagelabelsz"LocalStatusFolder.getmessagelabels   s    $X..r"   c                     t        |j                               D ]  \  }}|| j                  |   d<    | j                          y)zGSaves mtimes from the mtimes dictionary in a single database operation.r2   Nr   )r   mtimesr.   mts       r!   savemessagesmtimebulkz'LocalStatusFolder.savemessagesmtimebulk  s@     FLLN+ 	0GC-/DS!'*	0		r"   c                 &    | j                   |   d   S )Nr2   r}   r4   s     r!   getmessagemtimez!LocalStatusFolder.getmessagemtime	  r   r"   c                 (    | j                  |g       y r(   )deletemessagesr4   s     r!   deletemessagezLocalStatusFolder.deletemessage  s    SE"r"   c                     |D cg c]  }|| j                   v s| }}t        |      sy |D ]  }| j                   |=  | j                          y c c}w r(   )rA   rI   rV   )r   uidlistr.   s      r!   r   z LocalStatusFolder.deletemessages  sX    ")E3SD4D4D-D3EE7| 	(C!!#&	(		 Fs
   AA)r   Nr(   )!__name__
__module____qualname____doc__rP   rS   r   r&   r*   r,   r5   rE   rK   rY   r[   r^   re   rV   rg   rz   r~   r   rx   r   r   r   r   r   r   r   r   r   __classcell__)r    s   @r!   r   r      s    ?KPI'1T3*54/b.
,6.-

/.#r"   r   )sysr   r   r   Baser   r   r$   r"   r!   <module>r      s!   $  	  A
 Ar"   