U
    (Q^Õ  ã                   @   sê   d Z 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 ddlm	Z	 dZ
ejdkrÜzZddlZdZdZejjjZd	d
„ ZejjjZejjjZejjjZejjjZdZ
dd„ ZW n$ ek
rÐ   dd
„ Zdd„ ZY nX dd„ Zn
ejZdZ
dS )am  
    werkzeug.posixemulation
    ~~~~~~~~~~~~~~~~~~~~~~~

    Provides a POSIX emulation for some features that are relevant to
    web applications.  The main purpose is to simplify support for
    systems such as Windows NT that are not 100% POSIX compatible.

    Currently this only implements a :func:`rename` function that
    follows POSIX semantics.  Eg: if the target file already exists it
    will be replaced without asking.

    This module was introduced in 0.6.1 and is not a public interface.
    It might become one in later versions of Werkzeug.

    :copyright: 2007 Pallets
    :license: BSD-3-Clause
é    Né   )Ú
to_unicode)Úget_filesystem_encodingFÚnté   c                 C   sf   t | tƒ ƒ} t |tƒ ƒ}t| |ƒr&dS d}d}|sb|dk rbt| |ttB ƒ}|s.t d¡ |d7 }q.|S )NTr   Féd   çü©ñÒMbP?r   )r   r   Ú_rename_atomicÚ_MoveFileExÚ_MOVEFILE_REPLACE_EXISTINGÚ_MOVEFILE_WRITE_THROUGHÚtimeÚsleep)ÚsrcÚdstÚretryÚrv© r   ú=/tmp/pip-install-bd4o36v9/Werkzeug/werkzeug/posixemulation.pyÚ_rename'   s     
  ÿ

r   Tc                 C   s†   t d ddddddƒ}|dkr dS zVd}d}|sp|dk rpt| |d d ttB |ƒ}|r\t|ƒ}qpq*t d¡ |d7 }q*|W ¢S t|ƒ X d S )	Nr   iè  zWerkzeug renameéÿÿÿÿFr   r   r   )Ú_CreateTransactionÚ_CloseHandleÚ_MoveFileTransactedr   r   Ú_CommitTransactionr   r   )r   r   Útar   r   r   r   r   r	   >   s,    ú

r	   c                 C   s   dS ©NFr   ©r   r   r   r   r   r   Z   s    c                 C   s   dS r   r   r   r   r   r   r	   ]   s    c                 C   s¦   t | |ƒrd S zt | |¡ W n‚ tk
r  } zd|jtjkr>‚ d|t dtj	¡f }t ||¡ t | |¡ zt 
|¡ W n tk
rŽ   Y nX W 5 d }~X Y nX d S )Nz%s-%08xr   )r   ÚosÚrenameÚOSErrorÚerrnoÚEEXISTÚrandomÚrandintÚsysÚmaxsizeÚunlinkÚ	Exception)r   r   ÚeÚoldr   r   r   r   `   s    
r   ) Ú__doc__r!   r   r#   r%   r   Ú_compatr   Ú
filesystemr   Zcan_rename_open_fileÚnameÚctypesr   r   ÚwindllÚkernel32ZMoveFileExWr
   r   Zktmw32ZCreateTransactionr   ZCommitTransactionr   ZMoveFileTransactedWr   ZCloseHandler   r	   r(   r   r   r   r   r   Ú<module>   s6   






