B
    bO$                 @   sz   d Z ddlZddlZddlZddlZddlmZ dZdadd Z	dZ
dZG d	d
 d
ZdddZdd Zedkrve  dS )zb
dblite.py module contributed by Ralf W. Grosse-Kunstleve.
Extended for Unicode by Steven Knight.
    N)PICKLE_PROTOCOLFc             C   s   t d|  dS )zLocal warning for corrupt db.

    Used for self-tests. SCons overwrites this with a
    different warning function in SConsign.py.
    z%Warning: Discarding corrupt database:N)print)filename r   +lib/python3.7/site-packages/SCons/dblite.pycorruption_warning(   s    r   z.dblitez.tmpc               @   s   e Zd ZdZeZeejZ	e
Zy
ejZW n ek
r@   dZY nX ejZejZejZejZdd Zdd Zdd Zd	d
 Zdd Zdd Zdd Zdd Z dd Z!dd Z"dd Z#dS )dblitea  
    Squirrel away references to the functions in various modules
    that we'll use when our __del__() method calls our sync() method
    during shutdown.  We might get destroyed when Python is in the midst
    of tearing down the different modules we import in an essentially
    arbitrary order, and some of the various modules's global attributes
    may already be wiped out from under us.

    See the discussion at:
      http://mail.python.org/pipermail/python-bugs-list/2003-March/016877.html

    Nc       
      C   s  |dkst |d krd}tj|\}}|tkrB|| _|t | _n|t | _|t | _|| _|| _	i | _
d| _| jd k	rt dkst dkry t| j}|j| _|j| _W q tk
r   ttjdd| _ttjdd| _Y qX nd| _d| _| jdkr(| | jd	| j	 W d Q R X ny| | jd
}W nR tk
r } z2| jdkr^|| | jd	| j	 W d Q R X W d d }~X Y nhX | }	|  t|	dkrytj|	dd| _
W n2 tjt t!fk
r   t"rt#| j n Y nX d S )N)Nrwcnr	   Fr   ZSUDO_UIDZSUDO_GIDr   wbrbr   bytes)encoding)$AssertionErrorospathsplitextDBLITE_SUFFIX
_file_name
TMP_SUFFIX	_tmp_name_flag_mode_dict_needs_sync	_os_chowngeteuidgetuidstatst_uid	_chown_tost_gid	_chgrp_toOSErrorintenvironget_openIOErrorreadcloselenpickleloadsUnpicklingErrorEOFErrorKeyErrorIGNORE_CORRUPT_DBFILESr   )
selfZfile_base_nameflagmodebaseZextZstatinfofepr   r   r   __init__O   sT    

"zdblite.__init__c             C   s   | j r|   d S )N)r   sync)r5   r   r   r   r-      s    zdblite.closec             C   s   |    d S )N)r-   )r5   r   r   r   __del__   s    zdblite.__del__c             C   s  |    | | jd| j}| | j|| j W d Q R X y| | j| j W nL t	k
r   y| 
| jd W n t	k
r   Y nX | | j| j Y nX | jd k	r| jdkry| | j| j| j W n tk
r   Y nX d| _tr| | j| jd tt|    d S )Nr   i  r   F_)_check_writabler*   r   r   _pickle_dumpr   _pickle_protocol_os_replacer   PermissionError	_os_chmodr   r#   r%   r&   r   KEEP_ALL_FILES_shutil_copyfilestrr'   
_time_time)r5   r9   r   r   r   r=      s*    zdblite.syncc             C   s   | j dkrtd| j d S )Nr	   zRead-only database: %s)r   r+   r   )r5   r   r   r   r@      s    
zdblite._check_writablec             C   s
   | j | S )N)r   )r5   keyr   r   r   __getitem__   s    zdblite.__getitem__c             C   sX   |    t|ts&td|t|f t|tsDtd|t|f || j|< d| _d S )Nz#key `%s' must be a string but is %sz$value `%s' must be a bytes but is %sT)r@   
isinstancerH   	TypeErrortyper   r   r   )r5   rJ   valuer   r   r   __setitem__   s    


zdblite.__setitem__c             C   s   t | j S )N)listr   keys)r5   r   r   r   rR      s    zdblite.keysc             C   s
   || j kS )N)r   )r5   rJ   r   r   r   __contains__   s    zdblite.__contains__c             C   s
   t | jS )N)iterr   )r5   r   r   r   __iter__   s    zdblite.__iter__c             C   s
   t | jS )N)r.   r   )r5   r   r   r   __len__   s    zdblite.__len__)$__name__
__module____qualname____doc__openr*   staticmethodr/   dumprA   r   rB   r   chownr   AttributeErrorreplacerC   chmodrE   shutilZcopyfilerG   timerI   r<   r-   r>   r=   r@   rK   rP   rR   rS   rU   rV   r   r   r   r   r   4   s.   


< r     c             C   s   t | ||S )N)r   )filer6   r7   r   r   r   r[      s    r[   c           
   C   s,  t dd} t| dkstd| d< | d dks2t|   t dd} t| dks\tt| | d dksltd| d	< | d	 dkst|   t dd
} t| dkstt| | d dkst| d	 dksty|   W n4 tk
r } zt|dkstW d d }~X Y n
X tdt dd} t| dks<tt| d| d< |   yd| d< W n> tk
r } zt|dkstt|W d d }~X Y n
X tdyddg| d< W n> tk
r } zt|dkstt|W d d }~X Y n
X tdt dd
} t| dkstt| t dd} t| dks@tt| t	dd t dd
} t	dd
d yt dd
} W n tjk
r   Y n
X tddat dd
} t| dkstt| td yt dd} W n> tk
r } zt|dkstt|W d d }~X Y n
X tdtd d S )NZtmpr   r   s   barZfoor      s   fooZbarr	      zRead-only database: tmp.dblitezIOError expected.r
   s   pongZpingtuple)rf   rg   z4key `(1, 2)' must be a string but is <class 'tuple'>zTypeError exception expectedrQ   z4value `[1, 2]' must be a bytes but is <class 'list'>   z
tmp.dblitexzpickle exception expected.Tz1[Errno 2] No such file or directory: 'tmp.dblite'zCompleted _exercise())r[   r.   r   r=   r+   rH   RuntimeErrorrM   r   r*   writer/   r1   r4   r   unlinkr   )Zdbr:   r   r   r   	_exercise   sp    


"
,,




,rn   __main__)Nrd   )rZ   r   r/   rb   rc   ZSCons.compatr   rF   r4   r   r   r   r   r[   rn   rW   r   r   r   r   <module>   s     
J