o
    ѷ6i                     @  s   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ G dd dZG dd dZdS )    )annotations)OrderedDict)TracebackType)connections)CursorWrapper)Model)TransactionManagementError)atomic)DEFAULT_DB_ALIAS)TimeoutErrorc                   @  s   e Zd Z	d-d.ddZed/ddZed/ddZd0ddZd1ddZd2ddZ	d1dd Z
d3d!d"Zd4d$d%Zd5d'd(Zeefd6d+d,ZdS )7Lock      $@Nnamestracquire_timeoutfloatusing
str | NonereturnNonec                 C  s0   || _ |d u rt| _n|| _| | j|| _d S N)r   r
   db	make_namer   )selfr   r   r    r   W/var/www/hoanhtaovolam_webdjango/env/lib/python3.10/site-packages/django_mysql/locks.py__init__   s
   zLock.__init__r   c                 C  s   d t| jd |fS )N.NAME)joinr   settings_dict)clsr   r   r   r   r   r      s   zLock.make_namec                 C  s"   t | jd }|t|d d  S )Nr      )r   r    len)r!   r   r   db_namer   r   r   unmake_name#   s   zLock.unmake_namer   c                 C  s   t | j  S r   )r   r   cursorr   r   r   r   
get_cursor)   s   zLock.get_cursorc                 C  s   |   S r   acquirer'   r   r   r   	__enter__,   s   zLock.__enter__exc_typetype[BaseException] | None	exc_valueBaseException | Noneexc_tracebackTracebackType | Nonec                 C     |    d S r   releaser   r,   r.   r0   r   r   r   __exit__/   s   zLock.__exit__c                 C  sj   |   '}|d| j| jf | d }|dkr"| W  d    S td| j d1 s.w   Y  d S )NzSELECT GET_LOCK(%s, %s)r   r"   zWaited >z seconds to gain lock)r(   executer   r   fetchoner   r   r&   resultr   r   r   r*   7   s   
zLock.acquirec                 C  sb   |   #}|d| jf | d }|d u s|dkrtdW d    d S 1 s*w   Y  d S )NzSELECT RELEASE_LOCK(%s)r   z Tried to release an unheld lock.)r(   r7   r   r8   
ValueErrorr9   r   r   r   r4   B   s   
"zLock.releaseboolc                 C  s   |   d uS r   )holding_connection_idr'   r   r   r   is_heldJ      zLock.is_held
int | Nonec                 C  sH   |   }|d| jf | d W  d    S 1 sw   Y  d S )NzSELECT IS_USED_LOCK(%s)r   )r(   r7   r   r8   )r   r&   r   r   r   r=   M   s   

$zLock.holding_connection_idprefixdict[str, int]c                   sf     |}t  }|d|d f  fdd| D W  d    S 1 s,w   Y  d S )NzSELECT TABLE_SCHEMA, THREAD_ID
                   FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO
                   WHERE TABLE_SCHEMA LIKE %s AND
                         LOCK_TYPE = 'User Lock'%c                   s"   i | ]}  |d  |d qS )r   r"   )r%   ).0rowr!   r   r   r   
<dictcomp>b   s   " z)Lock.held_with_prefix.<locals>.<dictcomp>)r   r   r&   r7   fetchall)r!   rA   r   r&   r   rF   r   held_with_prefixR   s   $zLock.held_with_prefix)r   N)r   r   r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   )r   r   r,   r-   r.   r/   r0   r1   r   r   r   r   )r   r<   )r   r@   )rA   r   r   r   r   rB   )__name__
__module____qualname__r   classmethodr   r%   r(   r+   r6   r*   r4   r>   r=   r
   rI   r   r   r   r   r      s"    






r   c                   @  sX   e Zd Z			ddd	d
ZdddZd ddZd!ddZd ddZ			dd!ddZdS )"	TableLockNreadlist[str | type[Model]] | Nonewriter   r   r   r   c                 C  s4   |  || _|  || _|d u rt| _d S || _d S r   )_process_namesrQ   rS   r
   r   )r   rQ   rS   r   r   r   r   r   f   s   zTableLock.__init__names	list[str]c                 C  s   |du rg S t  }t|r?|d}t|tr7|jjr#td|j d||jj	< |jj
r6||jj
  nd||< t|st| S )z
        Convert a list of models/table names into a list of table names. Deals
        with cases of model inheritance, etc.
        Nr   zCan't lock abstract model T)r   r#   pop
isinstancetype_metaabstractr;   rL   db_tableparentsextendkeyslist)r   rU   table_namesr   r   r   r   rT   p   s   

zTableLock._process_namesc                 C  r2   r   r)   r'   r   r   r   r+      r?   zTableLock.__enter__r,   r-   r.   r/   r0   r1   c                 C  s   |  ||| d S r   r3   r5   r   r   r   r6      s   zTableLock.__exit__c                   s   t | j }|jj | B}| stdt| jd| _| j	   fdd| j
D }| jD ]}| | d q/|dd| W d    d S 1 sRw   Y  d S )NzJInnoDB requires that we not be in a transaction when gaining a table lock.)r   c                   s   g | ]	} | d qS )z READr   )rD   r   qnr   r   
<listcomp>   s    z%TableLock.acquire.<locals>.<listcomp>z WRITEzLOCK TABLES {}z, )r   r   ops
quote_namer&   get_autocommitr   r	   _atomicr+   rQ   rS   appendr7   formatr   )r   
connectionr&   locksr   r   rb   r   r*      s   



"zTableLock.acquirec                 C  sX   t | j }| }| j||| d | _|d W d    d S 1 s%w   Y  d S )NzUNLOCK TABLES)r   r   r&   rh   r6   r7   )r   r,   r.   r0   rk   r&   r   r   r   r4      s   

"zTableLock.release)NNN)rQ   rR   rS   rR   r   r   r   r   )rU   rR   r   rV   rK   rJ   )	rL   rM   rN   r   rT   r+   r6   r*   r4   r   r   r   r   rP   e   s    




rP   N)
__future__r   collectionsr   typesr   	django.dbr   django.db.backends.utilsr   django.db.modelsr   django.db.transactionr   r	   django.db.utilsr
   django_mysql.exceptionsr   r   rP   r   r   r   r   <module>   s    U