B
    Kkd‚  ã               @   sr   d dl mZmZ d dlZd dlZye W n ek
r@   eZY nX ddlm	Z	m
Z
mZmZmZ G dd„ de	ƒZdS )é    )Úabsolute_importÚdivisionNé   )ÚLockBaseÚ	NotLockedÚ	NotMyLockÚLockTimeoutÚAlreadyLockedc               @   sP   e Zd ZdZdZddd„Zddd„Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚSQLiteLockFilezDemonstrate SQL-based locking.NTc       
      C   sÐ   t  | |||¡ t| jƒ| _t| jƒ| _tjdkrdddl}| ¡ \}}t	 
|¡ t	 |¡ ~~|t_ddl}| tj¡| _| j ¡ }y| d¡ W n |jk
r¨   Y n$X | j ¡  ddl}	|	 t	jtj¡ dS )zu
        >>> lock = SQLiteLockFile('somefile')
        >>> lock = SQLiteLockFile('somefile', threaded=False)
        Nr   zGcreate table locks(   lock_file varchar(32),   unique_name varchar(32)))r   Ú__init__ÚunicodeÚ	lock_fileÚunique_namer
   ÚtestdbÚtempfileÚmkstempÚosÚcloseÚunlinkÚsqlite3ÚconnectÚ
connectionÚcursorÚexecuteZOperationalErrorÚcommitÚatexitÚregister)
ÚselfÚpathÚthreadedÚtimeoutr   Z_fdr   r   Úcr   © r"   úD/tmp/pip-install-gxxfd9b7/pip/pip/_vendor/lockfile/sqlitelockfile.pyr      s(    




zSQLiteLockFile.__init__c             C   sH  |d k	r|n| j }t ¡ }|d k	r2|dkr2||7 }|d kr@d}n|dkrNd}n|d }| j ¡ }xâ|  ¡ sÎ| d| j| jf¡ | j ¡  | d| jf¡ | 	¡ }t
|ƒdkrÈ| d| jf¡ | j ¡  qöd S n(| d| jf¡ | 	¡ }t
|ƒdkröd S |d k	r6t ¡ |kr6|dkr(td| j ƒ‚ntd	| j ƒ‚t |¡ qbW d S )
Nr   gš™™™™™¹?é
   z;insert into locks  (lock_file, unique_name)  values  (?, ?)z*select * from locks  where unique_name = ?r   z(delete from locks  where unique_name = ?z&Timeout waiting to acquire lock for %sz%s is already locked)r    Útimer   r   Ú	is_lockedr   r   r   r   ÚfetchallÚlenr   r   r	   Úsleep)r   r    Úend_timeÚwaitr   Úrowsr"   r"   r#   Úacquire5   sD    





zSQLiteLockFile.acquirec             C   s\   |   ¡ std| j ƒ‚|  ¡ s4td| j|  ¡ f ƒ‚| j ¡ }| 	d| jf¡ | j 
¡  d S )Nz%s is not lockedz#%s is locked, but not by me (by %s)z(delete from locks  where unique_name = ?)r&   r   r   Úi_am_lockingr   r   Ú_who_is_lockingr   r   r   r   )r   r   r"   r"   r#   Úreleaset   s    

zSQLiteLockFile.releasec             C   s&   | j  ¡ }| d| jf¡ | ¡ d S )Nz2select unique_name from locks  where lock_file = ?r   )r   r   r   r   Zfetchone)r   r   r"   r"   r#   r/   €   s    

zSQLiteLockFile._who_is_lockingc             C   s*   | j  ¡ }| d| jf¡ | ¡ }|  S )Nz(select * from locks  where lock_file = ?)r   r   r   r   r'   )r   r   r,   r"   r"   r#   r&   ‡   s
    

zSQLiteLockFile.is_lockedc             C   s*   | j  ¡ }| d| j| jf¡ | ¡   S )Nz?select * from locks  where lock_file = ?    and unique_name = ?)r   r   r   r   r   r'   )r   r   r"   r"   r#   r.      s    
zSQLiteLockFile.i_am_lockingc             C   s(   | j  ¡ }| d| jf¡ | j  ¡  d S )Nz&delete from locks  where lock_file = ?)r   r   r   r   r   )r   r   r"   r"   r#   Ú
break_lock—   s    

zSQLiteLockFile.break_lock)TN)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r-   r0   r/   r&   r.   r1   r"   r"   r"   r#   r
      s   
"
?r
   )Ú
__future__r   r   r%   r   r   Ú	NameErrorÚstrÚ r   r   r   r   r	   r
   r"   r"   r"   r#   Ú<module>   s   
